1. 程式人生 > >風格遷移背後原理及tensorflow實現

風格遷移背後原理及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. 兩張影象經過預訓練好的分類網路,若提取出的高維特徵(highlevel)之間的歐氏距離越小,則這兩張影象內容越相似
  2. 兩張影象經過與訓練好的分類網路,若提取出的低維特徵(lowlevel)在數值上基本相等,則這兩張影象越相似,換句話說,兩張影象相似等價於二者特徵的Gram矩陣具有較小的弗羅貝尼烏斯範數。

基於這兩點,就可以設計合適的損失函式優化網路。

1.2 原理解讀

對於深度網路來講,深度卷積分類網路具有良好的特徵提取能力,不同層提取的特徵具有不同的含義,每一個訓練好的網路都可以視為是一個良好的特徵提取器,另外,深度網路由一層層的非線性函式組成,可以視為是複雜的多元非線性函式,此函式完成輸入影象到輸出的對映,因此,完全可以使用訓練好的深度網路作為一個損失函式計算器。

Gram矩陣的數學形式如下:Gj(x)=AAT
Gram矩陣實際上是矩陣的內積運算,在風格遷移演算法中,其計算的是feature map之間的偏心協方差,在feature map 包含著影象的特徵,每個數字表示特徵的強度,Gram矩陣代表著特徵之間的相關性,因此,Gram矩陣可以用來表示影象的風格,因此可以通過Gram矩陣衡量風格的差異性。

1.3 論文解讀

本次主要介紹的是論文:Perceptual Losses for Real-Time Style Transfer and Super-Resolution
直接上圖:
這裡寫圖片描述
網路框架分為兩部分,其一部分是影象轉換網路T(image transfrom net)和預訓練好的損失計算網路VGG-16(loss network),影象轉換網路T以內容影象x為輸入,輸出風格遷移後的影象y,隨後內容影象yc(也即是x),風格影象ys,以及y輸入vgg-16計算特徵,損失計算如下:
內容損失:lfeatφ;j(y;y)=1CjHjWj||φj(y)φj(y)||2, 其中φ代表深度卷積網路VGG-16

感知損失如下:lstyleφ;j(y;y)=||Gj(y)Gj(y)||F2,其中G是Gram矩陣,計算過程如下:

Gjφ(x)c,c=||Gjφ(y)Gjφ(y)||

總損失定義如下:Losstotal=γ1lfeat+γ2lstyle

其中影象轉換網路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<