實現代碼:https://github.com/yjc567/StyleBank
本文是對文章 StyleBank: An Explicit Representation for Neural Image Style Transfer 的整理,以及自己重現其實驗的結果和查閱相關資料的記錄。
大綱
本文的大體內容分爲以下幾點:
- StyleBank的網絡結構
- StyleBank的訓練策略
- StyleBank的特性與優點
- StyleBank的參數調整對實驗結果的影響
- 訓練結果分析
- Instance normalization簡介
- Total Variation(TV)loss簡介
- 將VGG net用於特徵抽取,以及Gram Matrix 簡介
- 對FRIQA和SSIM兩個圖像質量評價方法的介紹
- 反思
- 參考文獻
因爲時間有限,加上自己的實驗還沒有完全結束。所以本文着重於講述[1, 2, 6, 7, 8]這幾個偏向理論的部分,其餘部分留在下一次的實驗報告中提交
StyleBank的網絡結構
網絡結構
- 圖片編碼器(image encoder)
E 。 - StyleBank層(StyleBank layer)
K ,其中包括n 個並行的過濾器(filter,在本文中,使用cnn作爲filter){Ki},(i=1,2,…,n) ,對應n個不同的風格。 - 圖片解碼器(image decoder)
D 。
![StyleBank網絡結構.png](C:\Users\yjc56\iCloudDrive\study\Machine Learing\Project1_StyleBank\elements\StyleBank網絡結構.png)
訓練分枝
- 自動編碼器(auto-encoder)分枝
E→D - 風格化(stylizing)分枝
E→K→D
訓練的目標是使圖像的內容(content)經過
輸入與輸出
輸入一個圖像(content image)
在
在
Encoder and Decoder
- stride:
1 ,9∗9 kernel - stride:
2 ,3∗3 kernel - stirde:
2 ,3∗3 kernel
- stride:
12 ,3∗3 kernel - stride:
12 ,3∗3 kernel - stirde:
1 ,9∗9 kernel
其中除了最後一層以外,每一層後面都加上了Instance normalization和ReLU,關於Instance normalization的簡介可以查閱文章後半部分。
StyleBank Layer
由
訓練策略
loss function
其中正則化loss
其中
訓練策略
敲一遍太麻煩了,所以直接上截圖好了 QAQ
其中
StyleBank 的特性與應用場景
特性
分離圖像的內容和風格
論文指出
E→D 分枝就是一個圖像壓縮與重構結構,並且K 是完全獨立於E 與D 的,這也是後面增量學習特性的基礎。同時每個
Ki 公用同一對E 與D ,極大地節省了內存空間。此模型對內容和風格的分離可以見我的實驗結果(下圖),左圖爲原圖(content image),中間是風格畫像,右邊是生成的圖像,雖然生成的圖像是一個畫師以原圖爲基礎的作畫,但是顯然生成圖像只從中間的圖片學來了畫家的風格,其內容更接近原圖。
傳統方法與神經網絡的結合
詳見論文,這一部分主要介紹了神經網絡的風格轉換方法和一些傳統方法的相似性
支持增量學習
對一個已經訓練完成的StyleBank,可以保持其
E 與D 不變,以增加一個新的Ki 的方法來增加一個新的風格,固定E→D 完成對新風格的學習,並且以這種方式得到的網絡性能和原先一致。
應用場景
StyleBank可以以兩種方式實現風格的融合。
線性融合風格
特定區域的風格融合
參數調整對實驗結果的影響
因爲實驗還沒有全部完成,目前還很難下定論,下次再更新這一段。
訓練結果分析
同上。
Instance normalization
在 Texture Networks: Feed-forward Synthesis of Textures and Stylized Images 一文指出,針對每一個輸入的圖像進行normalization,而不是針對輸入的一批圖像進行歸一化,會得到更好的風格化結果,儘管這篇文章並沒有探尋這個現象的原因(不知道爲什麼,自己不能在arxiv上查看原始版本的論文,所以只能看網絡上的中文翻譯版本)。
Total Variation(TV)loss
本章節兩張圖片顯示不出來了QAQ
自己查看圖片的原網址把,反正也是從別人那裏摘抄來的 = =
全變分去噪,或者說全變分loss,是一個經常被用在圖像去噪上的方法,這個方法認爲圖片的噪聲點與其周圍的像素點有着很高的方差,其計算公式非常簡單:
TVLoss反應的是圖像的噪聲,因此利用這個loss函數生成的圖像可以保持光滑。
看一下加了TV正則項以後的圖像復原結果和不加的差異:
圖(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
給定一個實矩陣
而對一個三維的矩陣
根據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