« 2年ぶり12回目のヴィレッジヴァンガード福袋購入! | トップページ | 簡単にSFなCGが作れるツール「とてかんCG」を使ってみた »

2021年1月 4日 (月)

高精度な手足、身体の姿勢推定API「MediaPipe」を使って体の姿勢を数値化させてみる

一年ほど前に紹介した「PoseNet」がありますが。


Googleの「PoseNet」を試してみた: EeePCの軌跡


あれがさらに高精度、高密度になった「MediaPipe」なるものが、いつの間にか登場してます。


少し前から気になってたんですが、休みに入り、ようやくそれを実験する機会を得ました。


で、参考にしたのは以下のサイト。


CPUだけで顔・手・ポーズのリアルタイム検出を行う | cedro-blog


ここで紹介されたコードで、一発で動きました。


やったことといえば、


(1) pipコマンドで「MediaPipe」をインストールする。


  > pip install mediapipe


  (ほかにも、numpy、OpenCV、PILLOWも必要です)


(2) Githubから、コードを一式ダウンロードしておく。


サイトはこちら:GitHub - cedro3/mediapipe: MediaPipeのPythonパッケージのサンプルです。2020/12/11時点でPython実装のある4機能(Hands、Pose、Face Mesh、Holistic)について用意しています。


(3) WebカメラのついたPCなら、そのままコマンドで実行。


  > python sample_face.py


  (コードは4種類で、「sample_face.py」「sample_hand.py」「sample_holistic.py」「sample_pose.py」から選択。大体、どれがどういうコードかは、名前からわかるかと思います。)


こんな感じの結果が出ます。


Mediapipe03


Mediapipe02


いやあ、なかなか高精度ですね。


これ、GPUを使ってないようですが、うちの環境(Ryzen 5 4600H 6コア)で20~30fpsは出ます。


さて、姿勢推定をさせたなら当然、各々の座標が抜き出したくなるものですが、上で入手したコードのうち、「sample_holistic.py」という、顔も手も身体もすべて出力させているコードを参考にします。


このコードの中の「landmark_x」「landmark_y」という配列があるんですが、これが座標情報だとわかります。


で、じーっとこのコードを解読すると、例えば191行目から始まる「draw_hands_landmarks()」という関数207行目あたりを見ると、この中ではどうやらlandmark_point.x[2]、landmark_point.y[2]が親指の座標なんだなぁと読めますね。[]野中の数字が0だと「手首1」、1だと「手首2」(右か左かは不明)、10だと「中指・第2関節」……という具合に、解読できそうです。


顔の座標を読み出したければ、299行目から始まる「draw_face_landmarks()」を見れば、目や鼻、口の座標を拾えそうです。


かなり地味で忍耐が必要な作業になりそうですが、このコードを流用すれば、姿勢の数値化はどうにかできそうです。


とまあ、かなりいい感じのMediaPipe。これでPoseNetとはおさらばか……と思いきや。


実は欠点が一つあります。それは、1体しか読みだせないということ。


PoseNetは10人まで同時に読み込めましたが、こちらは一番大きな人物のみ姿勢推定を行うことしかできません。


このため、複数の人の動きをトレースすることは不可能。あくまでも一人だけの詳細な動きを読み出すためのコードのようです。


ベテランの作業姿勢と新入社員の姿勢とを比べる、といったことくらいならできそうですね。


今すぐ試したい! 機械学習・深層学習(ディープラーニング) 画像認識プログラミングレシピ


« 2年ぶり12回目のヴィレッジヴァンガード福袋購入! | トップページ | 簡単にSFなCGが作れるツール「とてかんCG」を使ってみた »

数値解析系」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« 2年ぶり12回目のヴィレッジヴァンガード福袋購入! | トップページ | 簡単にSFなCGが作れるツール「とてかんCG」を使ってみた »