風格遷移背後原理及tensorflow實現
前言
本文分為以下部分:
第一節:深度學習在風格遷移上的背後原理;
第二節:風格遷移的程式碼詳解
第三節:總結
影象風格遷移指的是將影象A的風格轉換到影象B中去,得到新的影象,取個名字為new B,其中new B中既包含影象B的內容,也包含影象A的風格。如下圖所示:
從左到右依次為影象A,影象B,影象new B
本文著重介紹基於深度學習技術的風格遷移的原理及其實現,實現使用的工具如下:
- 框架:Tensorflow 1.4.1
- 語言:python 2.7
- 系統:ubuntu 16.04
注:其他條件同樣可行,如有問題,歡迎評論、私信
最終效果部分展示:
原圖:
風格遷移後的影象,右上角那一張明顯風格遷移過頭了,可以設定style_loss的比例做調整:
,最滿意的就是左上角那一張了。
第一節:深度學習在風格遷移的背後原理
1.1 背後原理簡介
深度學習技術可謂無孔不入,在計算機視覺領域尤為明顯,影象分類、識別、定位、超解析度、轉換、遷移、描述等等都已經可以使用深度學習技術實現。其背後的技術可以一言以蔽之:卷積網路具有超強的影象特徵提取能力
其中,風格遷移演算法的成功,其主要基於以下兩點:
- 兩張影象經過預訓練好的分類網路,若提取出的高維特徵()之間的歐氏距離越小,則這兩張影象內容越相似
- 兩張影象經過與訓練好的分類網路,若提取出的低維特徵()在數值上基本相等,則這兩張影象越相似,換句話說,兩張影象相似等價於二者特徵的矩陣具有較小的弗羅貝尼烏斯範數。
基於這兩點,就可以設計合適的損失函式優化網路。
1.2 原理解讀
對於深度網路來講,深度卷積分類網路具有良好的特徵提取能力,不同層提取的特徵具有不同的含義,每一個訓練好的網路都可以視為是一個良好的特徵提取器,另外,深度網路由一層層的非線性函式組成,可以視為是複雜的多元非線性函式,此函式完成輸入影象到輸出的對映,因此,完全可以使用訓練好的深度網路作為一個損失函式計算器。
矩陣的數學形式如下:
Gram矩陣實際上是矩陣的內積運算,在風格遷移演算法中,其計算的是feature map之間的偏心協方差,在feature map 包含著影象的特徵,每個數字表示特徵的強度,Gram矩陣代表著特徵之間的相關性,因此,Gram矩陣可以用來表示影象的風格,因此可以通過Gram矩陣衡量風格的差異性。
1.3 論文解讀
本次主要介紹的是論文:Perceptual Losses for Real-Time Style Transfer and Super-Resolution
直接上圖:
網路框架分為兩部分,其一部分是影象轉換網路(image transfrom net)和預訓練好的損失計算網路VGG-16(loss network),影象轉換網路以內容影象為輸入,輸出風格遷移後的影象,隨後內容影象(也即是),風格影象,以及輸入vgg-16計算特徵,損失計算如下:
內容損失:, 其中代表深度卷積網路VGG-16
感知損失如下:,其中G是Gram矩陣,計算過程如下:
總損失定義如下:
其中影象轉換網路T定義如下圖:
網路結構三個卷積層後緊接著5個殘差塊,然後兩個上取樣(鄰近插值的方式),最後一個卷積層,第一層和最後一層的卷積核都是9x9,其餘均為3x3。每個殘差塊中包含兩層卷積。
第二節:程式碼詳解
本次實驗主要基於tf的slim模組,slim封裝的很好,呼叫起來比較方便。接下來分為網路結構,損失函式,以及訓練部分分別做介紹。
2.1 網路結構
slim = tf.contrib.slim
# 定義卷積,在slim中傳入引數
def arg_scope(weight_decay=0.0005):
with slim.arg_scope([slim.conv2d, slim.fully_connected, slim.conv2d_transpose],
activation_fn=None<