【StyleGAN入門】「ある女性がまゆゆに変身」で遊んでみた♬

自前画像の写像潜在空間のStyleベクトルの学習ができるようになりました。
ということで、「ある女性がまゆゆに変身」で遊んでみました。
今回は、自前画像学習のためにdlibをインストールする必要があり、参考①のとおり実施して無事インストールできました。
その結果、まゆゆの潜在空間のStyleベクトル$w$を求めることが出来、以下のような変身動画ができました。
![simple_method10_1_dr1024.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/739bbc65-3531-d152-c97a-28328b6b16e4.gif)

【参考】
①[windowsでdlibインストールで詰まったときに](https://qiita.com/taungyeon/items/0afa3a5580c7521d54d1)
###やったこと
・dlibのインストール
・align_images.pyで事前処理
・まゆゆとmixing
・「ある女性がまゆゆに変身」をやってみる
###・dlibのインストール
StyleGANは学習前に画像の事前処理が必要です。
align_images.pyのコードに以下の記述があります。

```
Extracts and aligns all faces from images using DLib 
and a function from original FFHQ dataset preparation step
    python align_images.py /raw_images /aligned_images
```
つまり、全ての顔画像はalign_images.pyで事前処理が必要ということです。
そして、このDlibのインストールが難しいところでした。しかし、上述の参考①のとおり以下の手順でうまく動きました。

- pip install cmake
- Visual Studio 2019 Communityのインストール(C++によるデスクトップ開発にチェック)
- pip install dlib

###・align_images.pyで事前処理
これは生データを /raw_imgesに置き、以下のコマンドを実行するだけです。

```
python align_images.py /raw_images /aligned_images
```
その結果以下のようなaligned_imageが出力されています。

||raw_image|aligned_image|
|:-:|:-:|:-:|
|サイズ|250x235|1024x1024|
|画像|![mayuyu250px.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/d2fd1820-593e-2627-40b5-e594c294f5df.jpeg)|![mayuyu250px_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/b6d56bd5-01e6-b3d3-89c6-bc4f2db4bcae.png)|
この段階で画像は顔部分が切り出され、1024x1024に拡大されます。
この画像を利用して、以下のコマンドで写像潜在空間のStyleベクトルmayuyu.npyが学習され、latent/に格納されます。

```
python encode_images.py aligned_images/ generated_images/ latent/
```
###・まゆゆとmixing
この潜在空間のStyleベクトルを利用して、前回やったようにいろいろな画像とのMixingができます。
コードは以下を参照してください。
[StyleGAN/mayuyu_mix.py](https://github.com/MuAuan/StyleGAN/blob/master/mayuyu_mix.py)
ただし、StyleGANの$w$の変更は以下のとおりにしています。

```
style_ranges=[range(1,18)]+[range(2,18)]+[range(3,18)]+[range(4,18)]+[range(5,18)]+[range(6,18)]
```
結果は以下のとおりです。
![mayuyu250px-style-mixing_case5_6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/b7fe69f7-4352-5ed0-93df-215c6d2334a6.jpeg)
男性とのアレンジでなかなかの美人が出現しているのが、興味深いです。
全体として、range(4,18)以下は男性も女性化しているし、他の人も元の人よりはまゆゆ側の特徴が出始めています。つまり、range(0,3)で大局的なかなりの特徴がまゆゆに乗っ取られるということです。
###・「ある女性がまゆゆに変身」をやってみる
ということで、最後は交換ではなくMixingを行ってみることにします。
コードの主要な部分は、以下のとおりです。
なお、全体は以下に置きました。
[StyleGAN/simple_dlatents_mixing2.py](https://github.com/MuAuan/StyleGAN/blob/master/simple_dlatents_mixing2.py)

```simple_dlatents_mixing2.py
    # Pick latent vector.
    rnd = np.random.RandomState(6) #5
    latents1 = rnd.randn(1, Gs.input_shape[1])
    print(latents1.shape)
    # Generate image.
    dlatents1 = Gs.components.mapping.run(latents1, None) # [seed, layer, component]
    images = Gs.components.synthesis.run(dlatents1, randomize_noise=False, **synthesis_kwargs)

    src_dlatents = np.load('./latent/mayuyu250px_01.npy')
    src_dlatents = src_dlatents.reshape(1,18,512)
    src_images = Gs.components.synthesis.run(src_dlatents, randomize_noise=False, **synthesis_kwargs)
    
    for i in range(1,101,4):
        dlatents = i/100*dlatents1+(1-i/100)*src_dlatents
        # Generate image.
        images = Gs.components.synthesis.run(dlatents, randomize_noise=False, **synthesis_kwargs)
        # Save image.
        os.makedirs(config.result_dir, exist_ok=True)
        png_filename = os.path.join(config.result_dir, 'example{}.png'.format(i))
        PIL.Image.fromarray(images[0], 'RGB').save(png_filename)
```
このコードの前回からの唯一の変更は以下の部分です。
入力データsrc_dlatentsの形状を合わせています。

```py
    src_dlatents = np.load('./latent/mayuyu250px_01.npy')
    src_dlatents = src_dlatents.reshape(1,18,512)
```
こうして、上記掲載の動画が得られました。
一応、以下に再掲します。
こちらの動画は逆回しもしているので、動画は連続的になり、まゆゆを少しゆっくり見られると思います。

| 1 |![simple1_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/007811a6-9b98-41b6-403d-7c1b2abaf67f.png)|
|:-:|:-:|
|![simple3_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/4ce1161b-b4bd-00b0-3606-445d351329f9.png)|![simple_method10_1_dr.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/61c65a2a-5441-414f-4273-80f6554cc0e8.gif)|
ところで、この動画に現れる拡大画像を以下に貼っておきますが、どれが本物かわかりますか？

| 1 | 2 |3 |
|:-:|:-:|:-:|
|![example5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/f7096833-e70d-c3b3-cd9a-b0e254be1402.png)|![example1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/9d9b5bad-e926-c5b0-77f6-9b1c4c98fa95.png)|![example9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/11b21ca7-4692-1e35-c704-3b787bdafa5d.png)|
###まとめ
・自前画像「まゆゆ」の写像潜在空間のStyleベクトルを学習した
・得られたnpyを利用してMixingをやってみた
・「ある女性がまゆゆに変身」をやってみた

・いよいよアニメキャラを学習してみようかな
・動きのある動画作成してみようかな