1. 程式人生 > >【論文】GAN影象轉換之從pix2pix到cycle GAN

【論文】GAN影象轉換之從pix2pix到cycle GAN

該節分享兩篇使用GAN的方法來進行影象轉換方面的文章,分別是pix2pix GAN 和 Cycle GAN,兩篇文章基本上是相同的作者發表的遞進式系列,文章不是最新,但也不算舊,出來半年多點,算是比較早的使用GAN的方法進行影象轉換的文章吧,該部分將詳細解讀其實現過程。

影象轉換或者影象的風格轉換,顧名思義,是指把一副影象A按照另一幅 影象B的模式/風格進行轉換的一個操作,例如 “白天->黑夜”,“晴天->雨天”等等;

1. 一些方法

在深度學習的方法廣泛應用以後,使用深度學習方法比較早做這件事的就是使用CNN框架來做的,也就是2016cvpr的一篇文章“Image style transfer using convolutional neural networks”基於深度卷積神經網路的方法。當時出來的時候也比較火,也有一些方法在此類方法上的改進。

隨著生成對抗網路(GAN)這種在影象生成上具有天生強大能力的網路結構的出現,使用GAN方法做影象生成又成為了一個比較流行的方法。列舉幾個截止到目前使用GAN為基礎的方法:

  • pix2pix GAN (1611)
  • CycleGAN (1703)
  • DiscoGAN (1703)
  • PAN( Perceptual Adversarial Networks)感知GAN (1706)
  • StarGAN (1711)

這些方法的最終效果上可能都是為了進行影象轉換,實現的形式不同而已。包括最近出來的StarGAN。

先簡單看下各類方法一個效果:

  • 基於深度卷積神經網路的方法

這裡寫圖片描述

  • pix2pix GAN

    這裡寫圖片描述

  • CycleGAN

    這裡寫圖片描述

  • DiscoGAN

    這裡寫圖片描述

  • PAN

    這裡寫圖片描述

  • StarGAN

    這裡寫圖片描述

2. 關於GAN與cGAN基礎理論

研究基於GAN的影象轉換方法首先需要對GAN的基本原理有一定了解,關於GAN的原理部分可以參考以前的一篇部落格:

這裡簡略說下,GAN我們知道,其思想就是一個二人零和博弈思想,由兩個部分構成:生成器G + 判別器D,其中生成器就是生成真實的假樣本;
判別器就是用來判別樣本的真假;一般的GAN可以用下圖表示:

這裡寫圖片描述

關於GAN如何工作如何訓練的請看上面的那篇文章。

訓練好的GAN的生成器就可以產生逼真的樣本了。

但是這種傳統的GAN有一個問題是每次訓練後,所有的隨機噪聲很有可能產生相同的樣本,為了可以產生不同的樣本,條件GAN就出來了,也就是cGAN。cGAN其實和GAN在訓練過程上完全一樣,所不同的是對於輸入的樣本,除了樣本外,還要加上一個條件,這個條件可以是label,也可以是其他的廣義的東西(廣義的label)。cGAN可以用下圖表示:

這裡寫圖片描述

基於此我們就可以根據條件來產生不同的影象了。

3. pix2pix GAN

文章的框架如圖所示:

這裡寫圖片描述

來看一下這個框架,整個框架依託cGAN的思想,判別網路的輸入是一個兩張圖組成給的資料結構,可以認為是圖+label,可能有人會奇怪,這裡的label為什麼是一張圖,這怎麼是cGAN呢,我們前面說過,條件GAN接受的條件並不一定都是低維度的數值,也可以是廣義的label,這裡就可以認為右邊的那個白色的圖就是label,如果我們常見的GAN的判別器的輸入是一個rgb三通道的影象的話,這裡就好比輸入的是一個6通道的兩個圖疊加的圖。那麼為什麼要這麼做呢?主要的原因應該還是為了滿足生產器,其次是為了使得網路可以有效的訓練。

可以看一下上述的判別器部分,此時我們白色的影象充當著噪聲的功能,也就是可以把白色影象經過生成器變成黑色的圖,同時黑色的圖和白色的圖疊加作為假樣本來訓練。這樣我們可以發現,對於這一次的真假樣本,因為白色的圖(好比是label)是一樣的,要想使得判別器無法判別真假,那麼生成的黑色的圖必須儘可能的與真樣本的黑色的影象相似才滿足條件吧,這也是為什麼要把黑白兩者疊加在一起作為樣本輸入的原因。

試想一下,假如只把黑色的當做真假判斷條件而沒有白色的,那麼當把白色A影象送入生成器後,可能生成了黑色B影象,這個時候,黑色A與黑色B對於判別器來說都是真樣本,所以判別器很容易沒有誤差了而生成器也是錯的,達不到把白A生成白B的目的。

基於此可以看到這篇文章使用cGAN來實現影象轉換的合理性,那麼整個的目標函式可以表示如下:

這裡寫圖片描述

