stylegan2による猫画像生成

はじめに

GANの一種であるstylegan21を使い、
Oxford-IIIT2の猫画像を学習して、結果を解析した。

stylegan2

Generative Adversarial Network (GAN)3は2つのネットワークが
競い合うように学習することでリアルな画像生成を行うアルゴリズムである。

オリジナルのGANは1つのノイズから画像を生成できるように生成器(Generator)
を学習するが、近年のstylegan4, stylegan25などはニューラルネットの各層に
ノイズを付与するように学習することで、画像生成時にグローバルな構造と ローカルな構造をある程度制御できる。

styleganに関する解説はすでに多くのweb記事があるので詳細は省く。

参考 : https://medium.com/@akichan_f/gan%E3%81%AE%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89stylegan2%E3%81%BE%E3%81%A7-dfd2608410b3
https://qiita.com/YasutomoNakajima/items/1e0153cfb598641f5c9b
https://www.slideshare.net/KentoDoi/stylegan-cvpr2019dena

重要な点は

  • ノイズをMLPに通して特徴量空間を綺麗にする(disentangle)
  • MLPを通したノイズ(style noise)を各層に入れる
  • 学習時に一定確率でネットワークの前半部と後半部のstyle noiseを入れ替える(mixing)
  • style noiseとは独立なノイズ(ここではnoiseと表記)を各層に足す

人の顔を学習した場合、noiseは髪の重なりや顔のシワ、目の開き方などの細かい要素を制御し、
前半層のstyle noise は顔の向きなどのグローバルな構造、
後半層のstyle noise は髪色などの情報を制御できるように学習が進む。

今回は以下のpytorch実装を利用させていただいた。
https://github.com/rosinality/stylegan2-pytorch

Oxford-IIIT

Oxford-IIITデータセットはペットの犬・猫の画像データセットである。
http://www.robots.ox.ac.uk/~vgg/data/pets/
猫画像2371枚、犬画像4978枚のデータセットである。

画像だけでなく、前景と背景、輪郭線情報も含んでいるため、 必要な部分だけを利用する前処理がしやすい。 今回は以下の前処理を行った。

  • annotation領域以外を白塗りにする
  • annotation領域の中心から正方形に切り出す
  • 128 x 128にリサイズ

f:id:nakamrnk:20200729060144j:plain

やや輪郭付近に周辺情報も含まれてしまうのは気になるが、
背景情報をほぼ含まない猫中心の画像となる。

検証結果

学習経過

FIDスコアはGANの性能評価に使われる指標の一つで、
生のデータセットとGANによって生成された画像群に対して、
学習済みニューラルネットによって抽出した特徴量の分布が
どれほど似ているかの指標である。
低いほど性能が高く、 完全に再現できている場合は0となる。
GANについての指標は色々あるようだが6
今回はとりあえずこの指標を用いる。

f:id:nakamrnk:20200729063714j:plain FIDスコアの学習曲線は20000 iteration程度である程度収束し、
その後も徐々に性能が向上している。

10000 Iteration f:id:nakamrnk:20200729063830p:plain

20000 Iteration f:id:nakamrnk:20200729063947p:plain

40000 Iteration f:id:nakamrnk:20200729064015p:plain

生成画像を見る限りはFIDスコアによる評価結果は感覚的には正しく感じる。
10000 Iterationでは猫の輪郭くらいしか再現できておらず、
20000 Iteration で猫らしくなってきているが、目や鼻の構造が歪んでいる。
40000 Iterationになるとかなり現実の猫画像に近くなっている。

noiseの影響

style noiseでないnoiseの影響を示したのが以下の図である。

f:id:nakamrnk:20200729065432p:plain

左5列はある特定のstyle noiseに対してnoiseだけを変化させた画像であり、
右から2番目の列はその平均画像、右端は標準偏差画像である。

平均画像でぼやけている部分や、標準偏差画像で値が高い部分は
noiseにより変化が大きい部分である。

この結果より、noiseが変化させているのは主に輪郭部分の構造(切り抜き背景)や 毛並みなどであり、ポーズや毛の色などにはほとんど影響していない
ことが分かる。

特徴量空間補間

styleganの特徴の一つにstyle noiseをMLPに通すことで特徴量空間がなめらかになる
ことがある。ここではその効果を検証する。

f:id:nakamrnk:20200729070143p:plain

この図の対角画像は元の画像であり、非対角な部分にある画像は
それぞれ対角画像のノイズ空間平均画像である。
例えば(2, 1)にある画像1と画像2のstyle noiseを平均した画像である。
いくつかの画像( (5, 1), (4, 2)など)は2つの画像の中間と言われれば
納得できるが、片方の影響が強く出過ぎている画像(3, 1)や
どちらにも似ていない画像(4, 3)など補間として微妙な画像もある。

次も同じような補間画像であるが、今回は補間を元のノイズ空間ではなく、
MLPを通した後の特徴量空間で行った画像である。

f:id:nakamrnk:20200729070431p:plain

この場合の平均画像は元のノイズ空間で平均したものと比べると
どちらかの画像に寄りすぎていることもなく、 2つの画像の中間としては適切に感じる。
MLP層を通すことにより特徴量空間が滑らかになっているためと思われる。

mixing

styleganのもうひとつの特徴は学習時に前半部と後半部でstyle noise
を入れ替えるmixingを行っていることである。
これにより推論時に複数の画像のstyle を混ぜることができる。

 mixing (8層 : ネットワーク後半)

f:id:nakamrnk:20200729072254p:plain

この図はgeneratorの前半部と後半部でstyle noiseを入れ替えた図である。
(2, 1)の画像は前半部は画像1, 後半部は画像2のstyle noiseを用いた画像であり、
(1, 4) は前半部4, 後半部1である。 対角成分は元画像のままである。

8層目はネットワークの後半であり、ここでmixingしても
全体の色が変わるくらいで、構図は変わらない。

 mixing (4層 : ネットワーク中盤)

f:id:nakamrnk:20200729073442p:plain

ネットワークの中盤である4層でmixingを行うと、8層でのmixing
よりもグローバルな構造が変化していることが分かる。
(1, 4)の画像を比較すると8層でのmixingのでは、単に全体の色が
画像1になった画像4だったが、4層でのmixingでは鼻の形や
目の構造などが画像1に近くなっている。
また, (4, 5)を比較すると分かるように顔付近だけ黒いといった、
中域的なスケールの色構造も後半部画像のスタイルに近くなっている。

このことからそういった情報は4~8層当たりのstyle noiseが担っている
ことが分かる。

 mixing (2層 : ネットワーク序盤)

f:id:nakamrnk:20200729075047p:plain

2層での入れ替えでは体の向きなどの全体構造も後半部styleに
影響を受けるようになっている。

style 制御ムービー

f:id:nakamrnk:20200729075747g:plain

styleの後半部を固定して、前半部だけを変化させることで
同じ猫に対して姿勢だけ変化させるムービーができる。
上図は左からそれぞれ2, 3, 4層を前半部とした補間ムービーである。
このデータの場合は2, 3層に姿勢情報が含まれているようなので、
4層当たりでmixingするのが良さそうに見える。

まとめ

今回はstylegan2による猫画像生成を検証してみた。
stylegan2の特性がある程度理解できたが、
画像を切り取ったが故に輪郭が強く出過ぎているように感じるため
切り取らずにやった場合にどうなるかも検証したい。

参考文献