【畫風遷移】Deep Photo Style Transfer(含代碼詳解)

今天和大家分享的這篇論文是實驗室一個小學妹正在研究的內容,之前也有過一些討論,所以就趁着這個機會把論文翻出來和大家共享一下,有些不足之處還請大家多多指正。不瞭解Neural Style Transfer(NST) 的夥伴們可以結合我們之前專欄裏的其他博客一起食用【專欄——深度學習與藝術】。這篇論文發表於2017年CVPR,是Cornell康奈爾大學和Adobe公司聯合研究的,據說會在photoshop上加入這個應用(設計師的福音!!!,不過好像至今也沒有上線?),不過先放上一張成果圖大家來直觀感受一下Deep Photo Style Transfer的效果⬇️。
在這裏插入圖片描述
此外,按照老規矩來感受一下大神作者們⬇️的超高能力!
在這裏插入圖片描述
我們就來fellow一下一作吧,Fujun Luan【個人主頁】,中國清華大學畢業,在康奈爾大學留學,是Graphics and Vision Group組的PhD,2017年在Adobe Research做實習生,2020年收到了Facebook Reality Labs的實習生offer,大神的實力果真令人瑟瑟發抖。

Paper:Deep Photo Style Transfer
Code:【Torch implementation】(這是原作者公佈的代碼,up to 9.5k stars)),【TensorFLow implementation】


Abstract 摘要

本文介紹了一種用於攝影風格轉換的深度學習方法,該方法可處理多種圖像內容,同時忠實地傳遞參考風格。 我們的方法基於最近的繪畫轉移工作,該工作通過考慮神經網絡的不同層來將樣式與圖像內容分開。 但是,按原樣,此方法不適用於逼真的樣式轉換。 即使輸入圖像和參考圖像都是照片,輸出仍會呈現出畫作的失真。 我們的貢獻是限制從輸入到輸出的轉換在色彩空間中是局部仿射的,並將此約束表示爲自定義的完全可微分的能量項。 我們證明了這種方法可以在多種情況下成功地抑制失真併產生令人滿意的逼真的樣式轉移,包括一天中時間,天氣,季節和藝術編輯的轉移。(附上原文)

This paper introduces a deep-learning approach to photographic style transfer that handles a large variety of image content while faithfully transferring the reference style. Our approach builds upon the recent work on painterly transfer that separates style from the content of an image by considering different layers of a neural network. However, as is, this approach is not suitable for photorealistic style transfer. Even when both the input and reference images are photographs, the output still exhibits distortions reminiscent of a painting. Our contribution is to constrain the transformation from the input to the output to be locally affine in colorspace, and to express this constraint as a custom fully differentiable energy term. We show that this approach successfully suppresses distortion and yields satisfying photorealistic style transfers in a broad variety of scenarios, including transfer of the time of day, weather, season, and artistic edits.


Method 方法

Introduction的部分就不詳細介紹了,主要是作者做了一下NST的review和本篇論文想解決的問題是什麼,作者在Introduction中提到了對於相片的風格轉化主要面臨着兩個問題

  • 結構保留。一方面,我們想要獲得非常強烈的局部效果,比如,打開摩天大樓上的某個窗戶的燈光,如圖1所示。另外一方面,這些效果不應該扭曲邊緣和規則的圖案,例如,窗口仍然保持網格對齊。形式上,我們尋找一種可以強烈改變圖像顏色,卻沒有任何幾何變化的效果,比如沒有移動或扭曲。
  • 語義精度和遷移保真度。現實世界場景的複雜性提出了另一個挑戰:轉移應尊重場景的語義。例如,在城市景觀中,建築物的外觀應該與建築物相匹配,天空和天空相匹配;不能讓天空看起來像建築物。一個合理的方法是用風格圖像中最相似的區域匹配每個輸入神經區域,以儘量減少不準確轉移的可能性。

根據這兩個問題,我們來看一下提出的方法。同大多數的NST算法一樣,模型的輸入需要一張風格圖像和一張內容圖像,想得到的是一張具有風格化的內容圖像。我們的方法通過引入兩個核心思想(與問題是一一對應的) 來增強神經風格算法。

  • 我們在優化過程中在目標函數中提出了寫實正則化項,以約束重構圖像由輸入的局部仿射顏色變換表示,以防止失真。
  • 我們基於輸入的語義分割爲樣式轉換過程引入了可選指南,以避免出現內容不匹配問題,從而大大提高了結果的真實感。

Background:Neural Style Algorithm by Gatys et al.

下圖是Neural Style在優化過程中的損失函數,LtotalL_{total}是總損失,LcL_{c}是內容損失Content Loss,LsL_{s}是風格損失Style Loss;FlF_{l}是某一層卷積的特徵矩陣Feature Matrix,GlG_{l}是根據特徵矩陣計算的Gram Matrix。這樣在優化的過程中,基於αl\alpha_{l}βl\beta_{l}可以得到內容圖像和風格圖像的tradeoff。
在這裏插入圖片描述

