做項(xiàng)目時(shí)涉及到圖像風(fēng)格遷移的東西亭珍,于是補(bǔ)了一下,用本篇博客記錄之绑雄,并附上pytorch代碼唧取,以備不時(shí)之需铅鲤。
所謂風(fēng)格遷移,其實(shí)是圖像生成枫弟,即用兩種圖像生成一種結(jié)合二者內(nèi)容和風(fēng)格的新圖像邢享。
如何量化生成圖像的內(nèi)容和風(fēng)格呢:
(1)生成圖像的內(nèi)容,即兩幅圖像像素值越相同越好淡诗;
(2)生成圖像的風(fēng)格骇塘,即兩幅圖像紋理上越相似越好。
1.生成圖像的內(nèi)容
如圖1所示韩容,給定隨機(jī)圖(像素隨機(jī)生成)和內(nèi)容圖款违,以及訓(xùn)練好的CNN(全卷積,不含全連接)群凶,隨機(jī)圖輸入CNN插爹,在第層輸出的特征圖為。內(nèi)容圖輸入CNN请梢,在第層輸出的特征圖為赠尾,要想使隨機(jī)圖通過(guò)梯度下降法更新至和內(nèi)容圖一樣,那么我們只需要定義二者的損失函數(shù)為:
此處的損失函數(shù)為誤差平方損失毅弧,很容易理解气嫁,就是使二者通過(guò)同一個(gè)CNN得到的特征圖的激活值誤差最小。因?yàn)橄嗤膬煞鶊D像够坐,輸入同一CNN杉编,在某一層輸出的特征圖是相同的。二者特征圖的激活值越相近咆霜,那么二者像素點(diǎn)的值也會(huì)越相近邓馒。
在訓(xùn)練過(guò)程中保持CNN的參數(shù)不變,使用梯度下降法更新輸入圖像:
即可實(shí)現(xiàn)隨機(jī)圖像更新至內(nèi)容(像素點(diǎn))和內(nèi)容圖越來(lái)越相近蛾坯。
2.生成圖像的風(fēng)格
比起內(nèi)容光酣,風(fēng)格是一種不容易量化的抽象特征。為了量化圖像的風(fēng)格脉课,我們用紋理結(jié)構(gòu)來(lái)描述不同圖像的風(fēng)格特征救军,而紋理結(jié)構(gòu)可以用CNN提取的不同特征的相關(guān)性(協(xié)方差)來(lái)衡量。
特征圖的不同通道表征著圖像的不同特征倘零,把特征圖的不同通道展開(kāi)寫(xiě)成一行唱遭,則其維度變?yōu)?img class="math-inline" src="https://math.jianshu.com/math?formula=F%20%5Cin%20%5Cmathbb%7BR%7D%5E%7BC%20%5Ctimes%20HW%7D" alt="F \in \mathbb{R}^{C \times HW}" mathimg="1">,其不同特征的相關(guān)性(協(xié)方差)用矩陣表示:
借用兩幅圖來(lái)表述這一過(guò)程:
至此呈驶,我們已經(jīng)知道了量化圖像風(fēng)格的方法拷泽。如圖1所示,給定隨機(jī)圖和風(fēng)格圖,要使隨機(jī)圖使用梯度下降法更新至紋理和風(fēng)格圖相近司致,那么我們?cè)贑NN的第層需要定義的損失函數(shù)為:
其中是隨機(jī)圖在第層的特征圖的矩陣拆吆,是風(fēng)格圖在第層的特征圖的矩陣。這里的損失函數(shù)也是誤差平方損失脂矫,只不過(guò)是二者協(xié)方差矩陣的誤差枣耀。輸入特征進(jìn)過(guò)計(jì)算協(xié)方差,由前后變化的維度即可得知損失了位置信息庭再,但是這不影響風(fēng)格的遷移捞奕。
原論文的作者認(rèn)為CNN不同層生成的風(fēng)格水平不同,同時(shí)采用多個(gè)層的風(fēng)格損失相結(jié)合會(huì)使生成圖像效果更好:
其中是不同層的風(fēng)格損失的權(quán)重拄轻,是經(jīng)驗(yàn)值(就是超參數(shù)缝彬,隨便調(diào))。
同樣的,通過(guò)保持CNN參數(shù)不變撼玄,使用梯度下降法在訓(xùn)練中不斷更新隨機(jī)圖(更新方法參考公式(2))夺姑,即能使其具有風(fēng)格圖的紋理特征。
3.風(fēng)格遷移:
如圖1所示掌猛,風(fēng)格遷移的目標(biāo)是給定內(nèi)容圖盏浙,風(fēng)格圖,以及訓(xùn)練好的CNN荔茬,使隨機(jī)圖通過(guò)訓(xùn)練不斷更新废膘,能夠即具有內(nèi)容圖的內(nèi)容,又具有風(fēng)格圖的紋理慕蔚,即圖1中的結(jié)合圖丐黄。從結(jié)果來(lái)看,我們是把風(fēng)格圖的風(fēng)格“遷移”到了內(nèi)容圖上孔飒。但從過(guò)程來(lái)看灌闺,實(shí)際是一個(gè)圖像生成的過(guò)程。
這一目標(biāo)實(shí)際就是以上兩步(內(nèi)容生成和風(fēng)格生成)的結(jié)合坏瞄,我們定義的損失函數(shù)就是內(nèi)容損失函數(shù)和風(fēng)格損失函數(shù)的加權(quán)和:
這里的和分別是內(nèi)容損失和風(fēng)格損失的權(quán)重桂对,也是經(jīng)驗(yàn)值。越大鸠匀,結(jié)合圖的內(nèi)容就越具像蕉斜,反之越模糊;值越大,結(jié)合圖的紋理越相近蛛勉。
同樣地鹿寻,和公式(2)一樣,在訓(xùn)練過(guò)程中诽凌,保持CNN參數(shù)不變毡熏,通過(guò)反向傳播,利用梯度下降法不斷地更新隨機(jī)圖侣诵,即可實(shí)現(xiàn)內(nèi)容圖和風(fēng)格圖的結(jié)合痢法,生成圖1所示的結(jié)合圖。