StyleBank 學習小記:一個可以分離風格與內容的圖像風格轉換器

實現代碼:https://github.com/yjc567/StyleBank

本文是對文章 StyleBank: An Explicit Representation for Neural Image Style Transfer 的整理,以及自己重現其實驗的結果和查閱相關資料的記錄。

大綱

本文的大體內容分爲以下幾點:

  1. StyleBank的網絡結構
  2. StyleBank的訓練策略
  3. StyleBank的特性與優點
  4. StyleBank的參數調整對實驗結果的影響
  5. 訓練結果分析
  6. Instance normalization簡介
  7. Total Variation(TV)loss簡介
  8. 將VGG net用於特徵抽取,以及Gram Matrix 簡介
  9. 對FRIQA和SSIM兩個圖像質量評價方法的介紹
  10. 反思
  11. 參考文獻

因爲時間有限,加上自己的實驗還沒有完全結束。所以本文着重於講述[1, 2, 6, 7, 8]這幾個偏向理論的部分,其餘部分留在下一次的實驗報告中提交

StyleBank的網絡結構

網絡結構

  1. 圖片編碼器(image encoder)E
  2. StyleBank層(StyleBank layer)K ,其中包括n 個並行的過濾器(filter,在本文中,使用cnn作爲filter){Ki},(i=1,2,,n) ,對應n個不同的風格。
  3. 圖片解碼器(image decoder)D

![StyleBank網絡結構.png](C:\Users\yjc56\iCloudDrive\study\Machine Learing\Project1_StyleBank\elements\StyleBank網絡結構.png)

訓練分枝

  1. 自動編碼器(auto-encoder)分枝 ED
  2. 風格化(stylizing)分枝 EKD

訓練的目標是使圖像的內容(content)經過ED 後儘可能的不會損失。同時圖像的風格信息會被StyleBank加入,以在保持內容的同時將圖像用不同風格表現出來。也就是希望網絡可以儘可能地將圖像的內容和風格分離開。

輸入與輸出

輸入一個圖像(content image)I ,編碼器E 會從這個圖像抽取出多層特徵(multi-layer feature maps)F ,即:F=E(I)

ED 分枝中,直接將F 傳給解碼器D ,得到輸出圖像O ,即O=D(F) ,輸出圖像O 應該和輸入圖像I 儘可能的接近,這也是我們訓練的目標

EKD 分枝中,F 還需要通過K 中的某一層Ki ,得到Fi~ ,接着再通過解碼器D ,生成對應風格i 的輸出圖像Oi ,即:Oi=D(Fi~),(i=1,2,,n)

Encoder and Decoder

E 由3層卷積層組成,其步長和卷積大小分別是:

  1. stride: 1 , 99 kernel
  2. stride: 2 , 33 kernel
  3. stirde: 2 , 33 kernel

D 的結構與E 相反,其3層卷積層的構造是:

  1. stride: 12 , 33 kernel
  2. stride: 12 , 33 kernel
  3. stirde: 1 , 99 kernel

其中除了最後一層以外,每一層後面都加上了Instance normalization和ReLU,關於Instance normalization的簡介可以查閱文章後半部分。

StyleBank Layer

n 個卷積層組成,代表n 個不同的風格。

訓練策略

loss function

ED 分枝只需要計算生成圖像和原圖在識別度上的loss(identity loss LI ):

LI(I,O)=||OI||2

EKD 分枝就需要結合生成圖像內容上的loss(Lc ),風格上的loss(Ls ),和一個正則化loss(Ltv(Oi) )):
LK(I,Si,Oi)=αLc(Oi,I)+βLs(Oi,Si)+γLtv(Oi)

其中正則化lossLtv(Oi) 是全變差正則化(total variation (tv) regularization)關於其介紹,請參閱後面的章節。

LcLs 則是分別利用VGG-16網絡進行特徵抽取和格萊姆矩陣(Gram matrix)計算得到的。這兩者的介紹放在文章後面中。

Lc(Oi,I)=l{lc}||Fl(Oi)Fl(I)||2

Ls(Oi,S)=l{ls}||G(Fl(Oi))G(Fl(Si))||2

其中{lc} 只用到了VGG-16中的relu4_2

{ls} 用到了VGG-16中的relu1_2,relu2_2,relu3_2,relu4_2

訓練策略

StyleBank訓練策略.png

敲一遍太麻煩了,所以直接上截圖好了 QAQ

其中T=2 ,m=4 (branch大小爲4),λ=1

StyleBank 的特性與應用場景

