Ubuntu 20.04 + StyleGAN2 でアニメキャラを生成してみた

Ubuntu 20.04 上で StyleGAN2 を動かし、アニメキャラの顔を生成してみました。
なお、学習データの収集やモデルのトレーニングには非常にコストがかかるため、今回は有志による学習済みモデルを使用させていただきました。

StyleGAN2 の公式の GitHub リポジトリは以下
https://github.com/NVlabs/stylegan2

## 参考
- [StyleGANとStyleGAN2を使って美少女キャラを無限増殖させる](https://blog.tubone-project24.xyz/2020/05/03/stylegan2-anime)
- [Ubuntu 20.04 LTSにnvidia-driver-440とcuda-toolkit-10-1とcuDNNを入れた話](https://k-hyoda.hatenablog.com/entry/2020/07/09/223907)
- [「Ubuntu 20.04 LTS 日本語 Remix」に「CUDA 10.0」＋「TensorRT 7.0.0」をインストールする](http://home.hatanaka.info/article/475167174.html)
- [【Keras/TensorFlow】GPUを使うまでの手順と注意点などを解説します](https://keita-blog.com/data_science/keras-tensorflow-gpu)
- [StyleGAN2でアニメキャラクターを生成する](https://ichi.pro/stylegan-2-de-anime-kyarakuta-o-seiseisuru-122642348516219)
- [Tensorflow GPU, CUDA, CuDNNのバージョン早見表](https://qiita.com/chin_self_driving_car/items/f00af2dbd022b65c9068)

## 環境
- Ubuntu 20.04 LTS
- GPU: GTX GeForce 1080Ti
- NVIDIA Driver 460.73.01
- CUDA 10.0
- cuDNN 7.4.2
- Python 3.6.9
- TensorFlow 1.14

## NVIDIA Driver インストール
[こちら](https://qiita.com/kenji-miyake/items/06b8c3807bef0ba5c451)を参考にインストールします。私の環境ではバージョン 460.73.01 でした。

## GCC 7 インストール
CUDA 10.0 のインストールに GCC 7 が必要なので入れます（Ubuntu 20.04 のデフォルトは GCC 9）

```bash
sudo apt install gcc-7
sudo apt install g++-7

# 優先度を設定
# gcc-7 の方が大きければ数値はなんでもいい
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 50
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 50
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 100
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 100

# バージョン変更できたか確認
gcc --version
```

## CUDA 10.0 インストール
[CUDA Toolkit 10.0 Archive](https://developer.nvidia.com/cuda-10.0-download-archive?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1804&target_type=debnetwork) で Linux->x86_64->Ubuntu->18.04->deb(network) を選択し、指示に従ってインストールします。**最後のインストールコマンドのみ異なります。**

1. Download ボタンから Base Installer をダウンロード
1. 以下のコマンドでインストール

```bash
sudo dpkg -i cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
sudo apt-get update
sudo apt-get install cuda-10-0 # ここが違う

# 確認
cat /usr/local/cuda/version.txt
```

## cuDNN 7.4.2 インストール
[cuDNN Archive](https://developer.nvidia.com/rdp/cudnn-archive)から **Download cuDNN v7.4.2 (Dec 14, 2018), for CUDA 10.0** を選び、以下の3つをダウンロードします。

- cuDNN Runtime Library for Ubuntu18.04 (Deb)
- cuDNN Developer Library for Ubuntu18.04 (Deb)
- cuDNN Code Samples and User Guide for Ubuntu18.04 (Deb) <-なくても問題はない

次に、ダウンロードしたディレクトリに移動し、以下のコマンドでインストールします。

```bash
sudo dpkg -i libcudnn7_7.4.2.24-1+cuda10.0_amd64.deb
sudo dpkg -i libcudnn7-dev_7.4.2.24-1+cuda10.0_amd64.deb
sudo dpkg -i libcudnn7-doc_7.4.2.24-1+cuda10.0_amd64.deb
```

[こちら](https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html#upgrade)を参考にして、動作確認を行います。

```bash
# 過去に他のバージョンを入れていた場合
sudo update-alternatives --config libcudnn

# 動作確認
cp -r /usr/src/cudnn_samples_v7/ $HOME
cd  $HOME/cudnn_samples_v7/mnistCUDNN
make clean && make
./mnistCUDNN # Test passed! と出れば OK
```

## Python 3.6.9 インストール
各々の方法でインストールしてください。私は pyenv で管理しています。

```bash
pyenv install 3.6.9
pyenv versions
```

## TensorFlow 1.14 インストール
```bash
pip install tensorflow==1.14
pip install tensorflow-gpu==1.14
```

Python で以下のコードを実行します。

```python
# バージョン確認
import tensorflow as tf
print(tf.__version__)

# TensorFlow が GPU を認識しているか確認
# device_type: “GPU” と出れば OK
from tensorflow.python.client import device_lib
device_lib.list_local_devices()
```

## StyleGAN2 でサンプルを実行
```bash
git clone https://github.com/NVlabs/stylegan2.git
cd stylegan2
/usr/local/cuda/bin/nvcc test_nvcc.cu -o test_nvcc -run
# 以下のように出れば OK
# CPU says hello.
# GPU says hello.

# サンプルの学習済みモデルで画像を生成
python run_generator.py generate-images --network=gdrive:networks/stylegan2-ffhq-config-f.pkl --seeds=6600-6625 --truncation-psi=0.5
```

|オプション|説明|
|--------|---|
|--network|`.pkl` ファイルへのパスを指定する。`pretrained_networks.py` に追記することでエイリアスを設定できる。|
|--seeds|乱数で画像の枚数を指定する。乱数が変わると生成される画像も変わる。`1-10` だと10枚生成され、`10,20,30` などとすると3枚生成される。|


このように人間の顔が26枚生成されていれば大丈夫です。（`results` 内にあります）
![seed6600.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462051/7c5ba811-434d-6c4e-4d25-2f1ea0a648d7.png)


## StyleGAN2 でアニメキャラを生成
本題です。
有志の方がモデルを公開しているので、ありがたく使わせていただきます。
[Making Anime Faces With StyleGAN](https://www.gwern.net/Faces#stylegan-2)
こちらのページにリンクがあります。
https://mega.nz/#!PeIi2ayb!xoRtjTXyXuvgDxSsSMn-cOh-Zux9493zqdxwVMaAzp4
ダウンロードした `.pkl` ファイルを `stylegan2` 内に置きます。

```bash
python run_generator.py generate-images --network=2020-01-11-skylion-stylegan2-animeportraits-networksnapshot-024664.pkl --seeds=1-9
```

無事生成できました！（imagemagick で画像をまとめています）
ほとんど違和感がありません。すごい...
![out.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462051/26ef49a2-7a12-cbc9-7010-fc64c39a861b.png)


次に、男性キャラを生成してみます。
[先程のページ](https://www.gwern.net/Faces#anime-faces-male-faces)の `ANIME FACES → MALE FACES` にてモデルをダウンロードできます。
https://mega.nz/#!fMNDkYwS!X-7_nBtsC6P_09CINIJAoVqR3V8Ffbv5On74rVoUbik

`run_generator.py` のもう一つのコマンドである `style-mixing-example` を使ってみます。

```bash
python run_generator.py style-mixing-example --network=2019-05-03-stylegan-malefaces-02107-069770.pkl --row-seeds=1-5 --col-seeds=1-5
```

このような画像ができました。こちらも自然な顔が生成できています。
![grid.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462051/cb0e27eb-942a-dddf-4203-7c18b24b5ed2.jpeg)

seeds を変えると顔も変わるので、色々試してみると面白いです。

## 最後に
[こちら](https://lionbridge.ai/ja/datasets/top-25-anime-manga-and-video-game-datasets/)でも紹介されていますが、機械学習用にデータをまとめてネットで公開している方もいるようなので、こういったものを使って自分でも学習させてみたいと思いました。
また、Lightweight GAN という個人の PC でも学習可能なものもあるようなので、そちらも試してみようと思います。