圖像風格遷移:超越fast style transfer

圖像風格遷移:超越fast style transfer

1. 以前風格轉換速度之尷尬

如果從得到效果圖速度來分的話,可以分為三個階段。

階段一

最初的用神經網絡實現的風格轉換是需要不斷迭代的,不僅速度慢,而且我要在A圖加上B圖的風格,就需要分別根據這兩幅圖進行不斷前反向傳播,更新輸入,效率實在太低。稱之為style transfer

階段二

後來人們就想能不能直接一個前向傳播搞定啊~,然後他們想出了,先訓練一個G, 這個G可以讓輸入I通過G後得到的G(I)是A圖加上B圖的風格。這個方法還是有很大的問題,那就是我訓練的G必須是同一種風格,一般就用一幅風格圖B,然後用很多的內容圖,不斷優化訓練G, 最終G有啥用啊,只是“B風格的濾鏡”罷了。那我要很多種風格呢?我就要訓練很多很多的G,那挺尷尬的。. 代表論文是是


http://blog.csdn.net/hungryof/article/details/53981959 中提到的 Texture Networks: Feed-forward Synthesis of Textures and Stylized Images 和 Perceptual Losses for Real-Time Style Transfer and Super-Resolution . 這也就是網上經常說的 fast style transfer.

階段三

大家就想,我怎麼直接輸入任意A和B,一次前向出來呢?如果能成功,那麼速度就不需要考慮了,因為已經到達頂峰了。

style-swap 就是第三階段的開始。 0.1秒出結果。

圖像風格遷移:超越fast style transfer

2. Style-swap的魅力

圖像風格遷移:超越fast style transfer

圖像風格遷移:超越fast style transfer

效果還是挺不錯的嘛~~再放幾張。。

圖像風格遷移:超越fast style transfer

圖像風格遷移:超越fast style transfer

用上面素描畫形成的效果:

圖像風格遷移:超越fast style transfer

圖像風格遷移:超越fast style transfer

3. style-swap淺談

論文分為2個部分,第一部分就是常規的迭代方式,第二個是將常規的改成一次前向的方法。

3.1 style-swap的新方法

以前不都是認為Gram操作就是相當於“風格”的一種表示嘛,他們認為,如果我要得到C圖的內容加上S圖的風格,那麼我希望我的網絡輸入I在高維度特徵ϕ(I)(一般用VGG19的某一層的相應的輸出,作為I的高維特徵)與C圖的高維特徵ϕ(C)儘量一樣,同時希望ϕ(I)進行Gram計算後得到的G(ϕ(I))與G(ϕ(S))儘量一樣。為什麼要用Gram矩陣呢?是否有必要?這些都不知道。 後來Chuan Li的 Combining Markov Random Fields and Convolutional Neural Networks for Image Synthesis將Style loss改成了MRFs Loss Function,依舊保留content loss。這篇論文第一部分工作其實就單純用第一種loss了,捨棄了content loss。 這篇論文的詳細講了計算這種Loss的高效方法。這篇論文的主要貢獻還是第二部分工作,引入了Inverse Net,這使得一次前向傳播得到的特徵圖成為可能。

3.2 實現方法

C和S分別代表內容圖和風格圖,ϕ(⋅)代表預訓練網絡(一般VGG19)的前部分網絡。ϕ(C)就是C傳入網絡中在某一層出來的特徵。

  1. 先提取一系列塊ϕi(C)和ϕj(S)。其中i∈nc, j∈ns,其中nc和ns分別是能從ϕi(C)和ϕj(S)抽取的塊數。

  2. 對於每塊ϕi(C),我們希望選擇其最近的style 塊ϕj(S), 稱之為ϕssi(C,S).

圖像風格遷移:超越fast style transfer

  1. 這步稱之為重建Φss(C,S)。這時候我們只需要平均一下那些重疊區域的值就行了。這樣就可以得到Φss(C,S),稱之為Φss(C,S)的重建。

因此總的優化目標是:

圖像風格遷移:超越fast style transfer

3.3 高效方法

這裡可能會寫的比較囉嗦。。因為要講的很明白,確實需要囉嗦點。。為了簡便,提取的塊spatial size就3x3吧, relu3_1層是256個通道。下面的三步統稱為style-swap.

3.3.1 實現方法的第一二步解釋

先看看3.2節實現方法的第一二步幹啥:

圖像風格遷移:超越fast style transfer

對於每一塊ϕi(C),從ns塊ϕj(S)中找到與其最匹配的塊,稱之為ϕssi(C,S)。最終我們可以找到nc塊ϕssi(C,S)。

可以發現是相關操作,也是卷積網絡中說的卷積,對於某一塊ϕi(C) ,其和ns塊分別進行相關,不就是將這ns塊看成ns個卷積核,每個卷積核就是ϕj(S)(大小是256×3×3)。輸入是ϕi(C), 最終輸出是ϕi(C)與ns個卷積核卷積後的輸出,大小為ns×1×1。總共有nc塊ϕi(C),恰恰對應這卷積核在Φ(C)上的位置的所有情況,就是卷積核在Φ(C)上的卷積操作的移動恰恰就能滿足這樣。

3.3.2 高效方法的第一步

結論:用Φ(C)作為輸入,ns 塊 ϕj(S)∥ϕj(S)∥作為卷積核(ns×256×3×3)。得到的輸出就是所有的i=1,⋯,nc的ϕi(C)所對應的

