【簡単】StyleGAN2でアニメキャラの超高解像度生成を試す

こんばんは。
今回は（何番煎じかはわかりませんが）高精細出力すぎるで有名な**StyleGAN2**を使ってアニメ（風）キャラの生成を試してみました。


~~画像生成を簡単に試せる**[Make AnimeFace](https://ai.0115765.com/makeface)**を公開しました。ぜひお試しください。~~
**追記(6/23):システム改組のため一時停止しています。AniAutoとして再公開予定。**
**追記(8/1)：[Pixivにサンプル公開](https://www.pixiv.net/artworks/91474635)しました。**

※この記事では「試す」事が趣旨のため、実際に**Pythonでコードを書いたりといった本格的な実装は行いません**。その辺のご理解をよろしくおねがいします。

StyleGANの凄さやディープラーニングではこんなことができるよっていうGANに関する簡単な概念及び全体像を把握していただければ幸いです。

はじめにGANとStyleGANの概念的なものを（この記事で書くかは迷いましたが）ざっとご紹介します。とりあえず結果を見せろって方はWhat's～をスキップしてください。
わかりやすいように数式や専門用語等を極力控えて説明しているため本質的な理解にはならないかもしれませんがご了承ください。

# What's GAN?

GANとは敵対的生成ネットワークの略称でいわゆる**人工知能のアルゴリズムの一つ**です。

互いに競合し合う2つのニューラルネットワークにより実装されており、画像生成を例とするとニセ画像を生成する**Generator（生成器）**とそれがニセモノかどうか判断する**Discriminator（識別器）**の2種類が**互いに勝負することで生成の精度を高くしていく**っていう認識を持っていただければ大丈夫です。

よくGANにおける**GeneratorとDiscriminatorは「本当っぽい嘘をつく不審者」と「その嘘を見破ろうとする警察官」の関係にあると例えられます**よね。（個人的には被疑者と検察の取り調べで例えてました）

それからGANについての研究が進められDCGAN,GCGAN,W-GANといったより精度の高い派生が多く生まれてきました。
特にDCGANは学習をCNN(畳み込みニューラルネットワーク)を使うことで有名だと思います。私も以前DCGANを使って実装してみたことがあります。（隙きあらば自分語り）

# What's StyleGAN2?
StyleGAN2を一言で説明すると「**超高画質なGANの一種であるStyleGANの改良版だよ**」です。
↓がStyleGAN2で生成した画像です。
![画像_2021-03-09_212741.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513165/2554cdc2-6fa6-d2d8-8d71-68a4d5a63f0b.png)
当たり前ですが誰が撮ったものでもないし画像の中の人は実在しません。

StyleGANの長所はなんと言っても**超高画質**ってことです。上記画像は1024ピクセルです。すごい…！
私もPytorchを使ってDCGANで画像生成をやってみたことがあるのですが**個人のパソコンで学習させるのはせいぜい縦横128ピクセルでの生成が限界でした。**（もっとがんばれたかもしれませんが如何せんGPUの性能もあるしデータセットの準備もあるしできつかった記憶があります。）

StyleGANは**NVIDIAが開発したもの**です。GeForceやQuadroを長年手がけてるいわばGPUの超プロフェッショナルであるNVIDIAなら納得できます。
**PGGAN(Progressive Growing of GANs)**からインスピレーションを受けており、一気に高画質画像を生成するのではなく、**低画質からだんだんと(漸近的に)高画質に成長させていく**という特徴があります。
つまり一旦初期の低解像度生成のときに輪郭と言った大まかな特徴を再現し、後の高解像度生成のときに目や口と言った細かな特徴を再現することで非常に質の高い生成ができます。

AdaINが～とか、もっと細かくStyleGANについてかければいいんですけどこれを言い出したらきりがないのであとはリポジトリや論文を見てください（放棄）それかググれ。
GANは本当にいろんな派生がありますので、それぞれのアーキテクチャを見てみると結構面白いですよ！
【GitHub】[https://github.com/NVlabs/stylegan2](https://github.com/NVlabs/stylegan2)
【論文】[https://arxiv.org/abs/1912.04958](https://arxiv.org/abs/1912.04958)

# 実際に試す。
話は長くなりましたが本題です。実際にやってみましょう。
## 環境構築
### 動作環境
StyleGAN2は一応去年に流行ったやつなんで環境も去年と同じにしないといけません(´・ω・｀)
以下がソフトウェアの動作要件です。

- **Python 3.7**
- **CUDA ToolKit 10.0**
- **cuDNN 7.4**
- **Tensorflow 1.14**

はい。確かに一年前ですね。**Tensorflow1.14以上**(2.x系)**が使えない**ため、pipでのインストール等々の関係のせいでPython3.7以降も使えません。めんどくさいなぁ…
### Tensorflowインストール
Tensorflow1.14をインストールする詳しいやり方は以下の私の記事を参考にしてください。
[https://0115765.com/archives/1064](https://0115765.com/archives/1064)
ここでは大まかに書きます。

※Linux＋Dockerのほうがいいらしいですが今回は都合上Windowsでやってみます。

Python 3.7.9を[ダウンロード（直リン）](https://www.python.org/ftp/python/3.7.9/python-3.7.9-amd64.exe)してインストールしてください。
次にCUDAを10.0を[ダウンロード](https://developer.nvidia.com/cuda-10.0-download-archive)してインストールしてください。
cuDNN7.4は[公式サイト](https://developer.nvidia.com/cudnn)からダウンロードできますがNVIDIA Developerアカウントが要ります。適宜取ってください。
DLしたらフォルダ内部すべてを**C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0**へ移動＆以下のように環境変数を追加してください。
![画像_2021-03-09_224207.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513165/de050cb0-8736-87c7-d5ff-2dad20bab77e.png)
最後にpipでTensorflowインストールしましょう。

```cmd.exe
pip install -U pip setuptools
pip install -U tensorflow-gpu==1.14 tensorflow_datasets
```

これでおｋです。
#### 動作確認
Pythonのインタラクティブシェルで以下を入力。
`import tensorflow as tf; print( tf.__version__ )`でバージョン確認。
`from tensorflow.python.client import device_lib; print(device_lib.list_local_devices())`でCUDAをが動くか確認。
![画像_2021-03-09_224551.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513165/ce25f4c5-b99f-3316-c9ab-cf872865faf3.png)
問題なければおｋです。
### いろいろDL
さっきも書いたんですけど高画質で出力可能が故に学習の際にとんでもない時間とリソースがかかります。なので今回は予め大量のアニメ画像で学習した**トレーニング済みのファイルを公開している聖人がいる**のでそこからダウンロードしまて使用します。
[紹介ページ](https://www.gwern.net/Faces#stylegan-2) | [ダウンロードリンク(mega.nz)](https://mega.nz/file/eQdHkShY#8wyNKs343L7YUjwXlEg3cWjqK2g2EAIdYz5xbkPy3ng)

あといちばん大事なStyleGANをクローンしてください。（あと、さっきDLしたpklファイルも入れてください）

```cmd.exe
git clone https://github.com/NVlabs/stylegan2
```

### cl.exeのやつ。
StyleGAN2を動かすには**Visual C++のコンパイラが必要です**
なのでVisual Studio 2017でC++をの開発環境をインストールしてください。**2019じゃないです2017です！（怒）**
2019だと以下のエラーが出ます。めんどくせぇ…

```
host_config.h(143): fatal error C1189: #error:  -- unsupported Microsoft Visual Studio version! Only the versions between 2013 and 2017 (inclusive) are supported!
```
インストールが終わったらあとはパスを通すだけ。
人により違うと思うんですけど私は**C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.23.28105/bin/Hostx64/x64にcl.exe**にありました。
これでコンパイラが使えたのでclを入力してチェック。
![画像_2021-03-10_000021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513165/28c13ac6-c17c-09c2-4d34-b11048562b6f.png)
おｋなら**stylegan2/dnnlib/tflib/custom_ops.py**内のsompiler_bindir_search_pathにさっきのcl.exeのあるディレクトリのフルパスをコピー。
![rapture_20210308223738.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513165/57455783-ff48-52ef-7ad4-dab406bb7ecb.png)
これで完了です。

## 実践
いざやってみます。
さっきクローンしたフォルダ内にある`run_generator.py`がpkl形式の学習済みモデルをもとに画像を生成するためのPythonファイルです。
StyleGANのディレクトリでコマンドプロンプトを起動し、以下を入力。

```cmd.exe
python run_generator.py generate-images --network=＜pklファイル＞ --seeds=6600-6625
```

重要なパラメータは以下の通り。

- `--seeds`→生成するシード値的なやつ。(ex.`6000-6025`にしたら26件生成されます。`135,541,654`にしたら該当シード値の画像3枚分が生成されます。)
- `--network`→学習済みモデルの参照。

### 結果
今回はシード値4000～4200の201件ほど生成してみました。
結果は以下のGitのrepoに上げてます。
[https://github.com/tomomi0115/stylegan2-generated-image](https://github.com/tomomi0115/stylegan2-generated-image)

その中からできが良いやつをご紹介します。
![rapture_20210309234431.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513165/648b0c34-ed86-9ba6-9e7f-9d9a90628ae6.png)
画像サイズは**512ピクセル**です。因みに左上のやつは[Twitter@ichii731](https://twitter.com/ichii731)のアイコンでした。

## おわりに
今回は一応コードを書いてるわけじゃないんですけど画像を生成してみました。
なんか今更気づいたんですけど**Pytorch版もあるらしい**ので私はそれで実装してみたいと思います。
参考になれば幸いです。。。