3D姿勢推定StridedTransformer-Pose3Dを使ってバレーのレシーブ姿勢を可視化してみた。

# 目的

`StridedTransformer-Pose3D`とはどういったものなのか、お試しでレシーブ姿勢を可視化してみて上澄み部分を味わう。

# 背景

姿勢推定で面白いものはないかとネットで検索していたら、たまたま`StridedTransformer-Pose3D`という3D姿勢推定ライブラリを見つけた。平面の動画から3D姿勢を推定できるため、スポーツなどで動作分析するのに今後役立てないかとお試しで使ってみた。

# StridedTransformer-Pose3Dとは

`StridedTransformer-Pose3D`とは、3次元人物姿勢推定を行うライブラリです。

このような感じで推定ができるとのことです。
![skating.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/75291497-52d0-efea-8e32-41d2a8622eef.gif)
![dancing.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/ab96b6ba-d785-a97c-caa3-645c45b87f1e.gif)
GitHubはこちらです。

https://github.com/Vegetebird/StridedTransformer-Pose3D

# 実行環境

Google Colab

# 内容

ソースコードについてはGitHubにアップしてあります。
GitHubへのリンクは本投稿後半にあるソースコードの章を参照願います。

### 1. 事前準備

- StridedTransformer-Pose3Dを取得

```
!git clone https://github.com/Vegetebird/StridedTransformer-Pose3D.git

%cd StridedTransformer-Pose3D
```

- 必要ライブラリインストール

古い`matplotlib`をインストールしていますが、3D姿勢を表現するために必要な処理が現バージョンだとdeprecatedとなっており、Issueの解消策も試しましたが改善しなかったため、やむを得ずこうしてあります。

```
!pip install yacs
!pip install filterpy
!pip install einops
!pip install matplotlib==2.2.2
```

- 学習済みモデルのダウンロード

学習済みのモデルがGoogleDriveにて共有されているため取得します。
学習もできるようですが、今回はどういった結果となるか、上澄みを味わいたいだけのため割愛とさせていただきます。

```
import gdown

!mkdir -p checkpoint/pretrained
gdown.download("https://drive.google.com/uc?id=1aDLu0SB9JnPYZOOzQsJMV9zEIHg2Uro7", "refine_4365.pth", quiet=False)
!mv refine_4365.pth checkpoint/pretrained

gdown.download("https://drive.google.com/uc?id=1l63AI9BsNovpfTAbfAkySo9X2MOWgYZH", "no_refine_4365.pth", quiet=False)
!mv no_refine_4365.pth checkpoint/pretrained

gdown.download("https://drive.google.com/uc?id=1gWZl1VrlLZKBf0Pfkj4hKiFxe8sHP-1C", "yolov3.weights", quiet=False)
!mv yolov3.weights demo/lib/checkpoint

gdown.download("https://drive.google.com/uc?id=1CpyZiUIUlEjiql4rILwdBT4666S72Oq4", "pose_hrnet_w48_384x288.pth", quiet=False)
!mv pose_hrnet_w48_384x288.pth demo/lib/checkpoint
```

### 2.姿勢推定

`--video`に解析したい動画を指定します。
動画は`StridedTransformer-Pose3D/demo/output`の下に配置します。

今回は著作権の都合上、バレーボールをプレーしている動画が準備できなかったため、バレーボールをプレーするフリー画像素材をただ表示する動画を作成し入力してみました。

動画を用意できない方は、`StridedTransformer-Pose3D`が用意している`sample_video.mp4`を指定してみてください。`--video sample_video.mp4`

```
!python demo/vis.py --video movie.mp4
```

### 3.推定結果確認

`StridedTransformer-Pose3D/demo/output/（動画名）`フォルダの下に解析後の動画が格納されているため、結果を確認します。

今回は静止画がひたすら流れるためあまり面白くはありませんが、一応可視化はできています。
見た感じ、床と接地している足は位置関係がまあまあ分かりそうですが、他は分かりにくいですね。何か奥行きもわかるような視覚的表現があると分かりやすいかなと思いました。現状だと、接地しているプレーについては足の位置関係の解析ぐらいであればできるかなと思います。ソースまで見ていませんが、内部では奥行きもわかっていて、表現だけの問題なのでしょうか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/be0f5cf9-fd73-21ae-7138-e3ea24ee8cd5.png)

参考として、下の画像はOpenPoseで解析した画像です。
姿勢推定としての結果はそこまで変わりませんが、出力されるポイントが多少違いますね。つま先、踵、目線。
ライブラリとしての使い勝手や、関節の推定位置結果を使う側が扱えることもあり、個人的にはOpenPoseの方がいいかなと思いました。OpenPoseは画像の入力も可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/78ba9fa2-e7e3-0bfc-12b3-5ae137132215.png)
過去投稿から拝借。`OpenPose`に興味あればこちらもご覧ください。（お知らせかい）

https://qiita.com/shinya_sun_sun/items/61b772db1e8d26b626ef

# ソースコード

https://github.com/MamedenQ/StridedTransformerPose3DExample

ノートブックのみのため下記リンクを直接開くでもよいです。

<a href="https://colab.research.google.com/github/MamedenQ/StridedTransformerPose3DExample/blob/main/StridedTransformerPose3DExample.ipynb" target="_parent"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"/></a>

# 最後に

奥行きがはっきりわからないため、接地している部位以外の位置関係は分かりにくかったが、今後アップデートがあれば非常に使える将来性のあるライブラリだと思った。

そういえば、動画内に複数人いたらどうなるのだろう。。。