Generative Adversarial Network (8) --- Photo Editing

當我們訓練出一個 GAN 之後,在之前的部分有說過,我們總會希望可以藉由調整 Vector 的某些維度來改變生成圖像的一些特徵。例如 : 金髮轉黑髮、年輕便年老或是男人變女人...等等。但我們也有說過,我們很難知道每一個維度所代表的意義為何,也有可能根本每一個維度都無法區分出屬於哪一個圖像特徵。

除了前面幾種藉由改變 GAN 的結構來強迫讓機器學得一種特徵屬於一個維度的表徵方式之外,其實也可以從我們手邊的資料跟固有的 GAN 模型來嘗試去回推圖像特徵的調整方式。

GAN + Auto Encoder

我們可以將既有的 Generator 作為 Decoder (固定),重新訓練一個 Encoder ( 可以拿 Discriminator 作為初始值 ) 串成 Auto Encoder。

利用這樣的 Auto Encoder 來將圖像進行特徵萃取。如果我們想知道長短髮轉換的方式,我們可以將現有的長短髮圖像集中,並利用 AE 找出它們的隱含特徵,進行下列方式運算 :

將長短髮向量各自平均後相減,計算出由短髮轉換成長髮的向量 \(z_{long}\),便可將短髮向量加上 \(z_{long}\) 轉換成長髮向量。

智能 Photoshop

以下是一種智能 Photoshop 的 Demo,在一張現有的圖片上加上一些條件限制,它可以直接轉換成符合我們要求的模樣。

背後的概念大概是如下 : 1. 原始圖片先進行 embedding 找出它在 CODE spsce 的位置。 2. 移動一小步使其跟原本的 CODE 距離不會太遠,但又要符合使用者給出的條件。 3. 再來進行圖像生成。

但現在的問題是 (1) 怎麼做 Embedding 找出 CODE ? (2) 怎麼樣能夠符合使用者條件下又能與原圖像接近 ?

Back to Latent CODE

方法一 :

直接用 Grqdient Descent 解一個直接解一個優化問題

\[ z^*=\arg\min\limits_{z} L(G(z),x^T) \]

要解這樣的問題除了用 Pixel-wise 的方式計算兩個向量間的距離外,也可以用一個 Pre-train 好的 Neural Network 來做 embedding,並且希望 \(G(z)\)\(x^T\) 越接近越好。

方法二 :

利用我們前面 GAN+AutoEncoder 的方式來處理。

方法三 :

結合上述兩種方式,將方法二的結果視為方法一的初始值再進行優化。

How to editing photo ?

假設,原圖片經由上面的方式找出 Latent CODE \(z_0\),接下來我們希望的是找出一個 \(z^*\) 可以滿足使用者下的條件 \(U\),又可以盡可能地接近 \(z_0\),更重要的是生成的圖片還要夠真實。

\[ z^*=\arg\min\limits_{z} U(G(z))+\lambda_1\|z-z_0\|-\lambda_2 D(G(z)) \]

( 兩個 \(\lambda\) 的符號相反,因為這兩個條件的優化目標、方向是相反的 )

其他 GAN 應用

Super-resolution

將低解析度的圖片變成高解析度,主要利用低解析度跟高解析度的 Piar 利用 GAN 來訓練。一般來說,大概都直接拿高解析度圖片來改成低解析度資料。

以下是論文 " Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network " 的實驗結果 :

Image Completion

Image Completion 技術是將圖片挖空,然後讓電腦自行補上挖空的部分,方法跟 Super resolution 的方式雷同。

以下是論文 " Globally and Locally Consistent Image Completion " 的實驗結果 :