5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-01-05

自前画像の写像潜在空間のStyleベクトルの学習ができるようになりました。
ということで、「ある女性がまゆゆに変身」で遊んでみました。
今回は、自前画像学習のためにdlibをインストールする必要があり、参考①のとおり実施して無事インストールできました。
その結果、まゆゆの潜在空間のStyleベクトル$w$を求めることが出来、以下のような変身動画ができました。
simple_method10_1_dr1024.gif

【参考】
windowsでdlibインストールで詰まったときに
###やったこと
・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 mayuyu250px_01.png
この段階で画像は顔部分が切り出され、1024x1024に拡大されます。
この画像を利用して、以下のコマンドで写像潜在空間のStyleベクトルmayuyu.npyが学習され、latent/に格納されます。
python encode_images.py aligned_images/ generated_images/ latent/

###・まゆゆとmixing
この潜在空間のStyleベクトルを利用して、前回やったようにいろいろな画像とのMixingができます。
コードは以下を参照してください。
StyleGAN/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
男性とのアレンジでなかなかの美人が出現しているのが、興味深いです。
全体として、range(4,18)以下は男性も女性化しているし、他の人も元の人よりはまゆゆ側の特徴が出始めています。つまり、range(0,3)で大局的なかなりの特徴がまゆゆに乗っ取られるということです。
###・「ある女性がまゆゆに変身」をやってみる
ということで、最後は交換ではなくMixingを行ってみることにします。
コードの主要な部分は、以下のとおりです。
なお、全体は以下に置きました。
StyleGAN/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の形状を合わせています。

    src_dlatents = np.load('./latent/mayuyu250px_01.npy')
    src_dlatents = src_dlatents.reshape(1,18,512)

こうして、上記掲載の動画が得られました。
一応、以下に再掲します。
こちらの動画は逆回しもしているので、動画は連続的になり、まゆゆを少しゆっくり見られると思います。

1 simple1_.png
simple3_.png simple_method10_1_dr.gif
ところで、この動画に現れる拡大画像を以下に貼っておきますが、どれが本物かわかりますか?
1 2 3
example5.png example1.png example9.png
###まとめ
・自前画像「まゆゆ」の写像潜在空間のStyleベクトルを学習した
・得られたnpyを利用してMixingをやってみた
・「ある女性がまゆゆに変身」をやってみた

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

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?