GANを用いたイラスト生成のデータセット

Intoduction

Lento
6 min readApr 15, 2018

様々なGenerative Adversarial Networks(以下GAN)を用いたイラスト生成を今更ながら行った。私の興味としては、データセットの質がどの程度生成されたイラストの見栄えに影響を及ぼすのか、という所にあったため、今回は2種類のデータセットに対してDCGAN、Spectral Normalizationを適用したGAN(SN-GAN)を用いてイラスト生成を行った。

Datasets

今回は2種類のデータセットを用意した。

  • safebooruから適当に画像を集めて、opencv + lbpcascade_animeface.xmlで顔を64 ✕ 64に切り出して50000枚ほど用意。以下にデータセットからランダムに選んだ25枚を示す。こちらをデータセット1と名付ける。
  • makegirlsmoeの元論文を参考に、Getchuからキャラ画像を適当に集めて、同様に顔を切り出し25000枚ほど用意した。ランダムに25枚ほど選んだものを以下に示す。前のデータセットとの違いとしては、顔全体が入るように切り出す範囲を広めに取っていること、背景は白で統一されている事である。また、ゲームのキャラ立ち絵が用いられているので、キャラクターは正面を向いていることが多い。こちらをデータセット2と名付ける。

2つのデータセットを用意した狙いとしては、単に雑多に顔イラストを集めたものとある程度の自由度を減らした(背景の色統一、顔全体が映るように等)で生成結果の見栄えがどうなるのかを確かめたかったからである。

Generative Adversarial Networks

冒頭でも述べたように、今回は2つのGANを用意した。それぞれのGANについての詳細は割愛する。

  • DRAGAN・・・論文はこちら。Discriminatorの勾配に、訓練データにノイズを加えたものを与えてリプシッツ性の制約を課している。今回はDCGANをベースにした。
  • SN-GAN・・・論文はこちら。リプシッツ性の制約を与えるために、Discriminatorの各層にSpectral Normalizationを適用している。これにより、様々な正規化(Batch Normalization等)を行う必要がなくなった(hyperparameterの数の減少)。コードは、Preferred Networks様の実装を参考にさせていただきました。

Results

  • まずDRAGANの生成結果を示す。計算資源の問題上、350epoch目という少ないエポック数での生成結果となっている事はお許しください。
データセット1の350epoch目の生成結果
データセット2の350epoch目の生成結果

一枚目の画像がデータセット1によるもので、2枚目の画像がデータセット2によるものである。あくまで主観ではあるものの、2枚目の画像の方が人物イラストとしてはっきりわかるものとなっている。(1枚目にも人物だと判別出来るものもあるが、人物として形を成してない「崩れた」イラストが多いのも事実である)

  • 次にSNGANの生成結果を示す。こちらも同様に350epoch目のGeneratorを用いる。
データセット1の350epoch目の生成結果
データセット2の350epoch目の生成結果

DRAGANより見栄えが悪くなっている。しかしデータセット1はそもそも人としての造形を保ってないものが多いのに対して、DRAGANと同様にデータセット2はその造形を保つことが出来ているものが多いように見受けられる。

Summary

今回は、2つのデータセットに対して2つのGANを用いてイラスト生成を行った。結論としてはより自由度を減らしたデータセットの方が見栄えは良くなるという事が言える。より自由度を減らしているという事は、それだけ結果を与えるパラメータの自由度も減っているという事なのでこの結果は当然である。逆に言えば、データセット1に対しても画像の枚数を更に多くして、パラメータの数を増やし学習時間を更に長くすれば可能になると考えられるが、時間的コストとの兼ね合いとなる。

多次元空間においてより低次元の多様体を形成してしまう事は、DiscriminatorとGeneratorを分離出来る事にも繋がる。そうすると、DiscriminatorはGeneratorの出力と訓練データの区別を完全に行えるようになり、Discriminator側のlossは下がる一方となる。(それを防ぐためにリプシッツ性の制約を課しているのだが….どこまでそれが効いてるのかは不明)

どこまで自由度を減らせばいいのか、逆にどれだけの自由度ならば十分に学習が出来るのか、はまだ不明である(自分のサーベイ不足もあるかもしれませんが…)のでこのあたりの可視化も行っていきたい。

最後になりますが、ご指摘等ありましたら仰ってください。ネットワーク構造詳細を含めたコードは後日Githubにあげます。

Environment

OS : Ubuntu 16.04 LTS (64-bit)
CPU : Intel(R) Core(TM) i5–4590 CPU @ 3.30 GHZ
GPU : NVIDIA GTX970
メモリ : 8GB

--

--