lucky rubbit

東方アレンジャーが東方アレンジを語る(かもしれない)。

VAEGANを実装してみた

アバターが欲しい

アバターアイコンが欲しい。でも他所様からパクってくるのもどうかと思う。

そうだ、深層学習で機械に描かせよう。

 

VAE + GAN

生成モデルでパッと思いつくのは"VAE"と"GAN"の二つ。

GANのGeneratorをVAEに置き換えたものをVAEGANと呼ぶらしい。

VAEによるGeneratorで、特徴を連続的に変化するような画像を生成できる。

 

モデル

f:id:lucky_rubbit:20191204225108p:plain

VAEGAN model

EncoderとDiscriminatorにはそれぞれResNet50を転移学習させた。

DecoderではSRResNetを模したネットを組んでいる。

 

実装

colab.research.google.com

教師データはDanbooruからランダムに落とした、うどんげのイラスト200枚ほどの顔をクロップ、224x224へリサイズした。

学習の手順は

  1. VAEをEpoch数100で学習
  2. 潜在変数zをN(0, 1)のガウシアンノイズとし、生成された画像をFake(label: 0)としてDを学習
  3. 教師画像をReal(label: 1)としてDを学習

上記を100 Iteration繰り返す。

損失関数は以下の感じに。

 L_G(x, \hat{x}) = MSE(x, \hat{x}) + \alpha KL \\ L_D(x, \hat{x}) = binarycrossentropy(x, \hat{x})

ここでaは適当に0.000001とした。

最適化関数はAdamを使用。

 

結果

とりあえずアバター候補を

f:id:lucky_rubbit:20191204232258p:plain

アブストラクトな感じが良い。

他には

f:id:lucky_rubbit:20191204232529p:plain

f:id:lucky_rubbit:20191204232545p:plain

f:id:lucky_rubbit:20191204232600p:plain

f:id:lucky_rubbit:20191204232612p:plain

f:id:lucky_rubbit:20191204232625p:plain

考察

VAEのみで生成した画像と比較する。

f:id:lucky_rubbit:20191204232950p:plain

これと比べると、なんとなく線がはっきりしているように思える。

VAEGANは、顔のパーツを複数のイラストから寄せ集めてキメラのような生成をしているように思えた。わかりやすいのが以下の画像。

f:id:lucky_rubbit:20191204233406p:plain

それぞれの目と口の画風が異なるが、それっぽい位置に置かれている。

GANの特性で、目と口の適切な位置を学習したという事だろうか。