NVIDIAの訓練済みモデルで遊ぶ

# NVIDIA は訓練済みモデルを公開している
NVIDIA は最新のモデルの実装や、訓練済みモデルを公開しています。
[カタログページ](https://ngc.nvidia.com/catalog/collections) では、DeepLearning に限らず docker のコンテナなど分野問わず研究成果を公開していて見ていて楽しいです。
また、[github の NVlabs](https://github.com/NVlabs) では、実装が置いてあったりします。
今回は、この中から面白そうなもので、訓練済みモデルをダウンロードできるものを使って遊んでみたいと思います。

## 使うモデル
NVlabs の中の [FUNIT](https://github.com/NVlabs/FUNIT) というものを使って遊びたいと思います。
pix2pix のような Image-to-Image Translation のモデルのようです。
犬を別の動物に変えるような画像を生成したりしています。
訓練では動物の顔を別の動物の顔に変換するような訓練をしていますが、自分の顔の画像を入力して自分の顔を別の動物に変えてみようと思います。

# 準備
まずはレポジトリをクローンします。

```
> git clone https://github.com/NVlabs/FUNIT.git
Cloning into 'FUNIT'...
remote: Enumerating objects: 29, done.
remote: Counting objects: 100% (29/29), done.
remote: Compressing objects: 100% (27/27), done.
Remote: Total 208 (delta 0), reused 10 (delta 0), pack-reused 179R
Receiving objects: 100% (208/208), 97.38 MiB | 9.12 MiB/s, done.
Resolving deltas: 100% (85/85), done.
```

## 各種ライブラリのインストール
README.md に必要なライブラリが書いてあるのでインストールしていきます。

* install CUDA
  * https://developer.nvidia.com/cuda-downloads

![3abbea8b-b877-40a5-8965-25bc1429c5a3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164275/0104befc-270f-170a-903f-acc9ff6a24f4.png)

* install cuDNN
  * nvidia のドライバーダウンロード
    * https://www.nvidia.com/Download/index.aspx![4d86c00f-e566-4ce0-bc01-79d8300f7e9b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164275/e5d6497c-9bd1-8dc4-5cec-02d4933e78f7.png)

  * SDK をダウンロード
    * ログインが必要なのでログインします。

![b60cfd50-31ca-42f9-a142-a2b224f1cf52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164275/a384062b-d58e-76f0-347b-4c124828f69b.png)


  * アンケートを回答するとバージョン選択画面が出るので windows のものをダウンロードします。

![3c320c02-3510-4473-a9fb-e58ef5c98cac.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164275/5a52e3af-814d-470d-1dbb-c8f09cb76a18.png)

  * 解答すると以下のフォルダが作成される

![b84460393416e6a554591044d101da35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164275/6e45b8d6-b567-13ad-de42-812a3f3449a3.png)

  * CUDA ダウンロード時に以下のフォルダが作成されているので、解答したフォルダの bin, include, lib をすべてコピーします。

![dd0ca1e33a506f49855583543d6275ed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164275/71cca3dc-392b-8221-6fe7-b73ca5e8febb.png)

  * CUDA_PATH が環境変数に登録されているのを確認します。

```
PS C:\Users\81801> $env:CUDA_PATH
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2
```

  * anaconda3 のインストール
    * scoop の extras を使用してのダウンロードができますが、レポジトリ情報がメンテされていないのでインストーラーでのダウンロードを行います
    * https://www.anaconda.com/products/individual

* ライブラリのダウンロード
    * cudatoolkit に指定するバージョンを事前に確認しておきます

```
> nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2020 NVIDIA Corporation
Built on Mon_Nov_30_19:15:10_Pacific_Standard_Time_2020
Cuda compilation tools, release 11.2, V11.2.67
Build cuda_11.2.r11.2/compiler.29373293_0
```

* cuda toolkit のバージョンが 11.2 であったのでライブラリダウンロード時に `cudatoolkit=11.2` の指定をするべきだと思うのですが、11.2 がなかったので 11.0 をダウンロードします。

```
conda install -y pytorch torchvision cudatoolkit=11.1 -c pytorch
conda install -y -c anaconda pip
pip install pyyaml tensorboardX
conda install -y -c menpo opencv3
```

以上でインストールが終了しました。

# 試してみる
pretrained モデルの項目の link からチェックポイントをダウンロードし、動かしてみます。

```
> python test_k_shot.py --config configs/funit_animals.yaml --ckpt pretrained/animal149_gen.pt --input images/input_content.jpg --class_image_folder images/n02138411 --output images/output.jpg
```

README 通りの画像ができました。

![4c505d1eade124624fba5418b8099097.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164275/0fcae512-0a9b-9938-79ad-b807234b1539.png)

## 自分の顔を変えてみる

次は input の画像を自分の顔にしていろんな動物を試そうと思います。
訓練元データは、似たようなモデルをまとめた [別のレポジトリ](https://github.com/NVlabs/imaginaire) のスクリプトでダウンロードできるようなので、そちらで取得します。

ダウンロードしてきたデータは、各動物の画像が4GBほどありました。

![4408d2fcbb97797884b3096bf2767689.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164275/43b5b47a-3a7b-aac6-a935-4a32b434ee14.png)
![4408d2fcbb97797884b3096bf27676895.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164275/094472f1-3d2a-2060-fd6c-b2d9a61ae6fc.png)

各動物の画像を5枚選んで先程のコマンドに渡します。
input 画像の方は自分の顔を指定します。
input 画像は 128x128の画像だったので切り抜きました。

![e772a03a46889a2482c6247a397295f4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164275/48ad194f-b639-f900-b7ea-ec56af97af74.png)

自分の顔を変換した画像の横に変換対象の動物を並べています。

## わりとよさげ

![4faca5538e432e330e857a9f53f2a64e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164275/305e7170-7009-cb7e-2ef6-c4cf59b590b5.png)
![a3ebe5a97073c8b6e8b5fc5ca83b1ca8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164275/5e7c342e-345d-ba8d-5cc2-3465cb6b38f2.png)
![4309d332f1acf0b6d4cc774db5a3cb65.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164275/a47b1c9f-b4c9-3742-f6f3-e7412c675609.png)
![4131db7bd6158eb32219dce00f186721.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164275/988aef75-3a77-73e0-c7ef-8fa95de4016a.png)
![405ec89dbaa61e7a07efcc48ecaf87ad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164275/00800f53-1ce7-88fc-c4b2-22fb345e957b.png)
![cba420f288dfe6da7a2b62d36f7f72b8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164275/63f63099-fec4-553a-5000-8a14b38788b9.png)

## メガネかけてる

![6a5a8c5594f197506cf625d5eeb09fff.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164275/fcee7494-0e01-9987-f919-c755791d17ea.png)

## 毛もきれいに消えた

![d05cd2d5163b659cc13c798500e0d814.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164275/0a1ff87e-c175-c766-1b0c-99e8b7bea3ea.png)


# 所感

お面を被ったような画像が結構出来上がりましたが、人間の顔なのに結構うまく変換できました。
髪の毛が結構残ったので次回はハゲにして臨もうと思います。
NVIDIAカタログには最新のGPUが大量に必要なモデルの訓練済みモデルも公開していたりするので、遊んでみると楽しいです。