【StyleGAN2】 を Windows10 CUDA ＋ cuDNN で動かす！

本記事では、リアルな画像を生成できるStyleGAN2について実際に体験するための手順を記載しました。
# ０. モチベーション

アイドルや美少女キャラを無限増殖させるなどで話題になったStyleGAN2をWindowsPCで動かすことが今回の記事のモチベーションです。動かすといっても、PCで学習は厳しいので、学習済みモデルを使って画像を生成させることを目標にします。環境による差もあるので、あくまで参考にしてください。

StyleGAN2のアーキテクチャについては、[別記事](https://qiita.com/DeepMata/private/499c8b96df96b072d651)にて投稿しています。

また、今回はGPU搭載のSurface book3を使っていますが、CPUでの動作についてもトライ中です。完成し次第こちらも別記事にて投稿予定です。


# １. StyleGAN2のソースを入手

[StyleGAN2のGithubページ](https://github.com/NVlabs/stylegan2)からソースをダウンロードしてPCの任意のディレクトリに配置。
![stylegan_git.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413258/97804941-7ae8-05ad-f9ed-46f46e3e06f9.png)


あわせて、必要な要件を確認します。
![stylegan_git2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413258/56634086-deda-57dc-4301-190b897b0cca.png)

Requirementsにあわせて以下を順番にインストールしていきます。

|No|必要なもの　　　　 　|バージョン　| 
|--|-------------------|-----------|
|1|Python　　       　|64ビットPython3.6|
|2|Anaconda　　       |３(numpy1.14.3以降)　
|3|TensorFlow         |1.14(GPU)  |
|4|CUDAツールキット    |10.0　 |
|5|cuDNN　　　         |7.4.2※　　　　 |
|6|Microsoft Visual Studio コンパイラ      |2017     |

※StyleGAN2のRequirementsにはcuDNNのバージョンは「7.5」と記載がありますが、[Tenforflowのサポートバージョン](https://www.tensorflow.org/install/source_windows?hl=ja)の7.4をインストールします（7.5も試してみましたが、RunTimeのエラーが発生。。。）。
![stylegan_cuDNNver2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413258/dbd70da1-ec83-7d16-8144-579b130c919d.png)


# ２．環境準備

### 1) Python3.6をインストール
[Python3.6](https://www.python.org/downloads/release/python-361/)から64ビット用インストーラをダウンロードして実行。コマンドプロンプトでバージョンを確認します。

```
> Python -V
Python 3.6.0
```

### 2) Anaconda3をインストール

[Anacondaのサイト](https://www.anaconda.com/products/individual)の画面をスクロールし、画面下部のインストーラ（今回は、Anaconda3-2021.05-Windows-x86_64）をダウンロードして実行。インストールが完了したら、Anaconda Promptを起動してバージョンを確認します。

```
> conda --version
conda 4.9.2
```


### 3) Microsoft C++ Build Toolsをインストール

[VisualStudio](https://visualstudio.microsoft.com/ja/vs/older-downloads/)サイトから「Visual Studio コミュニティ 2017」をダウンロードして実行。「C++によるデスクトップ開発」にチェックして、インストール。
![vs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413258/5ab92802-681c-cd19-430c-683aea496aad.png)

インストール後、『cl.exe』と『vcvars64.bat』にパスを通します（環境変数のPATHに以下が登録されていることを追加・確認します）。

```
> echo %path%
：
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x64
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build
：
```

※複数のVisual Studioがインストールされている場合、以下のコマンドを実行した結果、「2017」のパスが一覧の先頭にあることを確認します（最初が「2017」になっていない場合は、システムの環境変数の「Path」で順番を変更します）。

```
> where cl
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x64\cl.exe
```


### 4) CUDAツールキットをインストール
[CUDAのサイト](https://developer.nvidia.com/cuda-toolkit-archive)から「CUDA Toolkit 10.0」をダウンロードし、インストール。

インストールはデフォルトの設定で実行（もし、すでに10.0より新しいCudaがインストールされている環境で、上書きされたくない場合は、カスタムインストールでCudaだけにチェックをいれてインストール）。


インストール後、PATHなどを確認します（必要な場合は追加）。

```
> echo %cuda_path%
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0

> where nvcc
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin\nvcc.exe

> nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2018 NVIDIA Corporation
Built on Sat_Aug_25_21:08:04_Central_Daylight_Time_2018
Cuda compilation tools, release 10.0, V10.0.130
```
### 5) cuDNNをインストール
[サイト](https://developer.nvidia.com/cuDNN)からcuDNN（7.4.2）をダウンロード（アカウントがないとダウンロードできないので、必要に応じてアカウントを作成）。ダウンロード後、解凍して、中身をすべて「C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0」にコピー。

バージョンは以下のファイルで確認します。
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\include\cudnn.h

```
#define CUDNN_MAJOR 7
#define CUDNN_MINOR 4
#define CUDNN_PATCHLEVEL 2
```

## ３．仮想環境を作成

Anaconda Promptを起動し以下を実行。

```
> conda create -n stylegan2 Python=3.6 anaconda　# 仮想環境を作成
> conda activate stylegan2　　　　　　　　　　　　 # 仮想環境をActivate
> python -m pip install --upgrade pip　　　　　 　# Pipをupgrade
> pip install tensorflow-gpu==1.14.0　　　　　　　# Tensor flow　1.14.0のインストール
> pip list   　　　　　　　　　　　　　　　　　　　 # パッケージを確認
```

※Pillowやrequestsが入っていなかった場合、numpyのバージョンが1.16.5より古かった場合は、それぞれ以下を実行（おそらく不要です）

```
> pip install Pillow
> pip install requests
> pip install numpy==1.16.5
```

## ４. StyleGan2を動かしてみる

### 1) 事前確認：NVCCの動作確認
<dd>カレントディレクトリを１の手順でゲットしたStyleGAN2の配置場所に移動して以下を実行。</dd>
<dd>結果の最後に以下が表示されることを確認（warningは出ても大丈夫）。</dd>

```
> nvcc test_nvcc.cu -o test_nvcc -run
：
CPU says hello.
GPU says hello.
```

### 2) 環境設定：「custom_ops.py」の修正

<dd>（Stylegan2配置ディレクトリ）\dnnlib\tflib\custom_ops.pyを環境にあわせて修正。</dd>

```
：
compiler_bindir_search_path = [
   'C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.16.27023/bin/Hostx64/x64',
]
：
```

### 3) 画像生成を動かしてみる

<dd>学習済みネットワークを使って画像を生成。</dd>
```
python run_generator.py generate-images --network=gdrive:networks/stylegan2-ffhq-config-f.pkl --seeds=6600-6625 --truncation-psi=0.5
```
seeds=6600-6625：
![result０.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413258/776aed46-208b-f375-af72-196896ac7c85.png)

seeds=1000-1025：
![result1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413258/e70ce0eb-f052-58e1-7367-830872cf09f9.png)


```
python run_generator.py generate-images --network=gdrive:networks/stylegan2-ffhq-config-f.pkl --seeds=66,230,389,1518 --truncation-psi=1.0
```
![result20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413258/6b7a3c3a-1b4f-d210-1c80-f0f67d27c004.png)


<dd>Seedを変えると個性が変わり、truncation-psiを変えると個性の強さが変わるようですね。</dd>

<br>

### 4) style-mixingを動かしてみる
```
python run_generator.py style-mixing-example --network=gdrive:networks/stylegan2-ffhq-config-f.pkl --row-seeds=85,100,75,458,1500 --col-seeds=55,821,1789,293 --truncation-psi=1.0
```
![stylemixing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413258/eb66f3fc-6d50-0246-c98b-9f041c1c77b9.png)

<dd>下のほうは、肌や髪の毛の色がかなり影響を受けていそうですね。</dd>

<br>

意外に簡単な手順で動いたので、環境のある方はぜひお試しください。
また、冒頭にも記載しましたが、**StyleGAN2のアーキテクチャや、CPU版も別記事で記載予定**です。励みになりますので、興味のある方は、ぜひLGTMやフォローをお願いします:grinning:

# 参考サイト
[論文](https://github.com/NVlabs/stylegan2)
[StyleGAN2をWindows 10で動かす【Python】](https://self-development.info/stylegan2%e3%82%92windows-10%e3%81%a7%e5%8b%95%e3%81%8b%e3%81%99%e3%80%90python%e3%80%91/)
[CUDA+cuDNNのインストールまとめ](https://qiita.com/8128/items/2e884998cd1193f73e2f)
[NVCCについて](https://ja.stackoverflow.com/questions/42672/cuda%E3%81%AEnvcc%E3%81%A7%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%A7%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%81%97%E3%81%9F%E3%81%84%E3%81%AE%E3%81%A7%E3%81%99%E3%81%8C%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E5%87%BA%E3%81%A6%E3%81%8D%E3%81%BE%E3%81%99)

<font color="grey">
本書は筆者たちが勉強した際のメモを、後に学習する方の一助となるようにまとめたものです。誤りや不足、加筆修正すべきところがありましたらぜひご指摘ください。継続してブラッシュアップしていきます。また、様々なモデルの解説書を掲載していますので、興味のある方は、以下のサイトもご参照ください。
</font>

https://sites.google.com/deepaelurus.com/aboutus/home

© 2021 [NPO法人AI開発推進協会](https://sites.google.com/deepaelurus.com/aboutus/home)