Windows への 3dpose-gan の導入手順【2/17更新】

この記事は[【目次】MMDモーショントレース自動化への挑戦](https://qiita.com/miu200521358/items/d826e9d70853728abc51)の為の導入手順になります。
**ver1.01のリリースに伴い、導入が不要になりました。ご注意下さい**

# [miu200521358/3dpose_gan_vmd](https://github.com/miu200521358/3dpose_gan_vmd)

2Dの骨格位置情報から3Dの関節情報に変換するライブラリの私的改変版。

## form元

[学習に3Dデータセットを用いない3D姿勢推定](https://nico-opendata.jp/ja/casestudy/3dpose_gan/index.html) (DwangoMediaVillage様)

# 前提

このライブラリは、これまでのMMDモーショントレース自動化の各ライブラリの後に追加されました。
そのため、既に他のライブラリが導入されている前提で話を進めます。
これだけを導入する場合、適宜読み替えて下さい。

# 1. 3dpose_gan_vmd の導入

![capture001465.jpg](https://qiita-image-store.s3.amazonaws.com/0/254327/6736ece2-8b79-9737-358c-2c51edbe7655.jpeg)

１. [miu200521358/3dpose_gan_vmd](https://github.com/miu200521358/3dpose_gan_vmd) のトップページから「`Clone or Download`」＞「`Download ZIP`」を順に押下

２. ダウンロードした圧縮ファイルを、空白のないパス以下に解凍。私は以下に配置しました。

「`C:\MMD\3dpose_gan_vmd`」

# 2. 学習データの導入

１. `3dpose_gan_vmd`ディレクトリ配下 に `openpose` ディレクトリを作成する

２. 以下2ファイルをダウンロードする

https://github.com/opencv/opencv_extra/blob/3.4.1/testdata/dnn/openpose_pose_coco.prototxt

※githubからダウンロードする場合、上記サイトの「Raw」ボタンを押下すると、生ファイルが表示されます。その状態で、保存（Ctrl+Sとか右クリックして「名前をつけて保存」とか）すると、ファイルがダウンロードできます。（1/14追記）

http://posefs1.perception.cs.cmu.edu/OpenPose/models/pose/coco/pose_iter_440000.caffemodel

![capture001466.jpg](https://qiita-image-store.s3.amazonaws.com/0/254327/e4617ee6-f189-d9e3-3263-5a16c187437f.jpeg)

３.　ダウンロードしたファイルを、`openpose`ディレクトリ配下に設定する

４.　`3dpose_gan_vmd`ディレクトリ配下 に `train` ディレクトリを作成する

５. 以下1ファイルをダウンロードする

https://github.com/DwangoMediaVillage/3dpose_gan/blob/master/sample/gen_epoch_500.npz?raw=true

2018/12/10現在、リンク切れが発生しているようです。私のGoogleドライブからダウンロードしてください。
https://drive.google.com/open?id=1xY9-0vkeGoMN8nYv2Nz0N5lDV7YqdlGs


６. ダウンロードしたファイルを、`train`ディレクトリ配下に設定する
![capture001468.jpg](https://qiita-image-store.s3.amazonaws.com/0/254327/74db005b-662b-5706-e88e-d712da4f7ca8.jpeg)

# 3. 必要ライブラリのインストール

![pip install chainer.jpg](https://qiita-image-store.s3.amazonaws.com/0/254327/30063491-285f-e76e-13a2-fc42cd85a846.jpeg)

１. 「Aanaconda Prompt」で、1.で作成したディレクトリに移動

※新しくプロンプトを立ち上げた場合には、「`activate tensorflow`」で、必ず自分が作成した環境に移動すること
　コマンド入力行の先頭に `(tensorflow)` と、環境名が出ていればOK。

「`cd C:\MMD\3dpose_gan_vmd`」

２. 必要ライブラリをインストール。以下コマンドを一行ずつ「Aanaconda Prompt」に入力してEnter。

```
pip install chainer
```

# 4. 3dpose_gan_vmd 実行

１. 「Aanaconda Prompt」を起動し、`(tensorflow)`を有効にして、「`3dpose_gan_vmd`」のインストールディレクトリに移動

「`cd C:\MMD\3dpose_gan_vmd`」

![capture001467.jpg](https://qiita-image-store.s3.amazonaws.com/0/254327/6cd26d58-c730-21e2-b772-0c9eb288f1a0.jpeg)

## 実行方法

1. [Openpose簡易起動バッチ](https://github.com/miu200521358/openpose-simple) で データを解析する
1. [miu200521358/3d-pose-baseline-vmd](https://github.com/miu200521358/3d-pose-baseline-vmd) で生成された2D関節データ (smoothed.txt) を用意する
1. [深度推定](https://github.com/miu200521358/FCRN-DepthPrediction-vmd)で 深度推定と人物インデックス別のデータを生成する
1. [OpenposeTo3DGan.bat](OpenposeTo3DGan.bat) を実行する
	- [OpenposeTo3DGan_en.bat](OpenposeTo3DGan_en.bat) is in English. !! The logs remain in Japanese.
1. `INDEX別ディレクトリパス` が聞かれるので、3.の`人物インデックス別パス`のフルパスを指定する
	- `{動画ファイル名}_json_{実行日時}_index{0F目の左からの順番}`
	- 複数人数のトレースの場合、別々に実行が必要
1. `詳細なログを出すか` 聞かれるので、出す場合、`yes` を入力する
    - 未指定 もしくは `no` の場合、通常ログ（各パラメータファイルと3D化アニメーションGIF）
    - `warn` の場合、3D化アニメーションGIFも生成しない（その分早い）
    - `yes`の場合、詳細ログを出力し、ログメッセージの他、デバッグ用画像も出力される（その分遅い）
1. 処理開始
1. 処理が終了すると、3. の`人物インデックス別パス`内に、以下の結果が出力される。
    - pos_gan.txt … 全フレームの関節データ([VMD-3d-pose-baseline-multi](https://github.com/miu200521358/VMD-3d-pose-baseline-multi) に必要) 詳細：[Output](https://github.com/miu200521358/3d-pose-baseline-vmd/blob/master/doc/Output.md)
    - smoothed_gan.txt … 全フレームの2D位置データ([VMD-3d-pose-baseline-multi](https://github.com/miu200521358/VMD-3d-pose-baseline-multi) に必要) 詳細：[Output](https://github.com/miu200521358/3d-pose-baseline-vmd/blob/master/doc/Output.md)
    - movie_smoothing_gan.gif … フレームごとの姿勢を結合したアニメーションGIF
    - frame3d_gan/gan_0000000000xx.png … 各フレームの3D姿勢
    - frame3d_gan/gan_0000000000xx_xxx.png … 各フレームの角度別3D姿勢(詳細ログyes時のみ)


## 注意点

- Openpose のjson任意ファイル名に12桁の数字列は使わないで下さい。
    - `short02_000000000000_keypoints.json` のように、`{任意ファイル名}_{フレーム番号}_keypoints.json` というファイル名のうち、12桁の数字をフレーム番号として抽出するため