目錄
- 整體思路
- 原理理解
- 實際操作
2015年,Gatys等人發表了文章《A Neural Algorithm of Artistic Style》,首次使用深度學習進行藝術畫風格學習。為普通照片 "賦予" 名畫風格。猶如兩個不同物體的靈魂和肉體的重組。本文將基於這篇論文和一些大佬的文章說下我的拙見。
一、整體思路
藝術風格轉換的主要目的是將一張參考圖片的風格應用到另一張原始圖片上,最后的生成圖片能既保留原始圖片的大體內容,又展現出參考圖片的風格(style) 。這里得風格 指狹義上一張圖片的紋理、色彩、視覺模式等等,比如紋理有個特點是和所在位置無關,基於這個特點,只要是和位置無關的統計信息,都可以試着來表示紋理的特征。而內容 (content) 則指的是圖片的宏觀構造。
大致的流程是:輸入為白噪聲圖像, 通過不斷修正輸入圖像的像素值來優化損失函數,最終得到的圖像即輸出結果
說明
內容圖:普通圖片,需要進行風格遷移得主題圖片;
風格圖:具有風格的圖片,一般用名畫或者紋理的圖片;
白噪聲圖:生成圖的初始化圖片
VGG:預訓練模型,即別人已經訓練好的模型
步驟
- 生成目標圖片:先將內容圖和風格圖輸入"喂給"VGG,然后生成目標內容圖和目標風格圖(僅一次輸入),用作后面Loss的計算。
- 初始化合成圖片:這里內容圖上添加白噪聲的方式來初始化合成圖,我們將白噪聲圖片"喂給"VGG,就得到了合成圖片。
- 載入預訓練模型:Content信息捕捉,得到content loss,Style信息捕捉,得到style loss
- 計算總Loss值:這里我們分別采用內容損失+風格損失得出總的loss,兩者配置一定權值
- 優化函數:這里優化函數采用AdamOptimizer
- 訓練模型
二、原理理解
卷積操作(convolution)是一個有效的局部特征抽取操作。深度學習之所以能"深",原因之一便是前面的卷積層用少量的參數完成了高效的特征萃取。作為imagenet 13年的冠軍,vgg模型的特征提取能力毋庸置疑。原版 Style Transfer 算法的第一步便是將風格圖(Style)和內容圖(Content)圖輸入vgg網絡,並將conv1~conv5的結果分別保存下來。效果如下圖,可以看到越后面的結果越抽象。
上圖也可以看出:網絡不同層次描述了圖像不同層次的信息:低層次描述小范圍的邊角、曲線,中層次描述方塊、螺旋,高層次描述內容。
有了不同層次的抽象特征后,下一步是糅合。對於生成的圖片,我們希望它"骨架"接近內容圖(content),"畫風"接近接近風格圖(style),具體如下:
2.1 總體loss定義:
上式的意思是我們希望參考圖片與生成圖片的風格越接近越好,同時原始圖片與生成圖片的內容也越接近越好,這樣總體損失函數越小則最終的結果越好。原文中的函數表達式如下:
其中的內容和風格具體情況請看下面:
2.2 內容的損失Content Loss
圖片的內容主要指其宏觀架構和輪廓,而卷積神經網絡的層數越深則越能提取圖片中全局、抽象的信息,因而論文中使用卷積神經網絡中高層激活函數的輸出來定義圖片的內容,那么衡量目標圖片和生成圖片內容差異的指標就是其歐氏距離 (即 contentlosscontentloss ):
其中,等式左側表示在第l層中,原始圖像(P)和生存圖像(F)的舉例,右側是對應的最小二乘法表達式。Fij表示生存圖像第 i 個feature map 的第 j 個輸出值。
最小二乘法使用求導得出最小值,讓在改l層上生存的圖片F逼近改層的原始圖片P。
2.3 風格損失 Style Loss
"風格" 本來就是個比較虛的東西,沒有固定的表示方法,論文中采用的是同一隱藏層中同 feature map 之間的 Gram 矩陣來表示風格,因而又稱為 "風格矩陣" 。也是其算法核心所在,正是因為這個矩陣很好的模擬texture,訓練出的效果才如此優秀。若想深入了解這塊,推薦讀 Naiyan Wang 的 [1701.01036] Demystifying Neural Style Transfer 。這里簡單描述一下G矩陣:
其中左側Gl代表第l層響應圖對應的Gram矩陣,Fij代表該層第i個卷積核對應的響應圖(通常是二位的)的第K各元素。所以Gram矩陣的每一個元素就是求了個內積,把兩個響應圖之間,和位置無關的一種相關性給求了出來,故能體現風格特征。
接下來的套路就和上一小節一樣了,把每層Gram矩陣作為特征,讓重建圖像的Gram矩陣盡量接近原圖的Gram矩陣,也是個優化問題:
同樣是使用最小二乘方式,但是前面帶上系數,其中E表示該層的一個損失;N*N是G矩陣的大小,M*M是生存G矩陣的F矩陣大小,故都要作為分母。G表示生成,A表示風格圖像在該層的矩陣。
同樣的,也是根據梯度下降的方式來優化目標。
根據之前的表達式,對每層進行加權求值。得到風格的總體損失。
當然論文中還對這些超參數做了調整,並比較了各個不同超參數生成出來的效果進行了比較。
三、實際操作
過程中,可以分成以下幾步:
A. 圖像預處理(內容圖、畫風圖)、生成圖占位符定義
B. 預訓練模型加載
C. 三張圖跑網絡
D. 內容損失計算
E.格拉姆矩陣計算
F. 風格損失計算
G. 損失和梯度匯總
H. 設置迭代計算圖
I.選擇生成圖優化方法
J. 開始迭代