【遷移】用神經風格遷移生產美圖,你也是梵高

【遷移】用神經風格遷移生產美圖,你也是梵高

神經風格遷移大法好,人人都能變梵高,但實際上這可是個技術活。雖然神經風格遷移NST從概念上很容易理解,但想生成高質量的圖片卻實屬不易。為了獲得良好結果,必須正確實施其中許多複雜的細節和隱藏的技巧。

本文就將深入研究神經風格遷移原理,並詳細討論這些技巧。

關於NST的介紹這裡就不再贅述了,你可以通過官方PyTorch教程瞭解NST。不過如同其它介紹性文章一樣,它們的執行結果都較為普通(如下圖)。筆者將展示能提高遷移質量的編碼教程,但是先說一些題外話。


【遷移】用神經風格遷移生產美圖,你也是梵高

(上圖是兩種不同方法實現的神經風格遷移質量比較。左上圖是要匹配其內容的圖像。左下圖是要匹配其風格的圖像。中間圖是由PyTorch教程實現的遷移結果,右圖是由本文所述步驟實現的遷移結果。很明顯,右圖視覺質量更高,且更忠實於左上方圖像的風格。)

問:為什麼Gram矩陣能度量風格?

Gatys等人的文章(介紹神經風格遷移)大都簡單易懂。然而他們卻沒有回答這個問題:為什麼選用Gram矩陣來表示風格(即紋理)?

在較高層上,Gram矩陣能測量同一層中不同特徵圖之間的相關性。特徵圖即卷積層激活後的輸出。例如,如果一個卷積層有64個濾波器,將生成64個特徵圖。Gram矩陣能測量層中不同特徵圖之間的相關性(相似性),而無需關心像素的確切位置。

為了闡明Gram矩陣為什麼能度量紋理,假設有兩個濾波器,一個用於檢測藍色事物,一個用於檢測螺旋。將這兩個濾波器應用於輸入圖片以產生兩個濾波圖,並測量其相關性。如果兩個濾波圖高度相關,那麼基本可以確定圖片中所有螺旋都是藍色的。這意味著圖片紋理是由藍色螺旋組成,而非紅色、綠色或是黃色螺旋。


【遷移】用神經風格遷移生產美圖,你也是梵高

儘管這項解釋仍令筆者有些不解,但Gram矩陣能度量風格似乎是紋理合成社區公認的事實。此外,不能否認由Gram得到的結果確實令人印象深刻的。

修復PyTorch執行

提高遷移質量的第一步是修復PyTorch教程執行。該教程內容試圖忠於Gatys等人的文章,卻遺漏了一些細節。一方面,文章作者將 MaxPool2d替換為AvgPool2d,因為他們發現AvgPool2d能生成更高質量的結果。

另一細節是,該教程計算的是卷積輸出而非ReLu激活函數的ContentLoss(內容損失)和StyleLoss(風格損失)。這有點吹毛求疵,因為筆者在實驗中並沒有觀察出使用卷積和ReLu之間有什麼大區別。


【遷移】用神經風格遷移生產美圖,你也是梵高


VGG19網絡及其各層

該教程與文章之間最大的差別是它對於ContentLoss 和StyleLoss分別使用了“錯誤”的層。筆者之所以在錯誤一詞上打了引號,是因為層的選擇是比較主觀的一件事,很大程度上取決於最令人喜歡的風格。

也就是說,可以使用一些經驗法則來指導決策的制定。在度量內容相似性時,若content_img與input_img之間存在完美的像素匹配,較低層往往激活程度最高。越深入網絡,層越不關心匹配是否精確,相反,當特徵處於正確位置時,層會被高度激活。

為了將每層的內容都進行可視化展示,可以設置style_weight=0,並使用不同的層作為content_layer,基於隨機的input_img運行訓練過程。


【遷移】用神經風格遷移生產美圖,你也是梵高


VGG19網絡各層的響應內容可視化。圖片越往右,層在網絡中的位置越深。

教程使用第4層卷積作為內容層。如上圖所示,對於內容來說該層數可能太低了,因為處於這個深度的網絡仍在關心像素匹配是否精確。Gatys等人使用conv4_2替代conv2_2,因為conv4_2更關心整體特徵分佈而非單個像素。

對於風格來說,低層捕捉較小的重複特徵,較高層捕捉更抽象的整體特徵。因此,為了對style_img的整體風格進行遷移(從低層細節到整體圖案),應該包含網絡中所有深度的層。

該教程使用前5個卷積層,但它們在網絡中的位置太低,不大能捕捉到整體特徵。Gaty等人使用 conv1_1、 conv2_1、conv3_1、conv4_1和conv5_1,在整個網絡體系中形成了良好的層分佈。可以使用與內容層相同的方法,對每個層選擇要優化的樣式進行可視化。

為了實現這一點,設置content_weight=0,指定想要使用的style_layers,然後基於隨機的input_img運行訓練過程。


【遷移】用神經風格遷移生產美圖,你也是梵高


PyTorch教程選擇的層生成的風格(左);Gatys等人的文章選擇的層生成的風格(右)

意料之中,教程選擇的層優化的風格捕捉低層次的重複性特徵,但不能捕捉高層次的整體性特徵。

