Jetson NanoでOpenPoseを使ってみる


2021/03/01現在、下記のtf-pose-estimationへのリンクは切れています、Githubのリポジトリも無くなっています。ただ、tf-pose-estimationで検索すると68、openposeで検索すると1000以上ヒットするので、やる気になれば再構築できるかもしれません^^。

姿勢推定をお使いになる場合は新規にtrt_pose の使用をご検討ください。

Jetson Nanoで学習済みモデルを使って、いろいろやってみる(4-1)姿勢推定(ResNet-18)

上記のページではPytorchが使われています。TensorFlow + OpenPose でやってみたい方は、こちらのページ(GitHub)をご参照ください。

 


時系列内のフィールドでのプレーヤーの体の向きを識別する技術に関して、

AUTOMATED TRACKING OF BODY POSITIONING USING MATCH FOOTAGE

(日本語訳

この論文でOpenPoseが使われています(paper)。

FC Barcelona Sports Analytics Summitで発表されていたものです。

OpenPoseって何?

OpenPoseは人間の姿勢推定に使うアルゴリズムです、arXivはここ

実際に触ってみようではないか….ということで。


こういう構成で使ってみます。

Jetson Nano + WebCam

 

OpenPoseはTensorFlow版を使ってみます。

tf-pose-estimation

 


インストール

Jetpackは4.2を使います。最新のJetpackは4.3でOpenCVは4.xらしく、TensorFlow版OpenPoseは3.xでしか動かないそうなので、前のOSを使います。

 

Jetpackのインストールはこのページをご参照ください。

tf-pose-estimationは依存ライブラリが結構複雑そうなので、Jetpackをクリーンインストールした状態から以下を実行してみました。

pip3インストール

sudo apt-get install python3-pip

 

 

scikit-imageでscipyとpillowのインストールで失敗した場合
scipyはバージョンが低いとnumpy.testing.nosetesterが使えなくなるので、バージョン指定してインストールします。

TensorFlowをインストール

TensorFlowのグラフデータをダウンロード

 


実行してみます

リモートデスクトップで確認できます。リモートデスクトップの設定もここを参照

cd ~/tf-pose-estimation

静止画

 

 

動画

ダウンロードしたrun_video.pyはバグっているようです。

この方のGitHubにあるコードを使わせていただきます。

修正箇所は以下の2ケ所。

from estimator -> from tf_pose.estimator
from networks -> from tf_pose.networks

 

 

カメラ

Youtubeの動画をカメラでモニター

なお、Youtubeなどの動画は設定で再生速度を0.25あたりにしておくと、視認しやすいです。

 

裏に抜け出したネイマール(PSG)がボールをトラップした瞬間と、あわてて戻るモナコディフェンダーという構図。この後、ほぼGKと1対1になってゴール(^^)。

 

AUTOMATED TRACKING OF BODY POSITIONING USING MATCH FOOTAGE

によれば、上体の向きを決めるのに重要なのは肩と腰の部分のデータで、選手がカメラと正対した場合のみ鼻、目、耳のデータを使うようです。

 


データを採取してみました

ヒントになるのは、tf-pose-estimation/tf_pose/にあるcommon.pyとestimator.pyです。

common.pyには人体パーツの各番号や線を引く時のペア番号の配列などが定義されています。

 

 

 

estimator.pyのdraw_humans関数で、検出されたポイントを結ぶ線が引かれます。

(2,16)、(5,17)の線のシチュエーションが分かりませんでした(横顔?….違います)

 

検出された人体ごとの各パーツの座標を表示しデータを取得するようにしています。
後はこれらのデータをdraw_humansが呼び出されるごとにファイルに落とすかDBに記録するようにすればいいと思います。

データはdraw pointで首・鼻・両目・両耳、draw lineで肩の2点と腰の2点を採取しています。

 

外部で変数を1個定義しておきます(フレーム番号用)。

fr_num = 0

データはフレーム単位で取得します。

この関数内の「#ここ」で示した8つ場所でコードを追加しました。最後にデータを追記で保存しています。

こんな感じです。検出される人物IDは選手なのか観客なのか区別できませんので、この辺工夫が必要ですけど。

 

昨今のAIの界隈では、動画内の特定の人物を追跡したり、画像処理でその人物を「居なかったことにする」のも可能なようです(GANを使ってます)。また、解像度が低い画像の場合は推定が困難になりますが、この場合も論文に触れられている「超解像」が役に立ちそうです。超解像というのは例えばこんな感じのものです。

 

ここでは、2,3,4のIDを持った人物が肩2点と腰2点の4つのデータを持っています。そのうちの1人は多分ゴール裏の観客です。

 

 

 

 


OpenPoseは規約で商用利用にはライセンスが必要なようで、さらにたとえ商用利用であってもスポーツの分野では使っちゃダメなんだそうです。

非商用の個人利用などはもちろんOKです。

ちなみに、姿勢推定にはOpenPose以外にこういうのもあります。

NTT DOCOMOと東大の共同研究

 

 



paperで使われる方法はExpected Goalsのモデルにも有効なようです。

Expected Goals(得点期待値に関する新指標「xG」)は結構有名な指標だそうです。

フットボール・データアナリティクス:得点期待値に関する新指標「xG」についての解説

 


 

Be the first to comment

Leave a Reply

Your email address will not be published.


*