#1.はじめに
通常、学習済みGANモデルの生成画像は、好みの画像、嫌いな画像、破綻した画像が混在していて、そのままでは鑑賞に耐えません。そこで、今回は手軽にGANの生成画像を自分好みで質の高いものに変える方法をご紹介します。
今回使うGANの学習済みモデルは、TF-Hub Progressive GAN です。なお、コードは Google Colab で作成し Github に上げてありますので、自分でやってみたい方は、この「リンク」をクリックし表示されたシートの先頭にある**「Colab on Web」**ボタンをクリックすると動かせます。
#2.どうやるの?
学習済みのGANモデルは、入力するベクトルと出力画像は1対1で既に決まっているので、改造できません。ではどうするか。入力するベクトルの方を変えます。
GANモデルにランダムベクトルを入力して画像生成した時に、破綻した画像や自分が嫌いな画像がある場合は該当するベクトルをマイナスベクトルに蓄積し、自分の好みの画像がある場合は該当するベクトルをプラスベクトルに蓄積します。
そして、GANモデルに入力する次のベクトルは、ランダムベクトル+プラスベクトルの平均ーマイナスベクトルの平均とします。これを繰り返すことで、あーら不思議、GANの生成画像は自分好みで質の高いものに変身して行きます。
#3.実装します
最初に、ライブラリーのインストール及びインポート、関数定義、モデルのダウンロードを行います。詳細は、google colab を参照下さい。
まず、初期化します。
# 学習の初期化
tf.random.set_seed(80)
vectors = tf.zeros([5,512])
plus_vector = tf.zeros([1,512])
minus_vector = tf.zeros([1,512])
google colab の Form機能を使っていますので、初期状態ではコードが見えませんが、UIをクリックするとコードを見ることが出来ます。操作をするには、初期状態の方がやりやすいです。
#@title please, you change the selected action if you need.
vec_0 = 'nothing' #@param ['plus', 'nothing', 'minus']
vec_1 = 'nothing' #@param ['plus', 'nothing', 'minus']
vec_2 = 'nothing' #@param ['plus', 'nothing', 'minus']
vec_3 = 'nothing' #@param ['plus', 'nothing', 'minus']
vec_4 = 'nothing' #@param ['plus', 'nothing', 'minus']
vec = [vec_0, vec_1, vec_2, vec_3, vec_4]
for i in range(len(vectors)):
if vec[i] == 'plus':
plus_vector = tf.concat([plus_vector, tf.reshape(vectors[i],[1,512])],axis=0)
if vec[i] == 'minus':
minus_vector = tf.concat([minus_vector, tf.reshape(vectors[i],[1,512])], axis=0)
print('number of plus_vector = ', len(plus_vector)-1)
print('number of minus_vector = ', len(minus_vector)-1)
plus_vector_mean = tf.reduce_mean(plus_vector, axis=0) # plus_vectorの平均をとる
minus_vector_mean = tf.reduce_mean(minus_vector, axis=0) # minus_vectorの平均をとる
vectors = tf.random.normal([5, 512]) # ランダムベクトル取得
vectors = vectors + plus_vector_mean - minus_vector_mean # ベクトルの補正
display_images(vectors)
Form機能によって、変数 vec_0〜vec_4 には UIで選択した文字列 ('plus', 'nothing', 'minus')が入ります。その文字列が 'plus' ならば該当するベクトルをplus_vectorに蓄積し、'minus' ならば該当するベクトルを minus_vector に蓄積します。後は、tf.reduce_mean()
で平均を取り、ランダムベクトルに足したり引いたりするだけです。
初回は何も設定をいじらずコードを実行します。2回目以降、生成した5つの画像を見て、自分の判断でマイナスベクトルに入れるのか(minus)、プラスベクトルに入れるのか(plus)、何もしないのか(nothing)を決めて、設定を変更してからコードを実行します。これを何回も繰り返します。
表示しているのは、十数回ほどやってみた結果です。UIは初期状態のまま実行しています。プラスベクトルを5つ(自分の好みの女性)、マイナスベクトルを8つ(破綻した画像)選んだ結果の画像です。確かに、割りと自分好みの女性ばかりになっていますね(笑)。
#4.追加
追加で、StyleGAN2版のコードをGoogle_colabで作成し、Github に上げてありますので、こちらの方も良かったら試してみて下さい。