- 投稿日:2019-03-01T16:06:33+09:00
StyleGANの2方向マッピング
Deep Learning初心者故、間違いがありましたら指摘いただけると幸いです。
今更だけどStyleGANて何
StyleGAN「写真が証拠になる時代は終わった。」に全てが書いてあります(丸投げ)
原文を読みたい数奇な方はA Style-Based Generator Architecture for Generative Adversarial NetworksにPDFが置いてありますので、どうぞ
よく見るやつ
$A$と$B$を混ぜ合わせるといい感じに$AB$の中間画像を表示するぞ!
3個混ぜたいんだけど
ggっても中々出てこない上に、にこやかに笑った人達の顔ばっかり出てくる
俺はキャラの顔でやりたいじゃけん実装しましょうね
手軽に試してみたかったので、今回はこちらのColaboratory Bookをお手本に学習済みのモデルを利用させて頂きました
2方向のマッピングをするには???
先ず二つの画像を取り出しているコードを読んでみる
# generate images code interpolated across one of the 512 dimensions init_latent = np.random.RandomState(seed).randn(1, Gs.input_shape[1])[0] def apply_latent_fudge(fudge): copy = np.copy(init_latent) copy[interpolate_dim] += fudge return copy interpolate = np.linspace(0., 30., 10) - 15 latents = np.array(list(map(apply_latent_fudge, interpolate)))ノイズであるinit_latentに対してinterpolateを与えることで2点間の変化を取り出している気がする
多分こんなイメージN = \begin{bmatrix} R_0\dots R_d \end{bmatrix} \\ I = \begin{bmatrix} J \dots K \end{bmatrix} \\ L = \begin{bmatrix} (N + I_0) \dots (N + I_n) \end{bmatrix}$N$ := Noise, $I$ := Interpolate, $J,K \in \mathbb{Z^+}$, $R_d$ := Random Value
なんでInterpolateをノイズに与えることで別の画像へ近づくのかがいまいち理解できていないが
これを2方向にするとなると多分こうなるN_1 = \begin{bmatrix} R_0\dots R_d \end{bmatrix} \\ N_2 = \begin{bmatrix} R'_0\dots R'_d \end{bmatrix} \\ I = \begin{bmatrix} J \dots K \end{bmatrix} \\ L = \begin{bmatrix} (N + I_0) \dots (N + I_n) \end{bmatrix} \\ L = \begin{bmatrix} L_1 \dots L_2 \end{bmatrix}単純にInterpolateを加えたノイズを二つ用意して、線形補間すればいいんじゃなかろうか的な思考
一応できた
def apply_latent_fudge(fudge, target_latent): copy = np.copy(target_latent) copy[interpolate_dim] += fudge return copy def gen_interpolate(): return np.linspace(0, 30, width) interpolate = gen_interpolate() applier1 = lambda f: apply_latent_fudge(f, init_latent1) latent1 = np.array(list(map(applier1, interpolate))) applier2 = lambda f: apply_latent_fudge(f, init_latent2) latent2 = np.array(list(map(applier2, interpolate))) def v_linspace(i): v = np.array(list(map(lambda l: np.linspace(latent1[i][l], latent2[i][l], height), range(latent1.shape[1])))) v = v.transpose() return v combined_latent = np.array(list(map(v_linspace, range(width)))) combined_latent = np.array(list(map(lambda x: x.flatten(), combined_latent.transpose()))).transpose() images = Gs.run(combined_latent, None, **synthesis_kwargs)StyleGAN 2way mapping (Google Colab)
出来たんだけど、理解しきれていないのでもやもやする
あと2wayじゃなくて4頂点間の補間な気がしなくもないもし宜しければ指摘いただけると幸いです
- 投稿日:2019-03-01T03:20:17+09:00
TensorFlowの基礎についての備忘録
簡単なメモ書き
TensorFlowimport tensorflow as tf #定数/変数の宣言 const1 = tf.constant(2.0, tf.float32) var1 = tf.Variable(3.0, tf.float32) tf.assign(var1, 5.0) #変数への代入 #placeholderは実行時に値が設定可能 holder1 = tf.placeholder(tf.float32) #四則演算(その他、数学関数なども豊富に揃っています add_op = tf.add(const1, var1) #和 sub_op = tf.sub(const1, var1) #差 mul_op = tf.mul(const1, var1) #積 div_op = tf.div(const1, var1) #商 mod_op = tf.mod(const1, var1) #余り pow_op = tf.pow(holder1, var1) #べき乗 #グラフ実行 with tf.Session() as sess: #変数(Variable)は初期化が必要 sess.run(tf.global_variables_initializer()) result1 = sess.run(add_op) #holderへ値を設定 result2 = sess.run(pow_op, feed_dict={holder1: 4.0})参考

