cedro-blog

Keras ACGAN で愛の告白をしてみる

今回は、Keras ACGAN を使って、愛の告白文を生成をしてみます。

こんにちは cedro です。

 GAN(Generative Adversarial Network)が学習して行く段階で、最初生成するノイズに、少しづつ変化が現れ、徐々に意味のある形に変化して行く、あのプロセスが好きです。

なので、愛の告白文を、ノイズから徐々に文章に変えていったら、ドキドキしてロマンチックかもしれないなと思ったわけです。

但し、通常のGANでは、何の文字を生成するかは、運しだいなので文章になりません。そこで、ACGANの登場です。

ACGAN画像データラベルと共に学習するので、ラベルを指定してやると、意図した画像を生成することができます。これなら文章が作れます。

ということで、今回は、Keras ACGAN を使って、愛の告白文を生成をしてみます。

 

データセットを準備します

今回、使うデータセットは、NDL Lab の文字画像セット(平仮名73文字版)です。

このデータセットは、国立国会図書館デジタルコレクションのインターネット公開資料から、平仮名の文字画像を切り出したもので、合計80,000画像あります。

 

データ形式は、グレースケール48×48PNGです。各文字の収録画像は、「ぱぴぷぺぽ」を除くと、すべて1,000文字以上あります。

 

今回、愛の告白に使う文字は、この10種類とします。もう、愛の告白の内容が分かってしまいましたね(笑)。

 

「hiragana」フォルダー作り、その下に「0」~「9」のフォルダーを作って、該当する文字をそのまま格納します(前処理は一切不要です)。

 

プログラムを改造して動かします

今回は、この ACGAN のプログラム(acgan.py)を改造して使います。

新たに必要なパッケージを追加でインポートします。Image glob は今回のデータセットの読み込みに使うパッケージです。

 

データセットの読み込み部分です。まず、MNIST用の部分は無効にします(削除でもOK)。

そして、定番のデータ読み込み部分です。画像を読み込む時に、グレースケールかカラーが選べたり、読み込んだ後にリサイズが(クロップも)自由自在な Pillow は便利ですね。

 

生成した画像を表示させる部分です。今回、どういう風に表示させるかですが、デフォルトのままだと「ぼくはあなたがすきだ」10行並び、ストーカーの様になってしまいます(笑)。まずは、シンプルに1行だけ表示することにします。

そのため、r, c = 1, 10 で1行10列とし、それに伴い fig.axs =plt.subplots( r, c) のところに、figsize(10,2) というオプションを追加し縦の表示範囲を狭くしています。

後、画像表示の位置指定に使っている、axs[ i, j ]は1行のみの指定の場合はエラーになってしまうので、axs[ j ] に変更します。

さて、epochs = 2400, sample_interval = 30 の設定(最終行にあります)でプログラムを動かして、出力結果をGIF動画にしてみると

こんな感じです。リケジョならロマンチックと感じてくれるでしょうか?  やっぱり、ストーカーみたいですね(笑)。

 

さて、今度は3行×3列で表示させてみましょう。この場合、単純に r, c = 3, 3 としてしまうと、後半の文字を並べて表示する部分はOKですが、前半のラベル生成が0~2の繰り返しになってしまいます。なので、別の変数 p, q を設定し、p, q = 1, 10 としています。

また、3行×3列ということで表示範囲は、figsize(5,5) としています。

さて、epochs = 2400, sample_interval = 30 の設定で再びプログラムを動かして、出力結果をGIF動画にしてみると

こんな感じ。本来の ACGAN の使い方とは違いますが、こういう生成過程を楽しむというのも、アリではないでしょうか。

では、また。