背景
最近,テレビでフィギュアスケートを見ていて,ジャンプ時の軌道が3次元的に可視化されていて,回転数も画像から計測できないのかなと思い,解析を試みた.軽くサーベイしてみると,以下の記事が見つかった.
元フィギュアスケート選手とディープラーニングの華麗な出会い 「選手の役に立ちたい」社会人大学院生の挑戦
CNN+SVMで回転不足の有無し判定を行おうというものだ.ここで最近,姿勢推定界隈では,OpenPoseの3次元版があるということをふと思い出した.3次元姿勢推定の結果から直接的に回転数をカウントすることはできないかと思った.
3次元姿勢推定についてサーベイすると,FAIRのVideoPose3Dというリポジトリを発見.デモにフィギュアスケートの例が載っていたため即採用.
VideoPose3D(Facebook AI Research)
環境
- Google Colabolatory
- PyTorch
- Detectron2
いざ実行
実行環境の導入に関しては,notebookにまとめたので以下を参照(利用の際は,git clone文とパス周りを変更が必要).
colabでの実行に際して,inference/infer_video_d2.py
のcocoのpklファイルのロード部分を変更し,同じ階層にcocoのpklを直接配置した(デフォルトではweb上から読み込むようになっていたが,なぜか読み込みに失敗した).
使用したのは紀平選手の4回転サルコウの動画
テロップを無くすためクロップしたり,30fpsから50fpsに変換したり,紆余曲折があったが,結果としてかなり良い推定結果が得られた(上図は10fpsで表示).
ここで気になるのは回転数である.上図の視点ではジャンプの瞬間に正しく関節を得られているのかが分かりにくい.
そこで,腰(上図2,5)のみを,真上視点でプロット.
上図をみると,ジャンプの瞬間プルプルと振動しているだけで,赤と黒の線が入れ替わっていない.つまるところ,ジャンプの瞬間の回転(体の裏表)は正しく推定されていない.ゆえにこの情報からは回転数をカウントすることは難しそうである.
ただ,面白かったのは,回転の瞬間である.両腕・両肩のみ(関節ID=9~17)を上から見てみると,ジャンプの瞬間は中心付近に寄っていることが見てとれる.この3次元プロットは骨盤(関節ID=1)を中心にプロットされているので,回転軸のブレなどはこの情報から計算することはできそう.VideoPose3D自体2年くらい前の研究なので,もうやられているとは思うが,色々な研究のネタにはなりそう.