cedro-blog

NNabla DCGAN 生成される顔画像を入力ベクトルでコントロールする(前編)

今回は、DCGANの推論実行時に、入力ベクトルを操作することによって、生成画像のカテゴリーをコントロールしてみます(前編)。

こんにちは cedro です。

前々回、Conditional GAN を使って生成する画像のカテゴリー(顔画像の向き)コントロールしてみましたが、カテゴリーコントロールには、それ以外にも方法があります。

学習を完了した後、推論実行時は、ネットワーク重みの設定は固定されていますので、生成される画像入力ベクトル一対一で対応します。

入力ランダムノイズによるベクトルになっているので通常はありえませんが、もし全く同じベクトルが入力されれば、全く同じ画像が生成されると言うことです。

ということは、推論実行時生成される画像カテゴリー分けして、その画像を生成した時の入力ベクトルの平均を計算しますこれを画像生成器入力オフセットで加えてやれば、同様なコントロールができるはずです。

今回は、「前編」・「後編」2部構成でお届けします。まず、「前編」は、顔画像生成器の作成までをやってみます。

 

ネットワークの設計

今回は、NNabla のサンプルプログラム dcagn.py ( NNabla-examples-master にあります)を改造して使います。

改造箇所は、以下の様です。

1)オリジナルのCSVデータを読み込ませるための修正
27行目(修正)from mnist_data import data_iterator_mnist を以下に修正
import nnabla.utils.data_iterator as d

164行目(修正):data = data_iterator_mnist (args.batch_size, True) を以下に修正
data = d.data_iterator_csv_dataset (“.\\face_train.csv”, args.batch_size, shuffle=True, normalize=False)
*face_train.csv がオリジナルのCSVデータです。
*normalize=Falseは、本体のプログラムで正規化しているのでダブらないようにキャンセルしています。

2)ネットワーク定義の修正(Generator, Discriminator)
出力を1,28,28 → 3,64,64 にし、Generator, Discriminator ともレイヤーを1段追加して、少しいじっています。
各レイヤーの最大画像枚数を設定する maxh256 → 1024 へ4倍にしています。
ほぼ、論文のスペックに近い形です。

3)モニターの修正
162行目(追加):生成画像を頻度高くチェックしたいので、interval=100 にしています(デフォルトはinterval=1000)。 num_images=16(生成画像の大きさ:16だと4×4のタイル状に表示)としていますが、デフォルトが16なので、なくても良いです。

 

データセットの準備

元画像のデータは、前々回のブログで使ったものを流用します。

顔の向きによって、右向き2,400枚左向き2,400枚正面2,400枚合計7,200枚あります。元画像は大体100×100ピクセル以上あるので、今回の仕様は思い切ってカラー64×64にしようと思います。

例によって、XnConvert でリサイズしてから、Neural Network Console+ Create Dataset 機能で、データセットを作成します。

NNablaDCGANは、評価ファイルを使いませんので、学習ファイル100%で作ればOKです。また、学習ファイルラベル全部「0」OKです。

 

学習実行

適当なフォルダーに、必要なプログラムとデータを格納します。

face_dcgan.py がプログラム本体、フォルダー「0」face_train.csv がデータセット、args.py が関連プログラム( NNabla-examples-master の MNIST-Collection の中にあります)。

そして、ターミナルでこのフォルダーに移動し、> Python  face_dcgan.py -c cudnn でプログラムを実行します(GPUで動かすことを強くお勧めします)。

 

プログラムを実行すると、「tmp.monitor.dcgan」というフォルダーが作成され、この中に、生成画像学習によって得られた重みパラメーターファイル、その他各種データが自動的に保存されます。

 

バッチ6420,000ステップ(20,0000/7,200÷64=178エポック)で学習を開始します。このグラフは、「tmp.monitor.dcgan」に保存された txtデータを元にCalcで作成したものです。

Generator、Discriminatorとも、2,000ステップ(1,999 Iter)あたりからloss が落ち着いて来て、画像らしきものが現れ始めます。

一貫して、Generator lossDiscriminator loss より高いですが、それでも4%を超えることは少なく、画像の作りこみが進んで行きます。

マシンは、NEXTGEAR-NOTE i5550( Core i7、メモリ16GB、GTX-1060)で、学習時間は42分でした。

生成した画像はこんな感じ。

2,000ステップ

10,000ステップ

20,000ステップ

データ数が7,200個と少な目なので完成度はあまり高くありませんが、このあたりまでは簡単に行けます。

 

顔画像生成器を作成します。

2018.1.28のブログSONY Neural Network Libraries で、学習済みモデルの推論実行をやってみるでご紹介した、推論実行プログラムを使います。

 

ネットワーク定義の部分は、先程と同様に修正します。

61行目(修正要);読み込む重みパラメーターファイルを指定する箇所。

65行目(修正要):モニターデータをどのフォルダーに出力するかの部分は、絶対パスになっていますので、各人の環境によって修正をお願いします。

適当なフォルダーに、プログラムデータを格納します。

dcgan_replay.py が画像生成(推論実行)プログラム、generator_param_019999.h5 が学習によって得られた重みパラメーターファイル(学習時にフォルダーに自動的に保存されますargs.py が関連プログラム(先程と同じ)。

重みパラメーターファイルがあるおかげで、もはや画像データは不要になりました。

後は、ターミナルでこのフォルダーに移動し、> Python  dcgan_replay.py でプログラムを実行すればOKです。こちらは、推論を実行するだけですので、GPU無しで問題ありません。

 

プログラムを実行すると、「Fake-images」フォルダーが作成され、この中に4×4の顔画像40枚生成されます。1枚の画像生成には8秒程度かかります( MacbookAirの場合 )。

 

生成した画像の1枚がこれです。さあ、これで顔画像を直ぐ生成する顔画像生成器が出来ました。

「後編」では、この顔画像生成器を使って、顔画像入力ベクトルの関係を考察し、入力ベクトルを操作して、画像カテゴリーコントロールしてみたいと思います。

では、また。