您當前的位置:首頁 > 攝影

論文筆記-pixel2pixelHD

作者:由 Liii 發表于 攝影時間:2019-06-12

論文原題:High-Resolution Image Synthesis and Semantic Manipulation with Conditional GANs

論文地址:

這個文章也被叫是pixel2pixelHD,沒記錯的話,和之前那個Photographic Image Synthesis with Cascaded Refinement Networks有點像(不光是像,是以其為baseline的其實,這篇文章的筆記我文章裡也有)。不同的是,CRN的作者覺得adversarial不穩,但是本篇文章的作者卻用了cGAN,妥妥的adversarial network。講道理我個人也覺得cGAN應該是比較好的,和VAE一樣,能夠對生成的東西進行控制甚至進行disentangle,這樣做manipulation那真是極好的。不扯別的,看文章。

這個文章用了novel的adversarial loss,multi-scale的generator和discriminator並且生成了high resolution的圖片。還延伸做了互動式的操作控制生成。第一是object instance的增減,第二是針對同一class,同一instance的不同appearance的生成。針對我們前面提到的CRN裡面說,GAN的模型:1。無法生成出high resolution的圖片,2。生成出來的圖片缺乏details和realistic的texture,這篇文章則提出瞭解決辦法。作者首先是單純使用adversarial training得到result,且不用依賴於任何人工設計的losses和perceptual loss from pre-trained的network(VGG)。然後證明如果增加perceptual loss可以slightly增加在某些情況下的結果表現。然後就是前面提到的兩種互動式的延伸。

文章是

Instance Level Image Synthesis

結構是這樣的:1。先介紹pixel2pixel的baseline,然後介紹怎麼在此基礎上,透過改進objective function和network來提升photorealistic和resolution。接著作者用額外的semantic information來進一步提高生成的圖片的質量。最後就是引入instance-level 的特徵鑲嵌來進一步做互動式的影象合成。

先是

pixel2pixel baseline

這個pixel2pixel其實就是conditional GAN,是image-to-image的translation。很簡單有一個generator G和discriminator D。在這篇文章當中,G的任務就是從semantic layout生成出一個realistic-looking的圖片。而D的任務就還是區分這個生成的圖和real的圖。注意,很明顯這也是個supervised的任務。具體這個pixel2pixel怎麼做的我再另一篇筆記裡寫了,就不細講了這裡。這裡不同的是,本篇的作者想做高解析度的影象生成,然後他嘗試了用pixel2pixel的方法,然鵝發現並不行,不穩定且結果差強人意。因而就提出了改進辦法。

Improvement

前面講了作者目的是為了提升生成影象的解析度,那麼怎麼做呢?作者設計了一個coarse-to-fine generator,然後是一個multi-scale的discriminator,再配上一個robust的對抗的目標函式。

首先是generator:generator被分成了兩部分G1和G2,G1是global generator network,G2是global enhancer network。結構圖如下:

論文筆記-pixel2pixelHD

Global generator是對一個1024*512的影象作為輸入,local enhancer也就是G2是將一個生成出的1024*512的影象提升到2048*1024解析度。如果想要更高的解析度,可以再加enhancer,比如從已有的2048*1024提到4096*2048。這樣generator的組合就從{G1, G2}變成了{G1, G2, G3}。他們的這個結構是基於《J。 Johnson, A。 Alahi, and L。 Fei-Fei。 Perceptual losses for real-time style transfer and super-resolution。 In European Conference on Computer Vision (ECCV), 2016》這篇文章的。注意上圖中的G1其實是由三部分組成的,首先是一個convolutional front-end

G_{1}^{(F)}

,中間是residual block

G_{1}^{(R )}

,後面接的是一個transposed convolutional back-end

G_{1}^{(B)}

。一個2 x downsampling出來的1024*512的圖片是按順序經過這三部分最後生成出一個1024*512的影象的。

local enhancer network同樣也是由三部分組成。首先是一個convolutional front-end的

G_{2}^{(F)}

,然後是一組residual blocks

G_{2}^{(R)}

,再接著是transposed convolutional back-end

G_{2}^{(B)}

注意這整個的流程,是首先輸入一個2048*1024的semantic segmentation map,然後經過G2的front-end卷積,downsampling變成一個1024*512的image輸入,輸入給G1,G1則是經過卷積,residual blocks,反捲積,然後生成出一個1024*512的影象輸出,再將這個輸出和前面G2 front-end卷積部分的feature map合在一起,給到G2的residual blocks,相當於U-net的形狀了,最後接一個G2的transposed convolutional layer反捲積,將解析度提高到2048*1024輸出成為最終結果。

在train的過程中,作者是這樣做的,先train Global generator,再train local enhancer,然後再一起fine-tune。作者表示generator這樣設計,可以很好的綜合global和local的feature。

Multi-scale discriminators

大家應該都知道,GAN的discriminator的設計其實一直以來都是比較困難的。尤其是對高解析度的生成影象來說,discriminator是需要一個相對很大的感受野的,這就需要要麼卷積核比較大,要麼網路比較深。這可以增加網路效能但也容易造成overfitting,而且還對硬體要求比較高。然後作者就設計了multi-scale discriminators。他這個由三個不同的discriminator組成,三個是一樣的網路結構,但是作用於不同的image scale,就叫D1,D2,D3。然後就對生成出來的圖片,進行downsampling,factor為2和4,這樣一來就有三張不同resolution的圖片了,然後分別給到相同結構的三個Discriminator裡去,這樣一來,解析度最小的圖片對應的D會有更大的感受野,對影象生成的全域性感更強,解析度最大的影象對應的D則是會捕獲更finer更精細的detail。於是整個的target就如下了:

