« iPhone/iPad向けの有線LANケーブル | トップページ | ついにデアゴスティーニからAI/IoT電子工作学習キットシリーズ発売へ! »

2020年1月22日 (水)

Googleの「PoseNet」を試してみた

人の骨格を推定して棒人間を表示するという「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フォルダに結果が入ります。

Skate_park

こんな感じの画像が得られます。

「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座標は下に行くほどプラスであることに注意してください。

これを使うと、例えばダンクシュートした際の手足、身体の動きや、作業の姿勢等を数値化することができるようになります。

アイデア次第で、いろいろとできそうです。

ということで、私も会社でいろいろとやってます。

簡単なDeep Learning

« iPhone/iPad向けの有線LANケーブル | トップページ | ついにデアゴスティーニからAI/IoT電子工作学習キットシリーズ発売へ! »

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

コメント

非常にわかりやすく解説いただきありがとうございます。
bounding boxを表示させたいなと思っているのですが、コードの中を探しても見つけられず...
なにか知っているところがあれば教えていただけると助かります。

> ぽめさん

いろいろコードを解読してみましたが、よく分かりませんでした……あくまでも、関節や目の位置推定結果を出すことが目的のコードなので、それ以外が見当たらず。というか、最近はあまり見てませんね。

スポーツや工場内で使いたいという声があるにはあるので、また解読を試みようとは思ってます。続報ありましたら、このブログにて。

分かりやすい説明ありがとうございます。
ですが数値の取り方がいまいち分かりません。
rtwrt = keypoint_coords[0,10,:]
はコードの中にどのように取り込んでいらっしゃるのですか?
色々試しましたが分かりませんでした。
お手数ですが、お教えいただけると幸いです。

> おる さん

返事遅れました。取り合えず、こちらがやったのは、

https://github.com/rwightman/posenet-python

の中にある「webcam_demo.py」のコードの50行目の「keypoint_cords = ~」の次の行に

rtwrt = keypoint_coords[0,10,:]

という行を入れてました。

で、ここで得られた座標と、動画の中に映った手すりとの距離を計算して、手すりを持っているかどうか?を判定させたプログラムを作ったことがあります。

あるいは、頑張って肩と腰の座標を取り出し、その高さ方向の差を計算してやれば、かがんだ姿勢の作業か否かが判定できて、以下の記事にあるようなことも可能ではないかと。

https://response.jp/article/2021/06/06/346469.html

ただ、最近はMediaPipeが流行ってますね。PoseNetよりも頑張って追従してくれるので、そちらを使うこともおすすめです(こちらはまだ、解読できてませんが)。

コメントを書く

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

« iPhone/iPad向けの有線LANケーブル | トップページ | ついにデアゴスティーニからAI/IoT電子工作学習キットシリーズ発売へ! »

無料ブログはココログ

スポンサード リンク

ブログ村