人の骨格を推定して棒人間を表示するという「OpenPose」という仕組みがあります。
OpenPose試してみた。〜ディープラニングで人のポーズを解析

ごらんの通り、人の姿勢まで把握できるとあって、一時期話題になりました。
が、このOpenPoseの会社での利用には問題がありまして。
企業などで利用する際は、年280万円ほど払わなくてはならない、商用のスポーツへの活用は禁止…などの制約があります。
特にお金の話は、何に使えるかどうかわからない状態ではちょっと高過ぎです。というわけで、この手の仕組みを活用できずにいたのですが。
いつの間にか、Googleが「PoseNet」というのを公開しておりました。
tfjs-models/posenet at master · tensorflow/tfjs-models · GitHub

OpenPose同様、人の関節や目、鼻、耳を推論するという仕組みですが、こちらはApacheライセンス 2.0に準拠、つまり、商用利用も可のオープンソースな仕組み。
上のリンクからスマホで「Try the demo here!」をタッチすると、スマホのカメラを使って上のような骨格映像を表示させることができます。
まあ、それはそれで面白いのですが、やはり実用で使おうと思ったら、Python版が欲しいところ。
ありました。Python + TensorFlow版が。
GitHub - rwightman/posenet-python: A Python port of Google TensorFlow.js PoseNet (Real-time Human Pose Estimation)
こちらから、Python用のコードが入手できます。
上のコードは、TensorFlow 1.12で動作させているようです。が、我が家のTensorFlow 1.8.0でも動きました(あれ、うちのはそんな古いバージョンだったんだ……)。
が、注意が必要なのは、OpenCVです。
今どきは普通にpipでインストールすると、OpenCV 4.Xが入ってしまいますが、動きませんでした。
ということで、わざわざリンク先と同じ3.4.5.20を入れました。
> pip uninstall opencv-python
> pip install opencv-python==3.4.5.20
他にもpillowなどが必要です。
で、早速動かしました。
コードをゲットして展開し、コマンドライン上で
> python get_test_images.py
と打てば、サンプルの画像ファイルを入手できます。そのあとに、
> python image_demo.py
と打ち込めば、outputフォルダに結果が入ります。

こんな感じの画像が得られます。
「images」フォルダに独自の写真を入れても、同様に人の骨格画像が生成されます。
また、Webカメラの画像から骨格画像を得るには
> python webcam_demo.py
でカメラ画像から骨格を推論してくれます。
あるいは、
> python webcam_demo.py --file (動画ファイル名)
とすれば、カメラではなく動画から同様の処理をかけてくれます。
さて、このPoseNetを使うときは、当然人の動きを数値化したいという需要がある人が多いので、この骨格の座標を取り出したいと考えるのが当然です。
というわけで、その数値の取り方ですが。
image_demo.pyにせよ、webcam_demo.pyにせよ、
pose_scores, keypoint_scores, keypoint_coords = posenet.decode_multi.decode_multiple_poses( ~
という行があるはずです。
その中にある「keypoint_coords」が、各部位の骨格を示しています。
例えば、写っている人物の一人目の右手首の座標を知りたければ、
rtwrt = keypoint_coords[0,10,:]
という変数で取り込めば、rtwrt[1]がx座標、rtwrt[0]がy座標になってます(逆じゃないです。本当にこの順番です)。
[0,10,:]の”0”が「一人目」という意味で、”10”というのが右手首(rightWrist)という意味です。
全部で17か所あって、配列の0~16にはそれぞれ「nose」、「leftEye」、「rightEye」、「leftEar」、「rightEar」、「leftShoulder」、「rightShoulder」、「leftElbow」、「rightElbow」、「leftWrist」、「rightWrist」、「leftHip」、「rightHip」、「leftKnee」、「rightKnee」、「leftAnkle」、「rightAnkle」となってます(意味は大体わかりますよね?)。
なお座標値は、画像左上が原点で、y座標は下に行くほどプラスであることに注意してください。
これを使うと、例えばダンクシュートした際の手足、身体の動きや、作業の姿勢等を数値化することができるようになります。
アイデア次第で、いろいろとできそうです。
ということで、私も会社でいろいろとやってます。

最近のコメント