[機器學習] Image-to-Image CGAN 筆記

Hoskiss
Hoskiss stand
Published in
4 min readJul 10, 2019

--

有機會研究一種影像轉換的conditional gan架構,原文的展示圖片令人印象深刻,可以將黑白灰階圖片自動上色,也可以輸入簡單的輪廓,讓模型輸出複雜擬真的影像,github 也有tensorflow的程式碼實作可以參考,不過訓練時是一張輸入對應一張輸出,需注意是否符合自己的應用場景

作者在三個地方對於原本的 CGAN 做出了改良,並不複雜但最後比原本的架構能達到更好的效果,這些改良的思考方向值得我們研究學習

  1. 首先是新的目標函數,沒錯,原本的 CGAN loss 如下,可以看得出來跟 DCGAN 一樣是分類的 loss,只是 generator 多考慮一個 z (noise) 的輸入
CGAN loss function

而這篇作者加入一項跟 target 影像的差距,來達到越像越好的目的,paper 有提到如果用平方差 (L2) 而不是相差的絕對值 (L1) 會更模糊,所以這邊用L1,這個項有個係數 lambda,如果越大表示越重視跟 target 的相似度,原本 paper 參數是設成 100

新的目標函數

2. 改了 generator,一句話,用 unet 取代了原本的 encoder-decoder 架構

換成 unet

3. 最後是 Markovian discriminator (PatchGAN),聽起來很迷幻,主要的概念是,之前一般 discriminator 在判斷的時候,都是拿一整張圖然後分類,現在這裡把圖切成一塊塊 NxN 的 patch 再做判斷,每塊都判斷完後,類似投票的概念取平均得到分類結果。paper 中提到,對於每張產生的圖像,high-frequency 的部分趨向讓 discriminator 來把關,low-frequency 的部分讓上述 L1 的 loss 來把關,不過這段話比較難理解一些,我也無法很體會他的意思。另外有個好處是切成小塊後,模型參數較少,訓練較快

我們來看程式實作的部分,是怎麼做到這件事呢?其實一開始讀程式碼的時候,我感覺不出來他有做這件事情,後來發現有人跟我發出了同樣的疑惑,不過釣出原作者出來解答~XD。後來發現其實主要的差異在於在於 patch gan 的輸出是 NxN 的 array,而 dcgan 輸出是單純一個數值。這也解釋了為什麼看到 cycle gan 或這個 pix2pix 的架構,在算 discriminator loss 的時候,是跟 1 or 0 的 array 做比較而不是一個數值 1 or 0

想不太到平常日常應用上有什麼適合的訓練資料集 (線條/色塊 vs 真實影像),不過感覺有機會這模型可以做一些有趣的事情,先在此筆記。如果喜歡這篇的話,麻煩幫我按下拍手給些鼓勵吧,任何回饋或建議也都歡迎喔~謝謝,我們接著繼續向機器學習學習

--

--

Hoskiss
Hoskiss stand

生活是不斷成長以追求平衡的巧妙融合