注意的是目標函式包含兩項,第一項就是一個一般條件GAN的常規優化函式,至於這個式子怎麼理解,為什麼要這麼寫依然可以參考上述的那篇文章。這裡重點看一下第二項的一個loss,這可以理解為一個重建誤差項,也就是上面白色通過生成器生成的影象(G(x,z))與原始的黑色影象y之間的誤差。(這裡的黑白其實可以互換生成)

這個優化目標就是這樣,這裡的最終目的就是為了得到一個比較好的G,可以將白色轉換為黑色,有了這個G也就達到了影象轉換的目的了。

G的構造

下面來看一下這個G是如何構造的,文章中展示了兩種影象生成影象的典型結構,一個是自編碼結構,一個是改進的U-Net結構:

這裡寫圖片描述

很顯然,從結構上也知道第二種結構要好,實驗也會對比。

影象的patch實驗

這篇文章中另一個小的結構點是實驗了PatchGAN的方式,也就是對於生成器或者判別器,不是以整個影象整個影象的當做輸入,而是以小的patch來進行的。把一副影象劃分為N*N個patch後,對於每一塊進行上述的那個操作。可以發現當N=1的時候,相當於逐畫素進行了,當N=256(影象大小為256的話),就是一幅影象一幅影象的操作。當然文章的實驗發現當N=70的時候,效果最好。

其實當N是某一個固定塊的一個最大的好處是,可以由小的影象生成大的影象,因為反正你都是對塊進行操作的。比如你的原始影象都是256*256的,每70*70一個塊進行的。訓練的模型,假如有一個1000*1000的影象需要轉換,是不是也可以轉換,只需要把1000轉成多個70的塊,每個塊單獨轉換即可。

文章的實驗

文章列舉了encoder-decoder與U-Net的不同導致的生成結果的不同的實驗。同時也列舉了不同的loss導致的結果的不同,可以參考原文。

看幾個最終的生成結果的實驗:

這裡寫圖片描述
這裡寫圖片描述

4. cycle GAN

首先來想想這篇文章的出發點,這篇文章和上面那篇基本上是一組作者,上面那篇我們已經看到,資料集的一個非常重要的要求就是你的影象必須是成對的,這一點其實是非常苛刻的,現實中很難找到,就好比同一個場景下的白天和黑夜的兩幅圖,很難找到這樣一個大的資料集裡面包含完全相同的同一個場景下的白天與黑夜圖。那麼這篇文章就是為了解決這樣一個問題,就是訓練集不在需要同一組完全配對的圖,只需要兩個模式不同的圖即可,如下:

這裡寫圖片描述

首先我們來看一下框架:

這裡寫圖片描述

這裡有兩個模式不同的資料集X和Y,整個網路的構建就是後面的那個樣子,這幾個圖不太好理解,首先先明白這裡有四個東西:G,F,Dx,Dy。其中的G,F是兩個不同的生成器,Dx,Dy是兩個不同的判別器,可能有人會說為什麼會各有兩個呢,沒錯就是兩個,至於為什麼,看後面。那麼G專門負責把X轉換為Y的模式下的圖,F則相反。Dx則專門判別X這一類模式圖的真假,Dy則專門判別y這一類模式的真假。整個的loss可以表示為:

這裡寫圖片描述

下面來詳細探討下這三類loss,首先是前兩個一般情況下的GAN的loss。這裡把這兩個簡化一下如下:

這裡寫圖片描述
這樣應該好理解了,首先是第一類GAN的loss,這裡認為Y是真的樣本集,而把X作為生成樣本集的輸入,這樣就會產生一類Y模式下的X了,通過Dy來判斷真的Y和X生成的假的Y來實現訓練的目的。同理把X和Y換個位置就變成了上圖下面的情況了。可以說這一過程是非常的巧妙,巧妙在於X與Y都是真樣本集,同時又可以實現生成的假樣本集,並且並不要求X與Y是同一個物體,只要他們的潛在模式一樣即可。

接下來是第三類重建誤差loss了,依然用一個圖表示下:

這裡寫圖片描述

這裡可以看到,存在著兩種重建誤差了吧,首先是X的,X經過G可以變成假Y,假Y進F又可以還原會假X,我們的目的就是讓真X與假X足夠相似,公式表示就是這種重建誤差了。這是對於X是這樣,同理對於Y也是如此。
看到這裡,同樣一聲驚歎這種設計方法的巧妙。這就是整個loss的構成,基於此,網路可以得到很好的訓練了。最終也可以訓練得到想要的G,F,Dx,Dy。而G,F才是最好可以用來作為影象轉換使用的。

來看幾個最終的實驗結果吧:

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

5. 總結

這就是兩篇關於影象轉換應用文章,第一章需要配對的影象,要求比較苛刻,第二中則完全沒有這個要求,適用範圍更廣了。附上作者的兩個專案地址:

現實其他任務中,很多問題就是兩種不同模式之間的轉換問題,巧妙的應用也許會帶來不一樣的效果,發揮想象吧~…~

筆記首次發表於公眾號:“AInewworld”,歡迎關注瞭解更多~