3次元姿勢推定の導入方法

# 三次元姿勢推定
Twitterにおいてこの方@yukihiko_aのツイートを拝見し、自分のPCでやってみた際の導入方法について説明します。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">3次元姿勢推定の進捗。ResNet34ベースのモデルをUnity Barracudaで実装しています。<br>こちらのコードをGithubにアップしました。<br><br>動画はこちら：<a href="https://t.co/RGQvmbnsgi">https://t.co/RGQvmbnsgi</a> <a href="https://t.co/uj7pXBgMAD">pic.twitter.com/uj7pXBgMAD</a></p>&mdash; Yukihiko Aoyagi (@yukihiko_a) <a href="https://twitter.com/yukihiko_a/status/1227838334258438145?ref_src=twsrc%5Etfw">February 13, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 自身のPCの環境
CPU : Ryzen 7 1700
GPU : GeForce GTX1070
メモリ : 16GB
において実際において三次元姿勢推定を行いました。

# 導入方法
英語での導入方法に関しては以下のgithubのREADME.mdにおいて詳しく説明していただいています。
なので、今回は日本語での説明及び、自分の環境においてつまずいた点を記載したいと思います。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">3次元姿勢推定の続き。<br>最新のコードを会社のリポジトリに公開しました。<a href="https://t.co/gvwPqAP1uh">https://t.co/gvwPqAP1uh</a></p>&mdash; Yukihiko Aoyagi (@yukihiko_a) <a href="https://twitter.com/yukihiko_a/status/1227838654917181440?ref_src=twsrc%5Etfw">February 13, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
パフォーマンスのレポートとして以下のようになっています。
GeForce RTX2060 SUPER ⇒ About 30 FPS
GeForce GTX1070 ⇒ About 20 FPS
(GithubにおけるプロジェクトのREADME.mdに記載されていました。)

#### 必要なプロジェクト及びファイルのダウンロード
1. githubから自身のPCにプロジェクトのダウンロードももしくはクローンを行います。[Githubのリンク](https://github.com/digital-standard/ThreeDPoseUnityBarracuda)

2. 次にonnxを以下のURLをクリックすることによってダウンロードを行います。
　[onnx](http://digital-standard.com/threedpose/models/Resnet34_3inputs_448x448_20200417.onnx)

#### Unity側での設定

1. Unity Editorを用いてUnityのプロジェクトを開きます。そして、Unityにおいて/Assets/Scripts/Model/ の位置に先ほどダウンロードを行ったonnx ファイルを置きます(画像の位置）。この作業によって自動的にNNModel Typeへの変換も自動的に行なわれます。
![unity Model 保存場所.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199067/b80bcd95-9092-86b2-4dfe-c12bb9130e9a.png)

2. そして、Sceneフォルダの中にあるSampleSceneを開きます。その際にダイアログが表示されたら"Don't save"を選択してください。

3. モデルの設定を行います。先ほどAssets/Scripts/Model/の位置に置いたNNNModelをGameobjectの"BarracudaRunner"におけるInspector viewの中のNN Model に置きます。(Unity側での作業1における画像の右側)
![コメント 2020-02-14 150734.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199067/eef8ce44-0e80-53b4-43a3-b2d7ea5d9245.png)![コメント 2020-02-14 150720.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199067/73454374-d078-52bd-5390-4f47c440c22d.png)

4.デバックを行うことによって実際に三次元姿勢推定を行うことが出来ます。

### 動画の変更
Unityのプロジェクト内のAssets/Video/から動画を選択してHierarchyのVideo Player内のVideo Clipに置くことによって推定を行う動画の変更も行うことが出来ます。
![コメント 2020-02-14 154140.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199067/31f92c9f-462b-0d1f-32f3-17593998ff0c.png)
![コメント 2020-02-14 153946.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199067/24516331-8066-80d2-0fd2-eda91e49d97a.png)![コメント 2020-02-14 153959.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199067/b65c32c7-fac7-3513-9828-1cd108d6ca08.png)

### ウェブカメラを用いる方法
MainTexrureのVideo Captureにおける"Use Web Cam"にチェックを入れることによってWebカメラを用いたリアルタイムでの推定を行うことが出来ます。
![コメント 2020-02-14 154349.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199067/9f753761-5932-4ce8-dd14-0105ccde15a1.png)![コメント 2020-02-14 154336.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199067/4d79b406-a51e-d0e8-bee1-46318312ee21.png)

### アバターの変更方法について
まず二種類のアバターが前もって用意されています。それらのアバターをinspector viewを用いて簡単に変更を行うことが出来ます。
1. まずゲームオブジェクト内の"Tait"ををactivateします。GameObjectの"Tait"のinspector viewにおける"Tait"の横にチェックマークを有効にします。
![Tait.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199067/b4efcfe2-4453-a7bd-4c18-d55e6cbe15d9.png)
2. 現在activeになっているunitychanをdeactiveにします。GameObjectの"unitychan"のInspector viewにおける"unitychan"の横のチェックマークを外します。
![unitychan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199067/b914affa-9a61-d77d-e902-f2486811ea47.png)

3.最後に、ゲームオブジェクトの"BarracudaRunner"におけるInspector viewの"V Nect Model"に対して先ほどactiveにしたGameObjectの"Tait"を置きます。
![Tait put.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199067/65814b98-648d-c734-5a32-d805f9f91d6f.png)

自身の環境においてはこれで実行を押すとアバターが映らず、動画のみが流れるという状況になりました。
その際に以下のようにしてアバターも表示させました。
まず、"Tait"アバターのPositionを確認します。自身の環境では次のようになっていました。
![Tait pos.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199067/c281d0e8-a534-743c-ff49-824172510cb4.png)
そのため、Positionの値をunitychanのPositionと同じ値にしました。(x=0,y=0,z=0にしました)
![tait pos2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199067/ec4c5acc-d362-0328-2014-7856beaa6b81.png)
この状態で実行することでちゃんと画面にアバターが表示されました。



## 自分がつまづいた点について
今回自分の環境において導入する際に少しつまづいた点として挙げられるのが、Unityのバージョンについてです。
自分の使っていたバージョンでは、動作することが出来ませんした。
今回のプロジェクトに合わせて、Unity 2019.2.12f1を用いることによって導入することが出来るようになりました。

## まとめ
Webカメラや動画を用いた三次元姿勢推定をPC及びUnityで行うことが出来るようになりました。
自身でも動画を撮ってみて推定を行いましたが、とても制度が高かったです。

##編集点
2020/05/02
作成者の方のgithubにおけるonnxのリンクの変更が行われたので、修正を行いました。