ProgressiveGANでちょっときれいなアニメ画像生成

f:id:Hi_king:20171119141322g:plain f:id:Hi_king:20171119134734p:plain

github.com

2017年は様々なGANの改良手法が開発されましたが,先月,Progressive GANという,中でもわかりやすいアイディアで高解像度な画像を生成できる手法が発表されたので,実験してみました.

Progressive GAN

まず,普通のGANについておさらいですが,

f:id:Hi_king:20171119003639p:plain

この図のように, 1. Generatorがきれいな生成画像を作る 2. Discriminatorが生成画像とデータセット画像を見分ける という役割をそれぞれが果たし,Discriminatorを騙すGeneratorを鍛えることできれいな生成画像になっていくという過程です. この手法をベースに,より自然な,より多様な,画像生成が模索されているというのが現状です.

さて,ここはポエムですが,大雑把に言って,自然な画像というのは,"細部が整っている", "全体が矛盾していない"の2つの観点が考えられるかなと思います. 低解像度の画像においては,細部は,データセットでも既に失われているので,全体が矛盾せずに,(例えば)人間っぽく見えることを目指して生成ができます. 具体例を出すと,金髪であれば碧眼の確率が高いとか,両目は同じ色の確率が高いとか,口と目は平行であるとか,そういう構図レベルの話に集中できるってことです. ゆえに高解像度の画像を生成するってのは,そういう構図レベルの問題と,各パーツの詳細レベルの問題を両方騙さなきゃいけないという難しさがあったわけです.

それに対してProgressive GANの答えがこの図です.

f:id:Hi_king:20171119003501p:plain

高解像度の画像を生成する問題を,うまく設計を工夫して一気に解こうとするのではなく,低解像度の画像を生成するネットワークから徐々に拡大していこうというアイディアです. これにより,高解像度のステージでは,おそらく各パーツの詳細を生成することに集中して学習が進むという利点があるのでしょう.

通常のGAN Progressive GAN
f:id:Hi_king:20171119012920p:plain:w128 f:id:Hi_king:20171119013350p:plain:w128

ちなみに,この,低階層からパラメタを決めていくという話は,stacked RBMで教師なし学習でネットワークを初期化する話を思い出される方も多いと思います. また,強化学習としてGANをとらえると,強化学習で複雑な問題を解くときには簡単な問題からカリキュラム学習するのがわりとメジャーであることとの連想もできるかと思います. また,そもそもGANを複数のステージ(2,3くらい)重ねるという話自体は初出ではなく,StackGANなどが存在してます. それらの面からも,ProgressiveGANはとても理にかなってる解決策に感じます.

補足として,Progressive GANのこの結果は,単に階層化だけの工夫ではなく,サンプル間の分散を保つように,Discriminatorに統計量を渡したり,生成時にピクセル間で正規化したりといった多様な工夫も入ってます. また,高解像度だけが取り柄ではなく,たとえ32x32でも4x4から成長させることで,既存手法に対して性能向上が観られています.

失敗したこと

VRAMの限界

各解像度の中間表現サイズ
4x4x512
8x8x512
16x16x512
32x32x512
64x64x256
128x128x128
256x256x64
512x512x32
1024x1024x16

論文で使われてるパラメタをなぞると,表のように結構深いチャンネルを使っていて,バッチサイズを適当にするとすぐにOOMで落ちてしましまいます. 論文では,これに対処するために,後半はメモリに乗るギリギリのサイズまで,stageごとにバッチサイズを減らすという対応をしていました. 僕は面倒なので途中のチャンネル数を雑に減らす対応でごまかしてます.が,1024とかいうめちゃでかいところまではやってないので,そんなに影響は出てないと思います.

mode collapse / あるいは高解像度データセットの必要性

stage11: 128 x 128 stage13: 256 x 256
f:id:Hi_king:20171119004114p:plain f:id:Hi_king:20171119004203p:plain
f:id:Hi_king:20171119004406p:plain f:id:Hi_king:20171119004441p:plain

256x256の画像を生成することを目標としてたんですが,256x256になるstage13でmode collapse(どんな入力を入れても出力が幾つかの決まった画像になってしまう)が起こってしまいました. 異なるコンテンツのデータセットで同じstageで起こってることが不思議だな,と思ったんですが,おそらくはデータセットの解像度のせいかな,と考えています. 実は実写顔画像の方は CelebAデータセットで,もとも96x96の解像度です. アニメ顔の方は,より大きなデータから顔を256x256に切り出してるんですが,顔の位置だけ切り出している以上,これも結構な低解像度が多く含まれてると思われます. 生成画像は256で生成できて,データセットは,より低い解像度の画像を"引き伸ばした"エフェクトがかかってしまっていると,そのエフェクト自体をDiscriminatorが手がかりにできてしまってるのではないかと疑ってます.

いずれにせよ,画像生成はデータセットのサイズだけではなくデータセットの解像度も必要な時代になったということですね.((((;゚Д゚))))ガクガクブルブル

他の方の実験結果

すごい.ついに顔画像以外も生成できるようになってる.

t.co

顔に関して,圧倒的な美しさを誇るMakeGirlsMoeも改良を行ってる.

これらの結果を見るに,手法を追うことも大事だが,特に細部までクオリティを上げていくことを考えるなら,データセットや前処理を見直すのも大事だなぁと実感します. 失敗例観てると,結構背景要素に引っ張られてるのが多いので,まずは背景を整えたデータセットを作りたい..

参考文献

  • Progressive Growing of GANs for Improved Quality, Stability, and Variation
  • github.com
    • 多様なGANの改良手法のchainer実装を公開している.Progressive GANも真っ先に実装されていて,今回の実装も大幅にこちらのコードを利用させていただいてます.
  • Stacked Generative Adversarial Networks
    • Xun Huang, Yixuan Li, Omid Poursaeed, John Hopcroft, Serge Belongie
  • StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks
    • Han Zhang, Tao Xu, Hongsheng Li, Shaoting Zhang, Xiaogang Wang, Xiaolei Huang, Dimitris Metaxas
  • ultraist.hatenablog.com
    • 顔クロップに使わせていただきました