Edited at

DCGANで画像の自動生成

More than 1 year has passed since last update.


背景

いままで教師あり学習の分類問題ばかりやってきたので、少し気分を変えて、ディープラーニングで画像の生成とかやってみたい思った。


DCGAN とは?

一言で言えば、与えられた画像データセットを元に、それによく似た感じの画像を出力してくれるシステム。詳しくは、

TensorFlowによるDCGANでアイドルの顔画像生成

あたりを参照のこと。

実際に自分でコードを書くのがおすすめ。コードを書くまでは何のことだかさっぱりわからなかったが、書いてみたら、なるほど、となった。

GANの動作原理は、「偽札を作る人と取り締まる警察」の関係に例えられる。偽札を作る人はより精巧な偽札を作ろうと努力し、警察は精巧な偽札も見破れるようにしようと努力する。そうすると偽札(ここでは生成される画像のこと)はどんどん精巧になって本物と区別がつかなくなるのだ。DCGAN では「偽札を作る人」「警察」をそれぞれ別のニューラルネットワークが担当する。


実装

DCGANを実装してみた

たぶん、元論文に近い実装は、DCGAN implementation by TensorFlow。私は、これを Keras で実行してみたのだが、どうにもうまく行かなかった。

そこで、keras-dcganに従ってみた。このサンプルコードでは、MNIST の数字をうまく学習している。ただ、問題点としては、この issueにあるように、元論文とはかなり違うネットワーク構成を取っている。GAN(Generative Adversarial Network, 生成的敵対的ネットワーク?)であるのは確かだと思うが。

だから私の実装も GAN の雰囲気をつかむもの、という程度にとらえてもらえれば、と思う。

Github から clone して、python keras-dcgan.py と実行すれば、とりあえず gen_images ディレクトリ以下に画像が生成され始める。in_images に学習したい任意の画像(のフォルダ)を入れてほしい。in_images/images に入っている初音ミクの画像は、animeface-character-datasetからお借りしました。深く感謝します。


実行結果

animeface-character-datasetの画像約15000枚に基づいて学習させた(これは Github のレポジトリには入っていない。各自追試したい場合は、animeface-character-dataset をダウンロードしてみてください)。


元の画像

batch_images.png


step 1000(のべ55000枚学習後)

gen01000.png


step 3000(のべ165000枚学習後)

gen03000.png


step 10000(のべ550000枚学習後)

gen10000.png


step 29900(のべ1644500枚学習後)

gen29900.png


感想

今回の実装では、どうも過学習の影響が出やすいというか、元画像を完全にコピーした画像が生まれやすい傾向がある気がする。とはいえ、画像生成器(Generator)に乱数しか入力していないことを思えば、驚くべき学習能力ではある。GAN を安定的に使うのはなかなか難しいが、安定化の新しい手法もいろいろ提案されているようなので、余裕があるときに、また取り組んでみたい。