圖像風格遷移:超越fast style transfer

論文的寫法更為簡便:

圖像風格遷移:超越fast style transfer

輸出的大小為:ns×w×h, 顯然w×h等於nc。為了計算速度,省略了∥ϕi(C)∥, 因為這不會影響取哪一個最近style塊。

該步稱之為swap_enc

3.3.3 高效方法的第二步

第一步得到的輸出O到底是什麼?記Oa,b是O中以(a,b)為中心點的ns*1*1大小的輸出張量,那麼Oa,b,j是ϕa,b(C)與ϕj(S)的卷積的值。因此我們對於每個位置(a,b)如果第j個通道的值是ns個值中最大的,將該位置記為1,其他ns−1個通道記為0. 這樣就選出了塊ϕi(C)對應的最匹配的塊ϕj(S)的j值!

圖像風格遷移:超越fast style transfer

沒錯,第二步就是通道最大值記錄為1,其餘為0

實現結束高效方法的第一第二步,我們要的就是K⎯⎯⎯。

該步稱之為Maxcoord

3.3.4 高效方法的第三步

將K⎯⎯⎯作為輸入,將ϕj(S)作為反捲積核。顯然反捲積核與剛才的一樣,也是ns×256×3×3。

對於每個位置(a,b), 只有最匹配的style塊才會輸出,其他的塊都被乘上了0!此時就可以得到ϕssa,b(C,S),比如與ϕ10,10(C)相關程度最大的塊是第200塊,即max{O10,10,j}的值為O10,10,200,得到K⎯⎯⎯10,10,200=1, 同時 K⎯⎯⎯10,10,j=0,j≠200。K⎯⎯⎯10,10,j與ϕ(S)反捲積,此時可以提取出ϕssa,b(C,S),就是ϕ200(S)。直到這裡我們才弄好了所有的ϕssa,b(C,S), 反捲積後這些ϕssa,b(C,S)是重疊的,重疊部分取平均即可。

此時才真正得到Φss(C,S)。

這一步稱之為swap_dec

4. 訓練Inverse網絡

這是第二部分內容,是核心部分。回憶第一部分的優化目標:

圖像風格遷移:超越fast style transfer

我們希望該Inverse網絡f無論對於任何輸入H (這些輸入包括Φ(C)或是Φ(S)或是Φss(C,S) ), 我們都能使得f(H)能得到Istylized(C,S)。 即Φ(f(H))和H儘量一樣。因此有:

圖像風格遷移:超越fast style transfer

值得注意的是,如果我們訓練好Inverse網絡,稱之為decoder, 然後進行前向傳播是,首先是Φ(C)經過style-swap結構後得到Φss(C,S),再輸入到decoder中,即可得到Iˆstylized(C,S)。

至此, 徹底完成一次前向傳播出結果的目標!!!!!

4.1 訓練時代碼的細節

在訓練時,

圖像風格遷移:超越fast style transfer

比如我一下子輸入2個content圖和2個style圖,然後latent_before是(4, 256, 64, 64),經過swap結構,得到latent_after是(8,256,64,64)。注意的是latent_after的前4個仍舊是latent_before, 而後4個是Φss(C,S)。更加準確的說:

latent_before[1]和latent_before[2]是Φ(C1)和Φ(C2),而latent_before[3]和latent_before[4]是Φ(S1)和Φ(S2)。 然後傳入swap中,得到latent_after,latent_after[1:4]與latent-before一致,latent_after[5:8]分別為Φ(C1,S1),Φ(C1,S2),Φ(C2,S1),Φ(C2,S2)。得到的Loss是MSE(latent_after, recons_latent)。具體的含義見下圖

圖像風格遷移:超越fast style transfer

因此我們當然是希望Φ(f(Φ(C)))與Φ(C)儘量接近,Φ(f(Φ(S)))與Φ(S)儘量接近,Φ(f(Φss(C,S))與Φss(C,S)儘量接近,這樣才能實現對於Φ的反轉!

為什麼是用[Φ(C),Φ(S),Φ(C,S)]和[Φ(f(Φ(C))),Φ(f(Φ(S))),Φ(f(Φss(C,S)))]進行求Loss,再反向傳播呢?

為了方便,直接說為什麼是用Φ(C,S)和Φ(f(Φss(C,S)))。其實我們希望優化Dec,那麼最好是希望f(Φ(C,S))與C在高層語義上儘量一樣。高層語義自然要將f(Φ(C,S))與C進行升維,所以把f(Φ(C,S))再次輸入到Φ中,與Φ(C)相比,用MSE就行了。

其實這種思想和fast neural style是類似的,或是可以看成是fast neural style的升級版本。fast neural style使用G網絡生成G(x),使用D網絡提供Loss形式。希望在高層語義特徵上D(G(x))與D(C)儘量接近,同時希望在高層語義上Gram(D(G(x)))與Gram(D(S))儘量接近。那麼style-swap也是如此。Enc就是D,而Dec就是G。不過更加準確的說Dec不僅僅是G,而是G的升級版,因為以前的G只是針對一種style進行訓練,而這裡的Dec是針對大量的style一起訓練。

附錄:

Fast Patch-based Style Transfer of Arbitrary Style


分享到:


相關文章: