1. 程式人生 > >AI修圖!pix2pix網路介紹

AI修圖!pix2pix網路介紹

語言翻譯是大家都知道的應用。但影象作為一種交流媒介,也有很多種表達方式,比如灰度圖、彩色圖、梯度圖甚至人的各種標記等。在這些影象之間的轉換稱之為影象翻譯,是一個影象生成任務。

多年來,這些任務都需要用不同的模型去生成。在GAN出現之後,這些任務一下子都可以用同一種框架來解決。這個演算法的名稱叫做Pix2Pix,基於對抗神經網路實現。話不多說,先上一張圖。

  • 將街景標註影象變成真實影象
  • 將建築標註影象轉換為真實影象
  • 將衛星影象轉換為地圖
  • 將白天的圖片轉換為夜晚的影象
  • 將邊緣輪廓線轉為真實物體

本文是文獻Image-to-image translation with conditional adversarial networks

的筆記。

雖然論文是去年11月份的,比較古老,但作為一篇很經典的論文,值得一讀。

引入

卷積神經網路, CNN 出現以來,各種影象任務都在飛速的發展。但CNN雖然能夠自動學習出一些東西,仍然需要人的指導。設計對的損失函式便是其中的一種方式,對於影象翻譯等影象生成任務來說,告訴CNN去學習什麼非常的重要。如果告訴CNN去學習一種錯誤的Loss,那麼也不會得到什麼好的結果。以歐式距離為例,CNN學習歐氏距離就會得到一張比較模糊的影象。而對於影象翻譯任務來說,我們需要讓CNN學習能夠輸出真實的清晰的影象。

pix2pix模型原理

生成網路G

pix2pix網路是GAN網路中的一種,主要是採用cGAN網路的結構,它依然包括了一個生成器和一個判別器。生成器採用的是一個U-net的結構,其結構有點類似Encoder-decoder,總共包含15層,分別有8層卷積層作為encoder,7層反捲積層(關於反捲積層的概念可以參考這篇部落格:

反捲積原理不可多得的好文)作為decoder,與傳統的encoder-decoder不同的是引入了一個叫做“skip-connect”的技巧,即每一層反捲積層的輸入都是:前一層的輸出+與該層對稱的卷積層的輸出,從而保證encoder的資訊在decoder時可以不斷地被重新記憶,使得生成的影象儘可能保留原影象的一些資訊。

 

上圖中,首先U-Net也是Encoder-Decoder模型,其次,Encoder和Decoder是對稱的。 
所謂的U-Net是將第i層拼接到第n-i層,這樣做是因為第i層和第n-i層的影象大小是一致的,可以認為他們承載著類似的資訊。

判別網路D

對於判別器,pix2pix採用的是一個6層的卷積網路,其思想與傳統的判別器類似,只是有以下兩點比較特別的地方:

  • 將輸入影象與目標影象進行堆疊:pix2pix的判別器的輸入不僅僅只是真實影象與生成影象,還將輸入影象也一起作為輸入的一部分,即將輸入影象與真實影象、生成影象分別在第3通道進行拼接,然後一起作為輸入傳入判別器模型。
  • 引入PatchGAN的思想:傳統的判別器是對一張影象輸出一個softmax概率值,而pix2pix的判別器則引入了PatchGAN的思想,將一張影象通過多層卷積層後最終輸出了一個比較小的矩陣,比如30*30,然後對每個畫素點輸出一個softmax概率值,這就相當於對一張輸入影象切分為很多小塊,對每一小塊分別計算一個輸出。作者表示引入PatchGAN其實可以起到一種類似計算風格或紋理損失的效果。
     

其具體的結構如下圖所示:

  • G目標是生成樣本欺騙D
  • D的目標是儘可能將真實的樣本、G生成的樣本分開

 

損失函式

依上所述,Pix2Pix的損失函式為

為了做對比,同時再去訓練一個普通的GAN,即只讓D判斷是否為真實影象。

對於影象翻譯任務而言,G的輸入和輸出之間其實共享了很多資訊,比如影象上色任務,輸入和輸出之間就共享了邊資訊。因而為了保證輸入影象和輸出影象之間的相似度。還加入了L1 Loss

那麼,彙總的損失函式為

 

 

 

訓練細節

  • 梯度下降,G、D交替訓練
  • 使用Adam演算法訓練
  • 在inference的時候,與train的時候一樣,這和傳統CNN不一樣,因為傳統上inference時dropout的實現與train時不同。
  • 在inference的時候,使用test_batch的資料。這也和傳統CNN不一樣,因為傳統做法是使用train set的資料。
  • batch_size = 1 or 4,為1時batch normalization 變為instance normalization

實驗

評測

使用AMT和FCN-score兩種手段來做評測。

  • AMT,一種人工評測平臺,在amazon上。
  • FCN-8,使用預訓練好的語義分類器來判斷圖片的可區分度,這是一種不直接的衡量方式。

Loss function實驗

使用三種不同的損失函式,cGAN, L1和cGAN+L1,得到結果如下:

可以看到,只用L1得到模糊影象,只用cGAN得到的會多很多東西。而L1+cGAN會得到較好的結果。

當然普通的GAN損失函式也被嘗試。只不過這個損失函式只關注生成的影象是否真實,絲毫不管是否對應。所以訓練時間長了以後會導致只輸出一個影象。

色彩實驗

衡量了不同的損失函式下生成的影象色彩與ground truth的區別。

發現,L1有更窄的色彩區間,表明L1鼓勵生成的影象均值化、灰度化。而cGAN會鼓勵生成的影象有更多的色彩。

Patch對比

D是基於Patch的,Patch的大小也是一個可以調整的引數。

不同的size產生了不同的結果。1x1的patch就是基於Pixel的D,從結果上看,沒帶來清晰度的提升,但是卻帶來了更多的顏色。也證明了上一個實驗的結論。

16x16的Patch已經可以達到更好的效果,但是多很多東西(一些亂七八糟的點)。70x70可以消除這些。再變大到286x286,就沒有多大的效果提升了。

U-Net

U-Net中使用了skip-connection,而使用與不使用也做了對比實驗

可以看到,使用普通的Encoder-Decoder導致了很大的模糊。

效果圖

總結

本文將Pix2Pix論文中的所有要點都表述了出來,主要包括:

cGAN,輸入為影象而不是隨機向量
U-Net,使用skip-connection來共享更多的資訊
Pair輸入到D來保證對映
Patch-D來降低計算量提升效果
L1損失函式的加入來保證輸入和輸出之間的一致性。
Reference

[1]. Image-to-image translation with conditional adversarial networks
[2]. 對抗神經網路
[3]. 卷積神經網路