1. 程式人生 > >基於神經網路的影象風格遷移(一)

基於神經網路的影象風格遷移(一)

    影象的風格遷移始於2015年Gates的論文“Image Style Transfer Using Convolutional Neural Networks”,所做的工作很好描述,就是由一張內容圖片和一張風格圖片進行融合之後,得到經風格渲染之後的合成圖片。示例如下

    對於人來說,可以很輕易的分辨出不同風格的圖片,但是如何讓計算機理解什麼是風格是這個專案的難點,下面詳細解析專案的原理。


    Gates使用的是經典的VGG19網路,從上圖可以看出,VGG19可以分為5個block,每個block都是由若干卷積層及之後的池化層組成,這5個block的池化層都是最大池化,只是卷積層的層數不同,第一個block有2層卷積(conv1_1和conv1_2),第二個block也是2層卷積,之後的3個block都是4層卷積,最後是兩個全連線層(FC1和FC2)和一個用於分類的softmax層。但是風格遷移任務不同於物體識別,所以我們不需要最後的兩個全連線層和softmax層。


    最左側的兩張圖片(input image)一張是作為內容輸入,一張是作為風格輸入,分別經過VGG19的5個block,由淺及深可以看出,得到的特徵圖(feature map)的高和寬逐漸減小,但是深度是逐漸加大,Gates為了更直觀地讓人看到每個block提取到的特徵,所以做了一個trick,即特徵重建,把提取到的特徵做了一個視覺化。但是細心的讀者可以看出,對於內容圖片特徵的提取在很大程度上是保留了原圖的資訊,但是對於風格圖片來說,基本上看不出原圖的樣貌,而是可以粗略的認為提取到了風格。這是為什麼呢?原來對於這兩張圖片做的特徵提取處理是不一樣的,在下一張圖就可以看出。


    兩側的圖片分別是風格圖片,記為 

,和內容圖片,記為 ,同時還需要有第三張隨機產生的噪聲圖片,我們需要不斷的在噪聲圖片上迭代,直至得到結合了內容和風格的合成圖片。內容圖片經過VGG19網路的5個block會在每層都得到feature map,記為,即第l個block得到的特徵,噪聲圖片經過VGG19網路的5個block得到的特徵記為 

    對於內容損失,只取conv4_2層的特徵,計算內容圖片特徵和噪聲圖片特徵之間的歐式距離,公式為

    對於風格損失,計算方式與內容損失有些許不同。上面已經知道,噪聲圖片經過VGG19網路的5個block得到的特徵記為 的gram矩陣記為,風格圖片經過VGG19網路的5個block得到的特徵,再計算gram矩陣後得到的內容記為

,之後計算之間的歐式距離,其中gram矩陣的公式為:                                       

    風格損失的公式為:


公式之前的係數是標準化操作,除以圖片的面積(長*寬)的平方。

    還需要注意的是,計算風格損失時,5個block提取的特徵都用來計算了,而計算內容損失,實際上只用了第四個block提取的特徵。這是因為每個block提取到的風格特徵都是不一樣的,都參與計算可以增加了風格的多樣性。而內容圖片每個block提取到特徵相差不大,所以只取一個就好,而且使用哪一個也沒有規定,與各人審美有關,Gates選用的是第四個block,而Johnson在論文“Perceptual Losses for Real-Time Style Transfer and Super-Resolution”中使用的是第二個block。

    而總損失即為內容損失和風格損失的線性和,改變α和β的比重可以調整內容和風格的佔比。


    程式碼中還使用了一個trick,總loss的計算還會加上一個total variation loss用來降噪,讓合成的圖片看起來更加平滑。

    最後還有一點需要注意,這一點非常關鍵,曾經讓我困惑了很久,就是總loss需要經過梯度下降不斷迭代,那這裡是對什麼求偏導,大多人會以為是對權重w求偏導,這是錯誤的。我們的權重資訊是從vgg19網路模型中直接讀取的,不需要更新,也不能更新。實際上是對噪聲圖片求偏導,不斷迭代噪聲圖片,收斂後就會得到我們需要的合成圖片。

    最後的最後放上自己的實驗結果。