【StyleGAN２入門】10個のアニメ顔で独自学習♬

StyleGANに引き続いて、StyleGAN2でもアニメ顔の独自学習をやってみた。
結論から言うと、config-aは学習できたが、config-bからconfig-fは環境が整っていない。
とはいえ、ほぼコードは見えてきたので、一度まとめておこうと思う。
特に今回は、10個のみのアニメ顔でどこまで学習するかをやってみた。
【参考】
①[NVlabs/stylegan2](https://github.com/NVlabs/stylegan2)
②[stylegan2で独自モデルの学習方法](http://blog.livedoor.jp/tak_tak0/archives/52424358.html)

###やったこと
・環境
・10個のアニメ顔で学習
・出力してみる
・出力画像とオリジナル画像
###・環境
StyleGAN2の環境は以下のとおり

```
Requirements
・Both Linux and Windows are supported. 
・Linux is recommended for performance and compatibility reasons.
・64-bit Python 3.6 installation. We recommend Anaconda3 with numpy 1.14.3 or newer.
・TensorFlow 1.14 or 1.15 with GPU support. The code does not support TensorFlow 2.0.
・On Windows, you need to use TensorFlow 1.14 — TensorFlow 1.15 will not work.
・One or more high-end NVIDIA GPUs, NVIDIA drivers, CUDA 10.0 toolkit and cuDNN 7.5. ・To reproduce the results reported in the paper, 
　　　　　you need an NVIDIA GPU with at least 16 GB of DRAM.
・Docker users: use the provided Dockerfile to build an image with the required library dependencies.

・StyleGAN2 relies on custom TensorFlow ops that are compiled on the fly using NVCC. 
To test that your NVCC installation is working correctly, run:
nvcc test_nvcc.cu -o test_nvcc -run
| CPU says hello.
| GPU says hello.
・On Windows, the compilation requires Microsoft Visual Studio to be in PATH. 
We recommend installing Visual Studio Community Edition and adding into PATH 
using "C:\Program Files (x86)\Microsoft
VisualStudio\2019\Community\VC\Auxiliary\Build\vcvars64.bat".
```
ところが、一応整ったと思ったところでconfig-a以外は、以下のエラーを吐いて止まってしまう。

```
 File "C:\Users\user\Anaconda3\envs\keras-gpu\lib\site-packages\tensorflow\python\framework\tensor_shape.py", line 185, in __init__
    self._value = int(value)
TypeError: int() argument must be a string, a bytes-like object or a number, not 'Tensor'
```
###・10個のアニメ顔で学習
ということで、今回はconfig-aすなわちStyleGANで学習を試みた。
まず、準備として
⓪アニメ顔を１０枚選んで、[前回と同様にcustom_dataset-r02.tfrecordsを作成](https://qiita.com/MuAuan/items/aec7feabaa2f738ea82c)する

コードは以下のとおりで、1060で動くように変更する。
コード全体は以下においた。
[StyleGAN2/run_training.py /](https://github.com/MuAuan/StyleGAN2/blob/master/run_training.py)
変更な主な部分は、以下のとおり
①ターゲット解像度＝６４とした
以下のコードで読み込むとサイズ（128,128）の画像も（64，64）で読み込め、StyleGANのネットワーク構造のものとなる。

```run_training.py
    dataset_args = EasyDict(tfrecord_dir=dataset, resolution=64)  #, resolution=64
```
②初期解像度も64とした
これはStyleGANはpGANなので学習が進むとだんだん次元が大きくなるが、今回はどうもそれがうまく動かないので、最初からターゲットな解像度の64にしてやってみたら収束しだしたのでこれを採用した

```run_training.py
sched.lod_initial_resolution = 64 #8
```
run_training.pyのそのほかの変更は上記のコード全体を見てほしい
③これだけだとメモリーエラーを吐いて止まってしまうのでdataset.pyの以下の部分を変更します。
[StyleGAN2/training/dataset.py](https://github.com/MuAuan/StyleGAN2/blob/master/training/dataset.py)

```training/dataset.py
# Load labels.
        assert max_label_size == 'full' or max_label_size >= 0
        #self._np_labels = np.zeros([1<<30, 0], dtype=np.float32)
        self._np_labels = np.zeros([1<<20, 0], dtype=np.float32)
```
④最後に学習が時間かかるのとHDDのメモリーが不足気味なので毎回出力に変更
[StyleGAN2/training/training_loop.py ](https://github.com/MuAuan/StyleGAN2/blob/master/training/training_loop.py)

```training/training_loop.py
    image_snapshot_ticks    = 1,  #50     # How often to save image snapshots? None = only save 'reals.png' and 'fakes-init.png'.
    network_snapshot_ticks  = 1, #50      # How often to save network snapshots? None = only save 'networks-final.pkl'.
．．．
            if network_snapshot_ticks is not None and (cur_tick % network_snapshot_ticks == 0 or done):
                #pkl = dnnlib.make_run_dir_path('network-snapshot-%06d.pkl' % (cur_nimg // 1000))
                pkl = dnnlib.make_run_dir_path('network-snapshot-.pkl')
                misc.save_pkl((G, D, Gs), pkl)
```
###・出力してみる
出力例のミキシングやってみる

```
# Example of style mixing (matches the corresponding video clip)
python run_generator.py style-mixing-example --network=./results/00007-stylegan2-custom_dataset-1gpu-config-a/network-final.pkl --row-seeds=85,100,75,458,1500 --col-seeds=55,821,1789,293 --truncation-psi=1.0
```
以下のとおり、学習できている。
![grid.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/dddbe14d-3dce-a9a3-3a66-bac933795022.png)
また、前回のStyleGANのミキシングも以下のコードで実施できた。
![example_256_4705_50_52x11.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/44735514-4cea-d0cf-4184-f6597237aa8c.gif)
そして、適当に100枚出力してみると以下のように出力した。
![example256_1000_100.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/f82ab3a8-6a3a-cad8-6103-f163f1cd683b.gif)
[StyleGAN2/pretrained_example.py](https://github.com/MuAuan/StyleGAN2/blob/master/pretrained_example.py)
###・出力画像とオリジナル画像
最後に一番の興味はこうして生成される画像はオリジナルとは異なるのかという疑問の解釈の一助として以下の画像を貼っておく
※これらの画像はシステマティックに乱数で100枚生成したものからの抜粋である

|元画像|![0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/78f82936-e01d-7c89-01d1-4640274fa152.png)|![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/1913d88f-ca62-303d-b84c-05ba8059d35d.png)|![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/0e843d41-480b-9ce2-000c-1e605152eb74.png)|![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/0325d323-7890-5e8b-1afe-2c3fe77eff2c.png)|![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/d1ae9aae-5e47-4b5a-4be8-5627955dedd5.png)|
|:-:|:-:|:-:|:-:|:-:|:-:|
|生成画像|![example0_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/c12e778e-06df-0e92-716c-c83d77865e29.png)|![example1_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/398337e3-599b-db29-ad42-b91e29da5ada.png)|![example2_79.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/27ede81d-0ad3-0261-16e0-75bdcb9bcdd6.png)|![example3_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/01dc0240-dd9b-fa61-63c3-6af4a12698f2.png)|![example4_91.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/b2e8c5fd-c8a5-1ade-f8a7-3216db0755c5.png)|

|元画像|![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/a78ba438-1dc7-7e2d-5b74-0279d1356ddd.png)|![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/d4825d0e-35e7-62a7-5b41-99530a871c91.png)|![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/a0556895-aa77-00b7-f0b5-63341509f6fa.png)|![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/a99c6d37-0ec3-b4b7-588c-a0420e8a8bfa.png)|![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/5c5323c8-ae38-24b9-5c71-352a072cf975.png)|
|:-:|:-:|:-:|:-:|:-:|:-:|
|生成画像|![example5_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/53fef6dc-0b15-3a1c-a4d0-9c401cc75ef5.png)|![example6_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/0c692bef-15bc-aa54-65bc-03ae213ecffb.png)|![example7_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/f4b81dce-a918-90e3-e1a5-79e4c8fbbe08.png)|![example8_78.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/13f18332-75ad-e43e-8048-1137cb947259.png)|![example9_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/199da7c2-c088-108d-31ca-49377ab743e9.png)|
###まとめ
・10枚のアニメ顔でStyleGANの学習が出来た
・生成画像にはオリジナル画像が含まれると解釈できる

・次回は1080マシンで高解像度に挑戦したいと思う