這是對一個Neural Style Transfer project的總結,GitHub連結是:戳我
神經風格遷移是将一幅圖檔的内容和另一幅藝術圖檔的風格結合,生成一張藝術化的圖檔的過程。輸入是一張内容圖和一張風格圖,輸出是風格化的結果。
神經風格遷移的兩大關鍵分别是風格表征和圖像重建。
風格表征,顧名思義,就是用什麼方法來提取風格、表示風格,如何建立模型(也叫紋理模組化)。根據Yongcheng Jing et al. [1]總結,大體分兩類:基于統計的參數化紋理模組化和基于MRF(Markov Random Fields)的非參數化紋理模組化。
圖像重建則是用特定的特征來重建出一張圖像,也可以主要依據重建速度分為兩大類:基于線上圖像優化的慢速圖像重建方法和基于離線模型優化的快速圖像重建方法。
根據風格表征和圖像重建的方法不同,風格遷移大體可分為四類,具體我不對每一類進行介紹了,大家有興趣可以移步這篇論文[1],或者閱讀這篇文章的中文精簡版。
我們這個project實作的方法屬于Gatys et al.也就是風格遷移鼻祖的基于統計的參數化紋理模組化以及線上圖像優化的慢速方法,在這個基礎上又增添了多種風格遷移、保留顔色遷移、以及引入拉普拉斯算子來提升風格化圖像品質等方法。
這個算法的核心思想是建立在此之上的:先将圖像經過預訓練的VGG網絡,提取feature map。對于輸入的内容圖檔提取的特征
和對于輸出的結果圖檔提取的特征
來說,我們用上标
表示第
層,用下标
表示位置,下标
表示第
個filter的activation,則可以用
和
的距離來衡量他們的相似程度(内容相似),這樣得到内容損失
。
而對于風格的表示我們也是先用VGG提取特征
,然後在這上面計算Gram矩陣,這個其實就是feature的二階統計量,得到的結果可以看作紋理的表示。對于第
層的feature
來說,我們用
來表示第
層
位置上第
個filter的activation,而其Gram矩陣可以這樣計算:
然後對于輸入的風格圖檔和輸出的結果圖檔,我們分别求他們的Gram矩陣,用他們的距離來衡量風格上的相似,這樣得到風格損失
。
我們把總損失定義為内容損失與風格損失,在實際應用中在加入變分TV項對結果平滑,就可以依據此損失來不斷更新生成的輸出圖檔,以讓總損失減小,即圖檔和内容圖檔和風格圖檔更接近,最終即可重建風格化圖像。
我們的project還加入了幾個功能。
一、多重風格遷移
這個很簡單,如果有多重風格圖檔的話,我們把風格損失定義為每個風格的權重即可:
其中
是輸出的風格化結果,
是第
張輸入的風格圖檔。
二、保留顔色風格遷移
保留風格遷移是指,輸出的風格化圖檔保留了内容圖檔的内容和顔色,但依然有風格圖檔的風格。實作方法也分Color Histogram Matching和Luminance-only Transfer兩種,我們采用第二種,因為它能更好的保留内容圖檔的顔色。
我們首先把圖檔從RGB通道轉化成YUV通道,其中Y通道代表luminance而U和V通道代表顔色資訊。是以我們可以對風格圖檔的Y通道上求風格損失,對内容圖檔的U和V通道上求内容損失,這樣得到的輸出結果就保留了内容圖檔的顔色。
三、引入拉普拉斯算子的風格遷移
我們在計算内容損失的時候,用的是CNN網絡提取的特征,然而其實這些特征是屬于high-level representation,主要是捕捉了内容圖檔的語音資訊,這樣便不可避免的損失了一些low-level的細節資訊,比如紋理、基本結構。是以得到的結果圖檔會有一些irregular的扭曲和形變。為了減少這些artifact并且更好的保留内容圖檔的細節,可以引入拉普拉斯損失項來解決這個問題。
拉普拉斯損失是這樣計算的:對于輸入的内容圖檔
和結果圖檔
,我們把他們對應的拉普拉斯filter response
和
求距離,用這個距離當作拉普拉斯損失,并把這一項加入到總損失裡。注意到我們的拉普拉斯損失是在圖檔本身的像素空間得到的,這樣就可以捕捉到圖檔的low-level information。由于拉普拉斯算子對噪聲極其敏感,是以我們在對圖檔加上拉普拉斯filter之前先通過一層
的pooling layer,這樣既起到了平滑的作用,又節省了空間。
的大小不同的pooling layer,能夠capture不同規模的結構資訊,是以也可以将
個不同大小的pooling layer作用在圖檔上,得到
個拉普拉斯損失,然後權重在一起,就可以保留内容圖檔不同scale的細節資訊。
參考:https://mp.weixin.qq.com/s/iV-OXiKF1jgAhSmX4QUIXw
https://zhuanlan.zhihu.com/c_185430820
https://arxiv.org/abs/1705.04058v4