3DのポーズやUVマップのとれるトラッキングPHALPを試してみた
3Dの位置、外観、姿勢といったパラメーターは3Dモデルをレンダリングする際には必須です。CVPR2022にあった「PHALP」が、それらのパラメーターを推定しつつ、トラッキングしてくれ、個人的に面白そうだったので動かしてみました。
目次
はじめに
CVPR2022のBest Paperリスト見てたら面白い論文があったので試してみました。ファイナリストの候補の「Tracking People by Predicting 3D Appearance, Location & Pose」という論文です。論文の内容については今は割愛します。
33 Best #CVPR2022 Paper Finalists pic.twitter.com/ZdOqq3u7Wv
— CVPR (@CVPR) June 23, 2022
- Tracking People by Predicting 3D Appearance, Location & Pose
- https://arxiv.org/abs/2112.04477
- https://github.com/brjathu/PHALP
通常トラッキングというと、フレーム単位の物体検出を時系列でつなげたもので、2DのBounding BoxとIDが出てくるだけなのですが、PHALPはポーズやUVマップといった3Dオブジェクトを扱うのに必須のパラメーターが一緒に出てくるトラッキングです。サンプル動画を見るのが早いでしょう。
公式GitHubより。3Dモデルでレンダリングしてトラッキングの可視化をしています。PHALPはこのレンダリングに必要な、顔の向きやUVの推定もやっています。
これは顔の部分だけレンダリングしたもので、全身もレンダリングできます。
フォークしてみる
このデモプログラムは若干使いにくい部分があったので、以下の点を変更しました
- リソースファイルをGoogle DriveからGitHubのReleaseに変える
- Google Driveからのダウンロードは帯域制限なのか頻繁にエラーを出すため
- YouTubeのファイルをダウンロードして推論していたが、オフラインのファイルに変える
- requirements.txtを追加
変更したものがこちらです。
https://github.com/koshian2/PHALP
こちらを動かしていきます。
動作環境想定
- ColabのGPUインスタンス
(3Dの推定しているだけに結構重たいです)
コード
リポジトリをCloneします
# Clone the main repo
PHALP_ROOT="PHALP"
! git clone https://github.com/koshian2/PHALP.git $PHALP_ROOT
%cd PHALP
前提ライブラリをインストールします。結構いっぱいあるため時間かかります。
# Install dependencies
!pip install -r requirements.txt
ランタイムの再起動が必要になります(RESTART RUNTIMEボタンでOK)。カレントディレクトリをPHALPに移動します。
%cd PHALP
判定対象ファイルが「PHALP」フォルダの直下にあるとします。判定対象ファイル名が「pexels-grace-wu-6022014.mp4」だったとします。使っている動画はこちらの記事と同じです。
実行します。
!python eval_onefile.py \
--track_dataset "file" \
--storage_folder "Videos_v1" \
--video_path "pexels-grace-wu-6022014.mp4" \
--predict "TPL" \
--distance_type "EQ_010" \
--encode_type "4c" \
--all_videos True \
--track_history 7 \
--past_lookback 1 \
--max_age_track 50 \
--n_init 5 \
--low_th_c 0.8 \
--alpha 0.1 \
--hungarian_th 100 \
--render_type "HUMAN_FULL_FAST" \
--render True \
--res 256 \
--render_up_scale 2 \
--verbose False \
--overwrite True \
--use_gt False \
--batch_id -1 \
--detection_type "mask" \
--verbose True
しばらくするとoutフォルダ直下に生成されます。
体感としてはGPUで2FPS前後ですね。3Dの推論が明らかに重そうなので、仕方ないです。リアルタイムは諦めたほうがいいでしょう。
結果
人が塗りつぶされたものはSegmentationモデルの結果ではなく、3Dのパラメーターを推定して、後から人のモデルをレンダリングしたものです。
ツイッターに上げたら「かまいたちの夜みたい」「トリップしてる」等好評でした。
トラッキングの性能自体はいいのか?
ぱっと見、トラッキングの性能は良さそうに見えます。ただ純粋にトラッキングの性能がほしい場合、前述のByteTrackとどっちが良いのか気になったので調べてみました。
ByteTrackの論文からです。バックボーンはYOLOX-Xを使っているとのことでした。
一方のPHALPの性能です。論文からです。2Dのトラッキングと3Dのトラッキングでは問題設定が違うので、純粋には比較7できないかもしれません。
PHALPのコードを見ていたらDeepSortを使っていたので、トラッキングのモデルに関してはもしかしら一世代前のものかもしれません。ただやっていることが全く違うので単純に比較できるものではないと思います。
あくまで論文に書かれた性能を比較するなら、
- 扱っているデータセットが違うから何とも言えない
- ByteTrackのほうがトラッキング自体の性能はよさそう
- ただ、ByteTrackのバックボーンがYOLOX-Xというとても大きなモデルなので、実用的なバックボーンサイズを選択すると一定の性能低下は見込んでおくべき
純粋にトラッキングだけほしい場合はByteTrackでやったほうがいいかもしれません。ただ、PHALPは明らかに楽しそうなことができそうなので、今後の活用法を模索していきたいです。
PHALPトラッキングにUVやポーズの特徴を取ってマッチングしている
PHALPを見て「推論遅いな、ならUVや姿勢の推定切ったらどうなんだろう?」と試してみましたが、トラッキングの部分で
'appe'
Traceback (most recent call last):
File "eval_onefile_simple.py", line 141, in test_tracker
tracker.update(detections, t_, frame_name, 0)
File "/content/PHALP/deep_sort_/tracker.py", line 88, in update
self._initiate_track(detections[detection_idx], detection_idx)
File "/content/PHALP/deep_sort_/tracker.py", line 153, in _initiate_track
dims=[self.A_dim, self.P_dim, self.L_dim])
File "/content/PHALP/deep_sort_/track.py", line 52, in __init__
self.track_data['prediction']['appe'] = deque([detection_data['appe']], maxlen=self.opt.n_init+1)
KeyError: 'appe'
に遭遇しました。この理由はトラッカーの部分でAppe(外観)の特徴を使っているため、その推論を切って、端折らせようとするとエラーになるということです。当該のコードを見ると、「外観、ポーズ、UVマップ」といった特徴も使用してマッチングしていました。ByteTrackよりもマッチングに使っている特徴が多いので、もしかしたらByteTrackよりもいいトラッキングができているかもしれません。
ByteTrackと同じ方法で比較
少し面倒でしたが、YOLOX+ByteTrackと同じ方法で比較してみます。
最初に白いジャンパーの人が全面にオクルージョンしてきますが、オクルージョンの前後である程度IDが保持されているのが確認できます。動画編集ソフトのタイムラインは以下の通りです。
明らかにYOLOX+ByteTrackよりまとまりがいいです。ちなみにByteTrackの場合は以下の通りです。
ByteTrackの場合
もしかするとPHALPのほうが、3Dの外観やポーズをマッチングの特徴に使っている結果、オクルージョンに対してロバストになっているのかもしれません。
Shikoan's ML Blogの中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内
技術書コーナー
北海道の駅巡りコーナー