概要
DCGANを用いた画像生成に取り組んだので、その記録のための記事になります。
技術的な解説というよりは、実験と考察が主な内容です。ご了承ください。
ゴール:自作イラストをデータセットに用い、GAN(DCGAN)に学習させて画像を生成する。
記事が長くなったため、実験パートと考察パートに分けて前編・後編に分割しました。
GANに自作イラストを学習させる[前編:実験]
https://qiita.com/gomahalmaki/items/3853817e20c67e0bed94
考察:鮮明な画像を生成するために
データセット
そもそも学習用画像にノイズが多い
学習用画像にはアナログ(=紙と鉛筆)で描かれたものをスマートフォンで撮影し、モノクロ化・補正・トリミングの加工を行ったものを使用しています。
先を多く重ねるような描き方や、撮影時に絵に影がかかってしまうなどの要因でノイズが多く含まれてしまっています。
綺麗にブラッシュアップされた線画・スキャナの利用・丁寧な画像加工などによってノイズを軽減できると、鮮明な画像生成につながるのではと考えます。
png形式画像の取り扱い
png形式はjpgやgifなどの形式と比べ、透過情報などを扱うことができたり、画質が良いのが特徴です。
ただ、様々な情報を保持できる反面、高圧縮な形式より重たくなってしまう傾向にあります。
png形式は鮮明な画像を生成できるかもしれませんが、入出力時の処理が重くなり学習時間が増加するデメリットも考えられます。
イラストの質
これは個人の価値観によるところで、定量的に評価できる部分ではないため判断の難しい部分です。
2018年4月〜2019年6月までに描かれたもの
176枚のイラストの中には2018年4月に描かれたものもあれば、2019年6月に描かれたものもあります。
その14ヶ月の間に描き手が上達(あるいは退歩)していたり、画風を変えている場合があります。
「いびつさのない」鮮明な画像の生成を目的とするならば、いわゆる「画力」や画風に一定の水準を設けて学習用画像を選出することが望ましいかもしれません。
*これは潜在変数やニューラルネットワークがどの程度までなら特徴量を内包でき、表現を制御できるか、といった規模感にもよると思います。
上記のような「データセットの質」を重視した場合、費やす労力に対してその効果が保証されない領域でもあると思います。
取り扱う題目の本質を考慮し、学習データの扱いを判断する必要があります。
学習
1回目:3000イテレーション時点での画像は、学習用画像の特徴をとらえつつ「それっぽい」画像を生成できていたように思えます。
(ところどころぼやけていますが、輪郭や目の位置、首元、髪といった特徴をとらえています)
この段階は、1500イテレーション頃の「Discriminator革命」以降、GeneratorとDiscriminatorの学習が拮抗できていた時期でした。
また、1回目の実験ではDiscriminatorの学習にノイズを加えておらず、ノイズを加えていた2回目・3回目よりはハッキリした画像が生成されています。
1回目は「GeneratorとDiscriminatorの学習の拮抗が保たれなくなっている」ことが学習に失敗した原因だったため、もし3000イテレーション時のような拮抗状態が維持されたまま学習が続けば、より鮮明な生成画像が得られたかもしれません。
しかし、2回目・3回目はDiscriminatorの学習を不安定化させ、GeneratorとDiscriminatorの学習の拮抗が保たれているにも関わらず、生成画像は不明瞭です。Discriminatorの学習にノイズを加えたことも要因にあるかもしれませんが、ノイズを加えていない1回目の結果も含めて考えると、Discriminatorが強すぎるのではなくそもそもGeneratorが弱いのではないかという仮説に至りました。
「Generatorが弱い」仮説
正確には「Generatorの表現力が弱い」仮説です。
ソースコードは今さら聞けないGAN (2) DCGANによる画像生成からお借りし、Generatorの畳み込み層の画像サイズを合わせる部分以外はパラメータを調整していません。
上記記事内で紹介がある通り、MNISTデータセット(2828,1ch)から手書き文字画像を出力するのに十分な表現力があります。
ただ、今回のような独自データセット(200200,1ch)から手書きキャラクター画像を出力する用途にそのまま流用した結果、表現力が不足し結果的にイラスト生成用途には向かない弱いGeneratorとなっていたのではないでしょうか。
この仮説を採用する場合、Generatorのパラメータをイラスト生成向けに調整する必要がありそうです。
*あくまで仮説に対する解決案なので、どのような調整を加えるのか(ノードを増やすのか、レイヤを増やすのか、etc……)や、調整の影響(調整後も拮抗問題が解決しない、生成画像が鮮明にならない、学習時間の増加、モード崩壊etc……)については手探りでやっていくことになります。
課題
潜在変数
潜在変数の次元数の設定によってはモード崩壊が発生します。この値の決定についても、取り扱う訓練データに依存するため一般的なセオリーなどはなく、大きすぎても小さすぎても起きてしまうので難しいところです。
MNISTならば「10種類の数字」という目安ができますが、オリジナルのデータセットの場合はそうもいきません。目的によっては学習データに使用する画像を選別し、潜在変数の次元数を設定するのもアプローチの1つかと思います。
また、モード崩壊を避ける手法としてWGANがあります。
少し試したところ、経過を見た感じ学習の精度は高そうですが、学習にとても時間がかかります。
意図的に描きわけをさせたい場合はconditional GAN がよく知られています。
学習時間
結論としては、GANの学習はGPUを利用するのが現実的だと思います。
(GANに限らずディープラーニング系には共通して言えることですが……)
今回の実験は全てCPU上で行われており、10000イテレーションを3日ほどかけて実行しています。
GANは考慮すべきパラメータ数が多いためチューニングが難しく、精度を上げるには比較実験が必要ですが、一度の実験に時間がかかってしまうとなると、かなり根気がいります。時間をかけて実験しても精度が芳しくない場面が頻発します。時間の問題さえ解決すれば試行錯誤のハードルが下がるのになあ、と切実に感じました。
デメリットとして、GPUの利用はそれなりにお金がかかる点でしょうか。
まとめ
- Generatorの表現力不足という基礎的な部分につまづいていた
- GANは全体の構造が複雑なため、なぜうまくいかないのかの要因が分かりづらい
- 要素を切り分けてうまくいかない原因を考える必要がある
所感
GANは難しいですが、自分で描いたイラストでのチャレンジは興味深く面白かったです。
「Generatorが自分の絵を真似してる!」という体験は結構テンション上がります。
環境と学習用画像を整備して再チャレンジしたいです。