論文筆記-pixel2pixelHD

Improved Adversarial Loss

原始的GAN的loss是這樣的:

論文筆記-pixel2pixelHD

這沒什麼問題,見的也很多了。作者在這裡為了更好的能夠生成出高解析度的圖片,對上式進行了修改。重點是在discriminator D上,我們前面講了discriminator是三個,而且是每個都是多層的卷積網路。因而這裡就對用synthesized影象從不同層提取出來的卷積特徵與真實圖片提取出來的特徵做match,然後得到對應的loss,loss function如下:

論文筆記-pixel2pixelHD

這裡的

D_{k}^{(i)}

,k指的是第幾個Discriminator(如上所說共3個),i指的是每個Discriminator中的第幾層layer。N則指的是每層中元素的數量。T是共有多少個layer沒啥好說的。這個就和image transfer的perceptual loss比較類似。因而把這個feature loss和GAN的real or fake loss合起來,總的loss就成了:

論文筆記-pixel2pixelHD

Lambda是調整權重的係數,然後要注意這裡的Dk僅僅是用作特徵提取,是不參與train來做對抗來maximize feature matching的loss,也就是後一項。

Instance Maps

作者表明,目前很多人做的synthesis工作,大多是基於semantic label maps而不是semantic instance map的(有啥區別?label maps就是三輛車都是車,instance maps就是車A,車B,車C)。於是作者就做了一個用semantic instance maps來做合成的任務。這樣的maps一般來說,可以直接丟到網路裡去,也可以加一個one-hot編碼然後一起丟到網路裡去。但實際操作上是有問題的,因為編碼一般是固定長度的,但我們其實是無法知道任意一張圖裡面有什麼category的東西,有幾個,因而其實是很難這麼做的,而且其實是很浪費你記憶體空間的。所以作者就argue了,作者覺得semantic label maps和semantic instance maps到底有啥區別,作者認為最大的區別就是instance maps提供了相同category instance之間的邊界boundary。於是作者就在semantic label maps的基礎上,加上了自己計算的boundary map,就是如下這個樣子:

論文筆記-pixel2pixelHD

對於一個boundary map來說,任意一個pixel點,只要其上下左右四個點的categories與之不相同,則這個pixel=1,反之則為0。很明顯為1的就是boundary所在。然後就將boundary map與semantic label map合在一起concatenate在一起,給到generator的網路。同樣,對於Discriminator的輸入,則是一個channel-wise的concatenation,其中包含instance boundary map,semantic label map,real/synthesis image。結果其實還蠻不錯的,如下:

論文筆記-pixel2pixelHD

注意,到此為止,現在的輸入相當於是n+1,之前是instance label maps,現在再加上一層instance boundary map。

Instance-level Feature Embedding

其實就是為了生成diversity的image,注意到給一個semantic label maps其實是一對一的。但我們想要的結果是一對多的,而且,作者這裡想要的結果是可以任意加object進去的。還要做成可以user互動控制的。作者在這裡加了一個low-dimensional的feature channels給到generator中去。那麼這個low-dimensional的feature是怎麼來的呢。作者是train了一個encoder network E來找到feature vector。這就相當於是一個VAE,輸入是ground truth的影象,中間的low-dimensional的latent feature vector對應著ground truth影象,可以理解成是一一種編碼。為了知道哪些這個feature vector中哪些變數對應著那個instance,作者加了一個instance-wise average pooling layer來計算每類instance的feature的均值(同一張圖中同一種類的instance可能有多個,取他們feature的平均值)。然後是decoder是接受feature space的vector並生成出feature圖(均值之後的圖)。這樣修改之後的網路結構如下所示:

論文筆記-pixel2pixelHD

注意作者這裡在train的時候,是將這個encoder-decoder和前面的generator-discriminator一起train的。這也就意味著我們的loss有所變化,之前是:

論文筆記-pixel2pixelHD

不同的地方就在於generator G,此前沒有encoder這個網路,就是之前所講的generator就可以了,現在有了encoder網路,並且給到generator的輸入是encoding出來的結果和semantic label maps合在一起,因而G就變成了G(s, E(x))。這裡的s是semantic label maps,x是ground truth image,E(·)是指的encoder。當training完成了之後,作者用這個encoder network過一遍所有的instance,並記錄下他們所對應的feature,然後對某個instance的所有類別做一個k均值的聚類分析,這樣一來就知道某一個instance的每個類別所對應的feature space的值了,因而也就可以做manipulation了。後面如果想改變某個instance的類別,只需要將其feature space對應的變數的值,改為之前記錄下來的k均值的結果就可以了。

接下來就是結果分析了,

Result

其實這裡沒什麼很特別的要講的,就看一下作者搞了個Human perceptual study,其實就是之前講的在Amazon mechanical turk上面讓人答題,讓真人來選,哪個結果好,把自己生成的和別的模型進行對比。

看看後面的分析,首先是loss function的分析,總得來講我們之前看的loss是兩項,GAN的loss,然後是Discriminator的feature matching的loss,作者在實驗中加了一項,VGG的perceptual loss,並且表示加了這個之後結果會slightly better。但是feature matching loss這一項則是至關重要,顯著地提高了結果表現。

然後是用和不用instance maps的表現,結果是不用instance map,單純用semantic label maps的結果也還可以,但在instance邊界上是很模糊的,但加上了instance maps就會更加realistic,邊界上也會清晰很多。

Generator的分析,對比試驗,那當然作者的generator結果好了,沒啥說的。

Discriminator分析,那當然,還是作者這個牛皮了。差不多了,就說到這了。

寫的不好,也僅為自己的筆記隨筆,如有錯誤,還望不吝賜教。

標簽: instance  loss  Feature  generator  Maps