提高遷移質量

截至目前,我們實現的修復質量應該已經相當接近Gatys等人的文章中所看到的質量。現在將進一步深入,採取以下措施以生成更好的圖像。

筆者對文章所做的第一個修改就是將優化程序從L-BFGS轉換為Adam。文章表述L-BFGS能生成更高質量的遷移。

但筆者在實驗中並未發現這兩者的使用效果有什麼差異,此外Adam的穩定性似乎更好,尤其在訓練大量步驟時或者有著龐大的style_weight時。在這些情況下,L-BFGS可能會報錯,這大概是因為梯度爆炸(筆者並未深入研究)。


【遷移】用神經風格遷移生產美圖,你也是梵高

另一個輕微調整是將mse_loss (即L2loss)轉換為l1_loss。筆者想不出L2_loss對於風格遷移有什麼好處(除了在0處具有可微性),因為平方值將會對異常值做出嚴重干擾。

正如前一節所述,我們並不關心像素匹配是否精確,並且可以容忍生成圖像中出現一些異常值。實際上,當風格特徵和內容特徵混合在一起時,異常值可能會使得視覺效果更佳。最後,《特徵可視化》(Feature Visualization,接觸相關話題必須閱讀的一篇文章)的作者也許是出自類似原因,在其任務中使用l1_loss。

實際上,許多用於生成高質量特徵可視化(FV)的技巧都優雅地過渡到了神經風格遷移上。

FV和NST在概念上十分相似,只在生成input_img的方式上有所不同。在NST中,input_img經過優化後,可與content_img 和style_img以相同的方式激活網絡中不同層。而FV則不使用content_img 或style_img,而是生成input_img,最大程度地刺激不同層的神經元。


【遷移】用神經風格遷移生產美圖,你也是梵高


積極的數據增強使生成圖片的右上角產生旋轉偽影

筆者從FV中借用了一個小技巧,即在input_img上使用數據增強。這與常規分類任務的工作原理完全相同:每一步都要對input_img進行增強(如旋轉、裁剪、縮放等),然後運行模型並計算損失。

通過每一步的增強,我們迫使input_img生成抗微小擾動的魯棒性特徵。這些特徵應該包含較少的高頻偽影,並更具有視覺吸引力。然而,我發現《特徵可視化》文章所使用的增強過大,必須適當縮小。即使如此,生成圖片(上圖)邊緣仍然有一些旋轉偽影。消除這些偽影的最簡單方法就是將邊緣的一些像素剪切掉。

筆者做出的最後一個修改是將content_layer轉換為conv3_2,而非Gatys等人使用的conv4_2。筆者讀過的大多數文章也推薦使用conv4_2,但是筆者發現使用conv4_2會忽略掉一些細節,且生成圖片的風格會覆蓋內容。

另一方面,conv3_2可以保留這些細節,而無需對像素完美性進行過度懲罰。

進一步質量提升

現在已經討論了筆者的神經風格遷移代碼中所實施的全部技巧。在原有的PyTorch教程基礎上,已經極大提高了遷移質量。此外,content_weight和 style_weight對於特定的圖像選擇具有更高的魯棒性。

例如,筆者發現如果沒有對PyTorch教程進行適當的調整,一組圖像的 style_weight很難輕鬆遷移到另一組圖像上。

也就是說,去除生成圖片中的高頻噪音可能會得到更好的結果。文章《可微的圖像參數化》(DifferentiableImage Parameterization,接觸相關話題必須閱讀的另一篇文章)提出了很有趣的方法。


【遷移】用神經風格遷移生產美圖,你也是梵高

該文中,作者先在(去噪)傅里葉空間而非(噪聲)像素空間中對input_img 參數化。因為input_img 由梯度下降法生成,對輸入去相關化相當於一個預調節器,可通過梯度下降法更快找到最小值,從而使優化更易(與在監督學習任務中去除相關特徵類似)。除了類似的簡短解釋如在去相關空間中發現的最小值更寬泛、更健壯外,我並不清楚為什麼這能提高遷移質量。

更簡單的方法是通過直接或間接懲罰來抑制高頻噪聲。直接懲罰可通過將input_img的全變差損失添加到優化對象中來實現。相反,通過在每次梯度下降步驟後對input_img進行模糊,或者在將噪音應用於input_img之前對梯度進行模糊,可實現間接懲罰。

這兩種方法存在的問題是,它們還會對真正的高頻特性造成不利影響。可通過在訓練時縮減總變化損失或模糊量來進行一定程度上的改善。


【遷移】用神經風格遷移生產美圖,你也是梵高

筆者的初始目標是使用機器學習生成媒介形象圖片。但在反覆實驗中,無意發現了一些很驚人的事。對筆者來說,整個過程中最有趣的部分是神經網絡的端到端可微性。我們很容易地就能“顛倒”一個原本用於區分貓狗的模型,並用其生成無數種不同風格的圖像,你還可以嘗試用隨機森林模型進行操作。

用神經風格遷移生成好看的圖片了,這個過程聽起來簡單,但想要得到高質量的結果,確實是個技術活,可見即使有機器學習輔助,成為梵高依然不是件容易的事。


分享到:


相關文章: