自前画像の写像潜在空間のStyleベクトルの学習ができるようになりました。
ということで、「ある女性がまゆゆに変身」で遊んでみました。
今回は、自前画像学習のためにdlibをインストールする必要があり、参考①のとおり実施して無事インストールできました。
その結果、まゆゆの潜在空間のStyleベクトル$w$を求めることが出来、以下のような変身動画ができました。
【参考】
①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 |
画像 | ||
この段階で画像は顔部分が切り出され、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)]
結果は以下のとおりです。
男性とのアレンジでなかなかの美人が出現しているのが、興味深いです。
全体として、range(4,18)以下は男性も女性化しているし、他の人も元の人よりはまゆゆ側の特徴が出始めています。つまり、range(0,3)で大局的なかなりの特徴がまゆゆに乗っ取られるということです。
###・「ある女性がまゆゆに変身」をやってみる
ということで、最後は交換ではなくMixingを行ってみることにします。
コードの主要な部分は、以下のとおりです。
なお、全体は以下に置きました。
StyleGAN/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 | |
---|---|
ところで、この動画に現れる拡大画像を以下に貼っておきますが、どれが本物かわかりますか? |
1 | 2 | 3 |
---|---|---|
###まとめ | ||
・自前画像「まゆゆ」の写像潜在空間のStyleベクトルを学習した | ||
・得られたnpyを利用してMixingをやってみた | ||
・「ある女性がまゆゆに変身」をやってみた |
・いよいよアニメキャラを学習してみようかな
・動きのある動画作成してみようかな