特性

  1. 分離圖像的內容和風格

    論文指出ED 分枝就是一個圖像壓縮與重構結構,並且K 是完全獨立於ED 的,這也是後面增量學習特性的基礎。

    同時每個Ki 公用同一對ED ,極大地節省了內存空間。

    此模型對內容和風格的分離可以見我的實驗結果(下圖),左圖爲原圖(content image),中間是風格畫像,右邊是生成的圖像,雖然生成的圖像是一個畫師以原圖爲基礎的作畫,但是顯然生成圖像只從中間的圖片學來了畫家的風格,其內容更接近原圖。

    6_th_result.png

  2. 傳統方法與神經網絡的結合

    詳見論文,這一部分主要介紹了神經網絡的風格轉換方法和一些傳統方法的相似性

  3. 支持增量學習

    對一個已經訓練完成的StyleBank,可以保持其ED 不變,以增加一個新的Ki 的方法來增加一個新的風格,固定ED 完成對新風格的學習,並且以這種方式得到的網絡性能和原先一致。

    incremental_training與fresh_training的區別.png

應用場景

StyleBank可以以兩種方式實現風格的融合。

  1. 線性融合風格

    formula_of_Linear_Fusion.png

    兩個Style的線性融合.png

  2. 特定區域的風格融合

    formula_of_Region_specific_fusion.png

    Picasso_Van_Gophm.png

參數調整對實驗結果的影響

因爲實驗還沒有全部完成,目前還很難下定論,下次再更新這一段。

訓練結果分析

同上。

Instance normalization

在 Texture Networks: Feed-forward Synthesis of Textures and Stylized Images 一文指出,針對每一個輸入的圖像進行normalization,而不是針對輸入的一批圖像進行歸一化,會得到更好的風格化結果,儘管這篇文章並沒有探尋這個現象的原因(不知道爲什麼,自己不能在arxiv上查看原始版本的論文,所以只能看網絡上的中文翻譯版本)。

Texture Networks: Feed-forward Synthesis of Textures and Stylized Images

Total Variation(TV)loss

本章節兩張圖片顯示不出來了QAQ
自己查看圖片的原網址把,反正也是從別人那裏摘抄來的 = =

全變分去噪,或者說全變分loss,是一個經常被用在圖像去噪上的方法,這個方法認爲圖片的噪聲點與其周圍的像素點有着很高的方差,其計算公式非常簡單:

TVLoss formula

TVLoss反應的是圖像的噪聲,因此利用這個loss函數生成的圖像可以保持光滑。

看一下加了TV正則項以後的圖像復原結果和不加的差異:

TVLoss picture

圖(a)是原始圖像,圖(b)在原圖像上加了一定程度的模糊和噪聲,圖(c)是不加TV項的復原結果,可以看到有一圈一圈的僞影,這是我們不想要的。圖(d)是加了TV項以後的復原結果,沒有僞影,復原結果基本和原圖像相同。

其代碼實現也非常簡單:

def TVLoss(output_image):
    return torch.sum(torch.abs(output_image[:, :, :, :-1] - output_image[:, :, :, 1:])) + torch.sum(torch.abs(output_image[:, :, :-1, :] - output_image[:, :, 1:, :]))

VGG net and Gram Matrix

VGG net

爲什麼VGG net的某些層可以用來抽取特徵呢?可能是自己瀏覽的不是很仔細,竟然無法在網上找到具體的解釋或原因,猜測可能很多網絡都可以用來抽取特徵,只是VGG深度適當,所以其運算速度和結果精確度之間有比較好的平衡?那爲什麼又是用VGG特定的那幾層呢?

Gram Matrix

給定一個實矩陣 A ,矩陣 ATAA 的列向量的格拉姆矩陣,而矩陣 AATA 的行向量的格拉姆矩陣。

而對一個三維的矩陣A ,設A 的大小是(ch,h,w) 可以把A 展開爲(ch,hw) 的二維矩陣,然後求其gram矩陣就好了。

根據Gram矩陣和協方差矩陣的定義可以看出Gram就是一個偏心協方差矩陣(即沒有減去均值的協方差矩陣),因此Gram矩陣相比協方差矩陣,其對角線還可以體現每個特徵在圖像中出現的量。

其實到底爲什麼Gram矩陣可以用來計算features之間的loss,還是需要更高深的數學知識纔可以解釋,希望自己以後有機會可以掌握其真正原理。

FRIQA and SSIM

因爲還沒有把這兩個東西具體應用到我的實驗裏,所以打算之後再完成這個章節。

反思

感覺自己相關的知識掌握的還不夠,閱讀論文的方法也有問題,很多東西都是自己問了QZQ之後才明白的。而且對pytorch相關的代碼知識也不是很掌握,也是第一次接手這種項目的開發,希望在這段時間裏自己可以學到一些有意思也實用的知識。

參考

StyleBank: An Explicit Representation for Neural Image Style Transfer
Instance Normalization: The Missing Ingredient for Fast Stylization
Algorithm With Total Variation Regularization for 3D Confocal Microscope Deconvolution
very deep convolutional networks for large-scale image recognition

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