今回は、DCGANの学習済みモデルを使って、入力ベクトルを操作することで、生成する顔画像の「顔の向き」をコントロールしてみます。
こんにちは cedro です。
前編では、顔画像生成器と称して、DCGANの学習済みモデルを作成しました。
これで、いくらでも好きなだけ顔画像を生成することが可能になりました(笑)。
但し、顔画像は「右向き」、「左向き」、「正面」がランダムに生成されます。どうせなら、自分の指定した「顔の向き」のみを生成することは出来ないでしょうか。
そこで、今回の後編では、顔画像と入力ベクトルの関係を調べ、入力ベクトルを操作することによって、狙いの「顔の向き」だけ(例えば、右向きだけ)を画像生成できるようにコントロールしてみます。
顔画像と入力ベクトルの関係を調べます
前回作成した、顔画像生成器のプログラムを修正し、生成した顔画像の入力ベクトルを記録できるようにします。
生成する画像は全部で512枚。画像を1枚づつ生成し、生成する毎にその時の入力ベクトルをCSVファイル( face.csv )に書き込むようにしています。
重みパラメーターは、前回のブログから再度学習を進めて作成した、130,000ステップのものを使用しています。

これらのプログラムを適当なフォルダーに保存して、> python dcgan_gen1.py で実行します。

プログラムを実行すると、「Fake-image」フォルダーが作成され、この中に生成された顔画像が保存されます。そして、face.csv ファイルが作成され、その時の入力ベクトルが記録されます。

これが生成された顔画像で、全部で512枚あります。生成される画像が、「右向き」か「左向き」か「正面」になるかは、ランダムです。また、画像の質が低いものも中には生成されています。
この512枚の画像の中から、画像の質も考慮しながら、代表的な「右向き」、「左向き」の画像を25枚づつ選びます。

こんな感じで、右向き25枚を選びます。

こんな感じで、左向き25枚を選びます。
そして、それぞれ25枚の画像に該当する入力ベクトルをCSVファイル(face.csv)から拾って、次元毎に平均し、右向きのベクトルR、左向きのベクトルLを計算します。
入力ベクトルを操作して生成画像のカテゴリーをコントロールしてみます

さて、かなり乱暴ですが、右向きベクトルRに、LーRを1/4づつ加えると、顔が右向きから徐々に左向きに変化するベクトルが出来るはずです。
①右向き :R
②やや右向き :R+(L-R)×1/4 = (3R+L)/4
③ほぼ正面 :R+(L-R)×2/4 = (2R+2L)/4
④やや左向き :R+(L-R)×3/4 = (R+3L)/4
⑤左向き :R+(LーR)×4/4 =L
①~⑤のベクトルを実際に計算してみます。計算結果は、数値のままだと分かり難いので、グラフ化(横軸が次元、縦軸が数値の面グラフ)します。

①右向きと⑤左向きは、対照的な波形のように見え、③ほぼ中央が一番おとなしい波形にみえますね。
それでは、画像発生器の入力に、①~⑤のベクトルをオフセットとして加えられるように、プログラムを修正します。
オフセットに使うベクトルは、CSVファイル(offset.csv)の1行目に予め書き込んでおき、プログラムから読み込む形にしています。

これらのプログラムを適当なフォルダーに保存して、> python dcgan_gen2.py で実行します。

①~⑤のベクトルをそれぞれオフセットとして加えて、5回プログラムを実行し、生成した画像をまとめたものがこれです。
④やや左向きが、やや色々な顔の向きが混在しているものの、全体としては概ね顔の向きをコントロールできていると思います。
なお、顔画像生成器を改造して作成した、生成画像とその時の入力ベクトルを保存するプログラムをGithub(https://github.com/cedro3/dcgan)に上げておきますので、良かったら動かしてみてください。
では、また。
コメントを残す