写真・動画の「人の動き」をリアルタイムで検出・解析することがGoogleのエッジ向けのプロセッサ「Edge TPU」で可能です。
誰でも簡単に「人間の姿勢」を推定して検出・解析できる方法を紹介していきます。
人の動作を検出!Edge TPUとPosenetで姿勢を推論してみる
Github上でEdge TPUの「Posenet」のプログラムが公開されました。(リンク先はこちらから)
従来は主にPC+Webブラウザ上で「Posenet」を使えていて、今回は「Edge TPU」でも利用可能になったということです。
実際に使ってみましたので使用方法を一から紹介していきます。
Posenetとは
元々「Posenet」はTensorFlow.js(機械学習のライブラリ)にある「人間の姿勢検出モデル」でした。(Githubのリンク先はこちらから)
今回はEdge TPU上で動かすために「Tensorflow Lite」に対応した「Posenet」をGoogle-coralからリリースされました。(Githubのリンク先はこちらから)
従来の「Posenet」ではGPUを搭載したPCを推奨されていましたが、今回Edge TPUで可能になったことでラズベリーパイ(raspberry pi)でも利用ができるようになりました。
今回はCoral USB Acceleratorとカメラを組み合わせて動かしていきます。
Posenetができること
後ほどプログラム動作含めて記載しますのでここでは簡単に概要のみ説明します。
「Posenet」のモデルを使うことで人のポーズを推定できます。顔の鼻、目、耳から体の肩、肘、手など17の部位を検出することができます。
PosenetのライセンスはApache License 2.0
「Posenet」はライセンスが「Apache License 2.0」です。つまり商用利用・個人利用ともにOKです。
Edge TPU含めて簡単に「Posenet」が使えることになったことで、企業・個人で「Posenet」が使われるケースが一気に増えていきそうです。
Posenetは商用利用・スポーツにも応用が期待
以前からも「Posenet」以外の人の姿勢検出のプログラムはありましたが、「商用ではライセンスが必要」・「スポーツで利用できない」というケースもあったようです。
Qiitaで探すと「Openpose」というサービスは商用利用だと年間ライセンス「$25,000」が必要で、かつスポーツはNG。(個人利用はOK)
ネット他記事を探したところ、先駆者の「からあげ」さんも使った「Realtime Multi-Person Pose Estimation」も商業用途はNGということでした。
良質な記事を残してくれた先駆者の方々にはこの場を借りて御礼申し上げます。
何にせよ便利なツールが使いやすく出回るのは非常に良いことだと思います。
Edge TPUとラズパイとカメラで「Posenet」を動かす
それではデバイスを用意して「Posenet」を使う準備をしていきます。今回はEdge TPUはCoral USB Acceleratorを使います。
Edge TPUの購入方法から簡単な使い方をまとめた記事が下記となります。初見の方はこちらから参照ください
またこの時点でEdge TPUとカメラも接続しておきます。
ラズベリーパイ(raspberry pi)にカメラの接続方法に関しては下記記事で紹介しましたので参考にお願いします。(リンク先はこちらから)
edgetpu_apiの最新版(2.11.1以上)をインストールする
「Posenet」をダウンロード・インストールしていきますがその前に、
Edge TPUのAPIは最新Ver(2.11.1以上)にしておきましょう。古いVerで「Posenet」を動かそうとするとエラーがでます。
Edge TPUのAPIのダウンロード・インストール方法は下記Coralのリンク先からお願いします。(リンク先はこちらから)
Posenetのインストール方法
インストール方法に関してはGithubのページに沿って対応していけばOKです。
と言ってもダウンロードしたフォルダで下記コマンドを実行するだけですので簡単です
写真から人の姿勢・ポーズを検出する
インストール後はサンプルプログラムが展開されますので、まずは一番簡単な「simple_pose.py」を動かしていきます。
上記コマンドで実行すればOKです。実際に何を行っているかというと、Wikipedia内の下記画像をダウンロードして人の姿勢を検出します。
結果は下記のようにまず「couple.jpg」を保存して、その後127msで姿勢情報が推論されていることが分かります。
そして2人分のスコア、検出した各部位の位置を表示しています
upload.wikimedia.org (upload.wikimedia.org) をDNSに問いあわせています... 2001:df2:e500:ed1a::2:b, 103.102.166.240
upload.wikimedia.org (upload.wikimedia.org)|2001:df2:e500:ed1a::2:b|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 83328 (81K) [image/jpeg]
couple.jpg' に保存中
Inference time: 127ms
nose x=210 y=152 score=1.0
left eye x=224 y=138 score=1.0
right eye x=199 y=137 score=1.0
left ear x=244 y=135 score=1.0
right ear x=182 y=129 score=0.8
left shoulder x=268 y=168 score=0.8
right shoulder x=160 y=173 score=1.0
left elbow x=282 y=255 score=0.6
right elbow x=154 y=256 score=0.9
left wrist x=236 y=333 score=0.8
right wrist x=162 y=299 score=0.6
left hip x=324 y=179 score=0.2
right hip x=203 y=233 score=0.0
left knee x=344 y=86 score=0.8
right knee x=170 y=294 score=0.0
left ankle x=316 y=175 score=0.1
right ankle x=166 y=307 score=0.0
nose x=398 y=145 score=1.0
left eye x=416 y=128 score=1.0
right eye x=382 y=127 score=1.0
left ear x=457 y=110 score=0.9
right ear x=370 y=120 score=0.2
left shoulder x=491 y=169 score=0.9
right shoulder x=362 y=151 score=0.8
left elbow x=465 y=290 score=0.9
right elbow x=328 y=246 score=0.8
left wrist x=340 y=303 score=0.9
right wrist x=233 y=331 score=0.5
left hip x=525 y=106 score=0.0
right hip x=361 y=161 score=0.3
left knee x=501 y=90 score=0.6
right knee x=350 y=167 score=0.1
left ankle x=504 y=178 score=0.0
right ankle x=306 y=176 score=0.1
pi@raspberrypi:~/project-posenet-master $
任意の画像で姿勢情報を推論してみる
ただサンプルを動かしただけでは面白くないので、少し「simple_pose.py」のプログラムを改造して「任意の画像」で姿勢情報を検出してみます。
実際に筆者が使ったはネットで落ちていたフリー素材の女性の写真でプログラムを動かしてみました。
実際にプログラム変更する箇所は簡単です。一番最初の画像ダウンロードする箇所を「#」でコメントアウトして、任意の画像の名前に置き換えます。
今回は「women.jpg」という写真名に置き換えています
実際のプログラム変更箇所は下記赤字箇所です。
「simple_pose_kai.py」(プログラム一部切り取り)
# 'Hindu_marriage_ceremony_offering.jpg/'
# '640px-Hindu_marriage_ceremony_offering.jpg -O couple.jpg')
#pil_image = Image.open('couple.jpg')
pil_image = Image.open('women.jpg')
そしてコマンドラインで実行すると…無事一人分の姿勢情報を推論・検出することができました。
Inference time: 132ms
nose x=511 y=138 score=1.0
left eye x=529 y=122 score=1.0
right eye x=510 y=125 score=0.9
left ear x=577 y=136 score=1.0
right ear x=509 y=140 score=0.0
left shoulder x=625 y=231 score=0.4
right shoulder x=505 y=225 score=0.8
left elbow x=640 y=354 score=0.0
right elbow x=381 y=284 score=0.8
left wrist x=640 y=380 score=0.0
right wrist x=365 y=409 score=1.0
left hip x=638 y=292 score=0.0
right hip x=473 y=391 score=0.7
left knee x=631 y=344 score=0.0
right knee x=338 y=460 score=0.0
left ankle x=640 y=367 score=0.0
right ankle x=310 y=462 score=0.0
pi@raspberrypi:~/project-posenet-master $
動画の人の動き・姿勢を検出する
最後にEdge TPUならではのプログラムで、リアルタイムの動画の人の動き・姿勢を検出していきます。
これもサンプルプログラム「pose_camera.py」が用意されていますので、カメラをセットしてプログラムを走らせるだけで結果がでます。
これに関しては動画で見た方が分かりやすいのでYoutubeにアップしてみました。
~5秒 カメラ位置に筆者が移動
~15秒 手足を動かす動作を検出・推論している
~22秒 ボール投げる動作を検出・推論している
結果は特に意味ないかもしれませんが、一部結果の切り取りを貼っておきます。
INFO: Initialized TensorFlow Lite runtime.
Gstreamer pipeline: v4l2src device=/dev/video0 ! video/x-raw,width=640,height=480,framerate=30/1 ! queue max-size-buffers=1 leaky=downstream ! videoconvert ! videoscale ! video/x-raw,format=RGB,width=640,height=480 ! tee name=t
t. ! queue max-size-buffers=1 leaky=downstream ! appsink name=appsink sync=false emit-signals=true max-buffers=1 drop=true
t. ! queue max-size-buffers=1 leaky=downstream ! identity ! videoconvert
! rsvgoverlay name=overlay ! videoconvert ! autovideosinkPoseNet: 144.4ms Frame IO: 21.23ms TrueFPS: 0.15 Nposes 0
PoseNet: 133.7ms Frame IO: 21.63ms TrueFPS: 2.09 Nposes 0
PoseNet: 128.4ms Frame IO: 22.82ms TrueFPS: 3.23 Nposes 0
PoseNet: 136.9ms Frame IO: 23.68ms TrueFPS: 3.64 Nposes 0
PoseNet: 139.4ms Frame IO: 25.16ms TrueFPS: 3.92 Nposes 0
PoseNet: 134.4ms Frame IO: 24.68ms TrueFPS: 4.27 Nposes 0
今回のデモですと少し動きに検出・推論が追い付いていない箇所がありますが、改善点は多くありそうです。
・解像度がデフォルトだと640x480。480x360に落とせば速く検出できるかも
・Raspberry Pi 3 Model B+なのでEdge TPUのIFがUSB2.0と遅め。ラズパイ4が使えるようになればIFがUSB3.0になり、より高速に検出できるかも
まとめ・感想
「Edge TPU」と「Posenet」を使うことで簡単に人の動作・姿勢を検出・推論することができました。
サンプルプログラムも簡単に動かせるので、初心者でも非常におススメです。
文中でもお伝えしましたが「Posenet」は個人利用・商用利用も可能ですので、色んなケースに使われて流行っていきそうです。
コメント
[…] 嫁が買ってきてくれた鯖缶を食べすぎて、朝はウトウトしてしまいました。食べすぎはダメですね。移動を控えているため、そろそろ運動を本格的に考えないといけないです。Posenetをうまく活用して、アプリ考案中です。Posenet使ったアプリは、エンジニアの電気屋さんの記事が面白いです。PosenetはTensorflow公式のGitHubに詳しくのってるので、cloneすることをお勧めします。 […]