Core idea:Photorealism Regularization

【解決結構保留問題】 這個策略不是直接在輸出圖像上添加約束來表示,而是在作用到輸入圖像的變換上。我們的策略是在風格轉移的過程中,通過添加一個與圖像扭曲相關的懲罰項,確保不會丟失其屬性。我們的方案是尋找一個色彩空間的圖像局部仿射變換。對於每一個輸出區塊,存在一個仿射函數將輸入圖像的RGB值映射到對應的輸出對應的位置上去。每個區域的仿射函數都不同,隨空間變化。具體可以參考論文:A closed-form solution to natural image matting。
在這裏插入圖片描述

Core idea:Augmented style loss with semantic segmentation

【解決語義精度和遷移保真度問題】 我們知道Gatys提出的Neural Style Transfer的成功之處在於利用Gram Matrix來平衡風格和內容圖像之間的差異,但是這樣基於整張圖像的計算存在一定的缺陷,沒有辦法約束各層Feature Map的生成,從而造成語義的變化和溢出。我們利用Neural Doodle和生成分割mask的Semantic Segmentation方法中的思想來解決這一問題。在代碼中提供了至多九種顏色的分割mask(某一顏色的mask圖像雖然爲3通道,但是處理爲單通道圖像)可供選擇。Augmented style loss增加的風格損失如下,其中,C表示的是分割mask的通道總數(就是用了幾種顏色的mask)。
在這裏插入圖片描述

Final Total Loss and Our Approach

基於上述的Background和Core ideas,提出了Deep photo style transfer的方法,總體的損失如下,LtotalL_{total}是總損失,LclL_{c}^l是內容損失Content Loss,Ls+lL_{s+}^l是增加的風格損失Augmented Style Loss,LmL_{m}是圖像真實感正則化損失Photorealism regularization,其中,ll指的是某一層卷積層,對於內容損失選取conv4_2作爲內容特徵表示,對於風格損失選取conv1_1,conv2_1,conv3_1,conv4_1,conv5_1這些層作爲風格特徵表示。
在這裏插入圖片描述


Results and Comparison 結果和對比

在這裏插入圖片描述
在這裏插入圖片描述
因爲圖像文件大小的限制,只截取了一部分的結果作爲案例來感受一下Deep photo style transfer的效果,整體來說還是很不錯的,性能超過Neural Style、CNNMRF等算法,並且沒有語義上的扭曲,能夠大體保證語義的完整性。
在這裏插入圖片描述
論文中也給出不同的區域標註不同的seg mask做不同風格遷移的結果,如上圖,效果還是很不錯的。


Code tf版本的代碼

因爲我不太用torch,所以就和大家分享一下Tensorflow版本的代碼吧【TensorFLow implementation】
需要安裝的包和下載的vgg預訓練模型在Set中有列出,訓練的基本的用法:

python deep_photostyle.py --content_image_path <path_to_content_image> 
						  --style_image_path <path_to_style_image> 
						  --content_seg_path <path_to_content_segmentation> 
						  --style_seg_path <path_to_style_segmentation> 
						  --style_option 2

主文件是deep_photostyle.py,提供了三種style_option的模式,option 0是生成分割
的中間結果,option 1是利用分割的中間結果來生成最終的結果,option 2是…一步到位,一般來說選擇option 2就可以了。
在這裏插入圖片描述
一些比較重要的函數的定義在photo_style.py文件中,例如content loss,style loss,gram matrix等等。
Content loss就是計算:權重*一個像素平方差的均值:

tf.reduce_mean(tf.squared_difference(const_layer, var_layer)) * weight

Style loss計算步驟:計算風格層的Gram Matrix的平方差的均值,並且乘上mask的均值,形成diff_style_sum;將不同層的diff_style_sum求和形成layer_style_loss,再乘以權重得到Style loss。

diff_style_sum = tf.reduce_mean(tf.squared_difference(gram_matrix_const, gram_matrix_var)) * content_mask_mean
layer_style_loss += diff_style_sum

其中,Gram Matrix的計算如下,activations可以理解爲從卷積某一層抽取的Feature Map,是一個4維的數組(batchsize, height, width, channels),其中batchsize=1,所以最後得到的gram matrix是一個2維的數組。

def gram_matrix(activations):
    height = tf.shape(activations)[1]
    width = tf.shape(activations)[2]
    num_channels = tf.shape(activations)[3]
    gram_matrix = tf.transpose(activations, [0, 3, 1, 2])
    gram_matrix = tf.reshape(gram_matrix, [num_channels, width * height])
    gram_matrix = tf.matmul(gram_matrix, gram_matrix, transpose_b=True)
    return gram_matrix

Deep Photo Style Transfer就分享到這裏啦,有理解不到位的地方請夥伴們多多指正,感恩大家一路的支持~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章