目錄
一、簡要說明
二、具體實施步驟
2.1綜述
2.2基本思路
2.3核心思路
2.4基本問題處理
三、代碼的簡要描述
四、成果展示
一、簡要說明
本次學習的圖像風格遷移算法是基于一個2015年由Gatys等人發表的文章A Neural Algorithm of Artistic Style_的一個代碼複現
寫這篇文章主要是做一下學習記錄。
二、具體實施步驟
2.1綜述
輸入一張随機噪聲構成的底圖,通過計算Style Loss和Content Loss,疊代更新target,風格上與Style圖像類似,内容上與原照片相似。正常的訓練過程是通過loss反向傳播更新網絡參數,論文中則是用一個已經訓練好的VGG16作為backbone,鎖住參數,更新輸入的底圖。類比畫家作畫的話,随機噪聲就是畫家的畫紙,網絡提取更新的内容特征相當于畫家打的線稿,風格特征則是畫家寫真的風景對象(晴天,雨天,雪天等等各種風格)。
具體說,論文用 Gram 矩陣來對圖像中的風格進行模組化和提取,再利用慢速圖像重建方法,讓重建後的圖像以梯度下降的方式更新像素值,使其 Gram 矩陣接近風格圖的 Gram 矩陣(即風格相似),然後,用VGG網絡提取的高層feature map來表征圖像的内容資訊,通過使 VGG 網絡對底圖的提取的高層feature map接近目标圖高層的feature map來達到内容相似,實際應用時候經常再加個總變分 TV 項來對結果進行平滑,最終重建出來的結果圖就既擁有風格圖的風格,又有内容圖的内容。
Gram矩陣是論文的核心思想,是一種基于統計分布的參數化紋理模組化方法,使用Gram矩陣可以很好的提取圖像風格。
在進行圖像内容特征提取的過程中,這裡使用VGG網絡高層特征表達目标圖像的内容特征。得益于對神經網絡黑盒特性的不斷研究,學者們發現,神經網絡的中間層提取到的圖像特征是不一樣的,越靠近輸入層的中間層提取到的特殊是淺層特征(即,點,線,色塊等低級特征);越靠近輸出層的中間層提取到的特征是進階特征(例如,邊,角,輪廓等)。是以,圖像的内容資訊可以使用神經網絡提取到的進階特征來表達(實際上,Gram矩陣是對神經網絡提取的淺層特征做變換得到的,用來表示風格)。
2.2基本思路
其實代碼的核心思想并不複雜,就是利用CNN提取内容圖檔的内容和風格圖檔的風格,然後輸入一張新的圖像。對輸入的圖像提取出内容和風格與CNN提取的内容和風格進行Loss計算,Loss的度量可以使用MSE,然後逐漸對Loss進行優化,使Loss值達到最理想,将被優化的參數進行輸出,這樣輸出的圖檔就達到了風格遷移的目的。
2.3核心思路
1、使用現成的識别網絡,提取圖像不同層級的特征。
(該項目使用的現成的識别網絡是VGG19模型。)
2、低層次響應描述圖像的風格,高層次響應描述圖像的内容。
3、使用梯度下降方法,可以調整輸入響應,在特定層次獲得特定的響應。
4、多次疊代之後,輸入響應即為特定風格和内容的圖像。
2.4基本問題處理
1、内容損失(conten loss):對輸入的content圖像與生成的target目标圖像進行歐式距離計算任取一張圖像
,将其輸入到分類網絡中,其中第L卷積層的響應記為
,尺寸為HL*WL*NL。對于目标target圖像
,同樣送入該網絡,可以得到該層的響應
,若希望
和
内容相似,我們則需要最小化如下的二範數誤差:
這一誤差可以對本層響應的每一進制素求導:
其中h=1,2……H,w=1,2……W,k=1,2,3……N
進一步,利用鍊式法則,可以求得誤差對輸入圖像的每一進制素的導數
。這一步就是神經網絡經典的back-propagation方法。利用
來更新
,可以獲得一個新的輸入圖像,其在第L層的響應
更接近目标圖像的響應
。也就是說,可以目标target圖像的内容更加接近。
2、風格損失(style loss)使用Gram矩陣代表圖像的風格
引入一個
的特征矩陣
:
i=1,2……N,j=1,2,3……N
由第L 層的響應計算而來,但是消除了響應的位置資訊,可以看做對于風格的描述。ij位置的元素描述第i通道響應和第j通道響應的相關性。對于目标圖像相應層的風格
,最小化如下誤差可以使
和
的風格近似:
可以求得誤差對本層響應的導數:
同樣可以通過back-propagation求得
,進而更新
使其風格接近
3、總損失:将style loss 與content loss 進行相加。
4、圖像中的資訊:
使用分類網絡中卷積層的響應來表達圖像的風格和内容
5、為什麼Gram矩陣能夠定義圖像的風格?
因為CNN卷積過後提取了圖像的特征圖,每個數字就是原圖像的特性大小,而Gram矩陣是矩陣的内積運算,運算過後特征圖中越大的數字會變得更大,這就相當于對圖像的特性進行了縮放,使得特征突出了,也就相當于提取到了圖檔的風格。
三、代碼的簡要描述
- 擷取VGG19模型中的features部分
- 當機所有VGG參數
- 判斷是否有GPU,如果有GPU則使用GPU來處理代碼,否則使用CPU來執行
- 導入content圖檔和style風格圖檔,并且要求圖檔的參數為400*400像素(圖檔過大會影響效率,是以要處理一下)
- 加載content圖像和style風格圖像
- 在形成目标圖像之前,隻擷取一次内容和樣式特征
- 計算樣式表示的每一層的gram矩陣
- 設定疊代參數
- 在VGG的基礎上疊代建構我們自己的CNN網絡
疊代内容:
1、擷取目标圖像target的特征
2、計算内容損失(content圖像與target圖像的距離)
3、初始化風格損失(style圖像與target圖像之間的距離)
4、疊代計算風格損失
5、計算總的損失
6、更新target圖像
7、儲存中間圖像并列印損失
(其中還需編寫函數方法實作計算Gram矩陣、擷取圖像特征features、tensor格式到圖像的轉換)