日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

图像风格迁移原理

發(fā)布時(shí)間:2023/12/13 综合教程 32 生活家
生活随笔 收集整理的這篇文章主要介紹了 图像风格迁移原理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

所謂圖像風(fēng)格遷移,是指利用算法學(xué)習(xí)著名畫作的風(fēng)格,然后再把這種風(fēng)格應(yīng)用到另外一張圖片上的技術(shù)。著名的圖像處理應(yīng)用Prisma是利用風(fēng)格遷移技術(shù),普通用戶的照片自動(dòng)變換為具有藝術(shù)家風(fēng)格的圖片。

一、圖像風(fēng)格遷移的原理

1、原始圖像風(fēng)格遷移的原理

  在學(xué)習(xí)原始的圖像風(fēng)格遷移之前,可以在先看看ImageNet圖像識(shí)別模型VGGNet(微調(diào)(Fine-tune)原理)。事實(shí)上,可以這樣理解VGGNet的結(jié)構(gòu):前面的卷積層是從圖像中提取“特征”,而后面的全連接層把圖片的“特征”轉(zhuǎn)換為類別概率。其中,VGGNet中的淺層(如conv1_1,conv1_2),提取的特征往往是比較簡(jiǎn)單的(如檢測(cè)點(diǎn)、線、亮度),VGGNet中的深層(如conv5_1,conv5_2),提取的特征往往比較復(fù)雜(如有無(wú)人臉或某種特定物體)。

  VGGNet本意是輸入圖像,提取特征,并輸出圖像類別。圖像風(fēng)格遷移正好與其相反,輸入的是特征,輸出對(duì)應(yīng)這種特征的圖片,如下圖所示:

   

  具體來(lái)說(shuō),風(fēng)格遷移使用卷積層的中間特征還原出對(duì)應(yīng)這種特征的原始圖像。如下圖所示,先選取一幅原始圖像,經(jīng)過VGGNet計(jì)算后得到各個(gè)卷積層的特征。接下來(lái),根據(jù)這些卷積層的特征,還原出對(duì)應(yīng)這種特征的原始圖像。

   

  下面的a、b、c、d、e分別為使用conv1_2、conv2_2、conv3_2、conv4_2、conv5_2的還原圖像。可以發(fā)現(xiàn):淺層的還原效果往往比較好,卷積特征基本保留了所有原始圖像中形狀、位置、顏色、紋理等信息;深層對(duì)應(yīng)的還原圖像丟失了部分顏色和紋理信息,但大體保留原始圖像中物體的形狀和位置。

   

  還原圖像的方法是梯度下降法。設(shè)原始圖像為$vec{p}$,期望還原的圖像為$vec{x}$(即自動(dòng)生成的圖像)。使用的卷積是第$l$層,原始圖像$vec{p}$在第$l$層的卷積特征為$P_{ij}^{l}$。$i$表示卷積的第$i$個(gè)通道,$j$表示卷積的第$j$個(gè)位置。通常卷積的特征是三維的,三維坐標(biāo)分別對(duì)應(yīng)(高、寬、通道)。此處不考慮具體的高和寬,只考慮位置$j$,相當(dāng)于把卷積“壓扁”了。比如一個(gè)10x10x32的卷積特征,對(duì)應(yīng)$1leqslant ileqslant 32$,$1leqslant jleqslant 100$。對(duì)于生成圖像$vec{x}$,同樣定義它在$l$層的卷積特征為$F_{ij}^{l}$。

  有了上面這些符號(hào)后,可以寫出“內(nèi)容損失”(Content Loss)。內(nèi)容損失$L_{content}(vec{p},vec{x},l)$的定義是:

  $L_{content}(vec{p},vec{x},l)=frac{1}{2}sumlimits_{i,j}(F_{ij}^{l}-P_{ij}^{l})^{2}$

  $L_{content}(vec{p},vec{x},l)$描述了原始圖像$vec{p}$和生成圖像$vec{x}$在內(nèi)容上的“差異”。內(nèi)容損失越小,說(shuō)明它們的內(nèi)容越接近;內(nèi)容損失越大,說(shuō)明它們的內(nèi)容差距也越大。先使用原始圖像$vec{p}$計(jì)算出它的卷積特征$P_{ij}^{l}$,同時(shí)隨機(jī)初始化$vec{x}$。接著,以內(nèi)容損失$L_{content}(vec{p},vec{x},l)$為優(yōu)化目標(biāo),通過梯度下降法逐步改變$vec{x}$。經(jīng)過一定步數(shù)后,得到的$vec{x}$是希望的還原圖像了。在這個(gè)過程中,內(nèi)容損失$L_{content}(vec{p},vec{x},l)$應(yīng)該是越來(lái)越小的。

  除了還原圖像原本的“內(nèi)容”之外,另一方面,還希望還原圖像的“風(fēng)格”。那么,圖像的“風(fēng)格”應(yīng)該怎么樣來(lái)表示呢?一種方法是使用圖像的卷積層特征的Gram矩陣。

  Gram矩陣是關(guān)于一組向量的內(nèi)積的對(duì)稱矩陣,例如,向量組$vec{x_{1}}$,$vec{x_{2}}$,...,$vec{x_{n}}$的Gram矩陣是

  $egin{bmatrix}
(vec{x_{1}},vec{x_{1}}) &(vec{x_{1}},vec{x_{2}}) &... &(vec{x_{1}},vec{x_{n}}) \
(vec{x_{2}},vec{x_{1}}) & (vec{x_{2}},vec{x_{2}}) & ... & (vec{x_{2}},vec{x_{n}})\
...& ...& ...&... \
(vec{x_{n}},vec{x_{1}})& (vec{x_{n}},vec{x_{2}}) & ... & (vec{x_{n}},vec{x_{n}})
end{bmatrix}$

  通常取內(nèi)積為歐幾里得空間上的標(biāo)準(zhǔn)內(nèi)積,即$(vec{x_{i}},vec{x_{j}}) = vec{x_{i}}^{T}vec{x_{j}}$。

  設(shè)卷積層的輸出為$F_{ij}^{l}$,那么這個(gè)卷積特征對(duì)應(yīng)的Gram矩陣的第$i$行第$j$個(gè)元素定義為

  $G_{ij}^{l}=sumlimits_{k}F_{ik}^{l}F_{jk}^{l}$

  設(shè)在第$l$層中,卷積特征的通道數(shù)為$N_{l}$,卷積的高、寬乘積為$M_{l}$,那么$F_{ij}^{l}$滿足$1leqslant ileqslant N_{l}$,$1leqslant jleqslant M_{l}$。G實(shí)際是向量組$F_{1}^{l}$,$F_{2}^{l}$,...,$F_{i}^{l}$,...,$F_{N_{l}}^{l}$的Gram矩陣,其中,其中$F_{i}^{l}=(F_{i1}^{l},F_{i2}^{l},...,F_{ij}^{l},...,F_{iM_{l}}^{l})$。

  此處數(shù)學(xué)符號(hào)較多,因此再舉一個(gè)例子來(lái)加深讀者對(duì)此Gram矩陣的理解。假設(shè)某一層輸出的卷積特征為10x10x32,即它是一個(gè)寬、高均為10,通道數(shù)為32的張量。$F_{1}^{l}$表示第一個(gè)通道的特征,它是一個(gè)100維的向量,$F_{2}^{l}$表示第二個(gè)通道的特征,它同樣是一個(gè)100維的向量,它對(duì)應(yīng)的Gram矩陣G是

  $egin{bmatrix}
(F_{1}^{l})^{T}(F_{1}^{l}) & (F_{1}^{l})^{T}(F_{2}^{l}) & ... &(F_{1}^{l})^{T}(F_{32}^{l}) \
(F_{2}^{l})^{T}(F_{1}^{l}) & (F_{2}^{l})^{T}(F_{2}^{l}) & ... & (F_{2}^{l})^{T}(F_{32}^{l})\
...& ... &... &... \
(F_{32}^{l})^{T}(F_{1}^{l})& (F_{32}^{l})^{T}(F_{2}^{l}) & ... & (F_{32}^{l})^{T}(F_{32}^{l})
end{bmatrix}$

  Gram矩陣可以在一定程度上反映原始圖片中的“風(fēng)格” 。仿照“內(nèi)容損失”,還可以定義一個(gè)“風(fēng)格損失”(Style Loss)。設(shè)原始圖像為$vec{a}$,要還原的風(fēng)格圖像為$vec{x}$,先計(jì)算出原始圖像某一次卷積的Gram矩陣為$A^{l}$,要還原的圖像$vec{x}$經(jīng)過同樣的計(jì)算得到對(duì)應(yīng)卷積層的Gram矩陣是$G^{l}$,風(fēng)格損失定義為

  $L_{style}(vec{p},vec{x},l)=frac{1}{4N_{l}^{2}M_{l}^{2}}sum limits_{i,j}(A_{ij}^{l}-G_{ij}^{l})^{2}$

  分母上的$4N_{l}^{2}M_{l}^{2}$是一個(gè)歸一化項(xiàng),目的是防止風(fēng)格損失的數(shù)量級(jí)相比內(nèi)容損失過大。在實(shí)際應(yīng)用中,常常利用多層而非一層的風(fēng)格損失,多層的風(fēng)格損失是單層風(fēng)格損失的加權(quán)累加,即$L_{style}(vec{p},vec{x})=sum limits_{i}w_{l}L_{style}(vec{p},vec{x},l)$,其中$w_{l}$表示第$l$層權(quán)重。

  利用風(fēng)格損失,可以還原出圖像的風(fēng)格了。如下圖所示,嘗試還原梵高的著名畫作《星空》的風(fēng)格。

   

  

  其中,圖a是由conv1_1的風(fēng)格損失還原的,圖b是由conv1_1,conv2_1兩層的風(fēng)格損失還原的,圖c是由conv1_1,conv2_1,conv3_1,圖d為conv1_1,conv2_1,conv3_1,conv4_1風(fēng)格損失還原的。使用淺層還原的“風(fēng)格圖像”的紋理尺度往往比較小,只保留了顏色和局部的紋理(如圖a);組合深層、淺層還原出的“風(fēng)格圖像”更加真實(shí)且接近原圖片(如圖e)。
總結(jié)一下,到目前為止介紹了兩個(gè)內(nèi)容:

  (1)利用內(nèi)容損失還原圖像內(nèi)容。
  (2)利用風(fēng)格損失還原圖像風(fēng)格。

  那么,可不可以將內(nèi)容損失和風(fēng)格損失結(jié)合起來(lái),在還原一張圖像的同時(shí)還原另一張圖像的風(fēng)格呢?答案是肯定的,這是圖像風(fēng)格遷移的基本算法。

  設(shè)原始的內(nèi)容圖像為$vec{p}$,原始的風(fēng)格圖像為$vec{a}$,待生成的圖像為$vec{x}$。希望$vec{x}$可以保持內(nèi)容圖像$vec{p}$的內(nèi)容,同時(shí)具備風(fēng)格圖像$vec{a}$的風(fēng)格。因此組合$vec{p}$的內(nèi)容損失和$vec{a}$的風(fēng)格損失,定義總的損失函數(shù)為

  $L_{total}(vec{p},vec{a},vec{x})=alpha L_{content}(vec{p},vec{x})+eta L_{style}(vec{a},vec{x})$

  $alpha$,$eta$是平衡兩個(gè)損失的超參數(shù)。如果$alpha$偏大,還原的圖像會(huì)更接近于$vec{p}$中,如果$eta$偏大,還原的圖像會(huì)更接近$vec{a}$。使用總的損失函數(shù)可以組合$vec{p}$的內(nèi)容和$vec{x}$的風(fēng)格,這實(shí)現(xiàn)了圖像風(fēng)格的遷移。部分還原的圖像如下圖所示

   

  以上是原始的圖像風(fēng)格遷移的基本原理。事實(shí)上,原始的圖像風(fēng)格遷移速度非常慢,在CPU上生成一張圖片需要數(shù)十分鐘甚至幾個(gè)小時(shí),即使在GPU上也需要數(shù)分鐘才能生成一張較大的圖片,這大大的限制了這項(xiàng)技術(shù)的使用場(chǎng)景。速度慢的原因在于,要使用總損失$L_{total}(vec{p},vec{a},vec{x})$優(yōu)化圖片$vec{x}$,這意味著生成一張圖片需要幾百步梯度下降法的迭代,而每一步的迭代都需要耗費(fèi)大量的時(shí)間。從另一個(gè)角度看,優(yōu)化$vec{x}$可以看作是一個(gè)“訓(xùn)練模型”的過程,以往都是針對(duì)模型參數(shù)訓(xùn)練,而這里訓(xùn)練的目標(biāo)是圖片$vec{x}$,而訓(xùn)練模型一般都比執(zhí)行訓(xùn)練好的模型要慢很多。下面將會(huì)講到快速圖像風(fēng)格遷移,它把原來(lái)的“訓(xùn)練”的過程變成了一個(gè)“執(zhí)行”的過程,因此大大加快了生成風(fēng)格話圖片的過程。

二、快速圖像風(fēng)格遷移的原理

  原始的圖像風(fēng)格遷移用一個(gè)損失$L_{total}(vec{p},vec{a},vec{x})$來(lái)衡量$vec{x}$是否成功組合了$vec{p}$的內(nèi)容和$vec{a}$的風(fēng)格。然后以$L_{total}(vec{p},vec{a},vec{x})$為目標(biāo),用梯度下降法來(lái)逐步迭代$vec{x}$。因?yàn)樵谏蓤D像的過程中需要逐步對(duì)$vec{x}$做優(yōu)化,所以速度比較慢。

  快速圖像風(fēng)格遷移的方法是:不使用優(yōu)化的方法來(lái)逐步迭代生成$vec{x}$,而是使用一個(gè)神經(jīng)網(wǎng)絡(luò)之間生成$vec{x}$。對(duì)應(yīng)的網(wǎng)絡(luò)結(jié)構(gòu)如下圖所示:

   

  整個(gè)系統(tǒng)由兩個(gè)神經(jīng)網(wǎng)絡(luò)組成,它們?cè)趫D中由兩個(gè)虛線框分別標(biāo)出。左邊的是圖像生成網(wǎng)絡(luò),右邊是損失網(wǎng)絡(luò)。損失網(wǎng)絡(luò)實(shí)際上是VGGNet,這與原始的風(fēng)格遷移是一致的。同原始圖像風(fēng)格遷移一樣,利用損失網(wǎng)絡(luò)來(lái)定義內(nèi)容損失、風(fēng)格損失。這個(gè)損失用來(lái)訓(xùn)練圖像生成網(wǎng)絡(luò)。圖像生成網(wǎng)絡(luò)的職責(zé)是生成某一種風(fēng)格的圖像,它的輸入是一個(gè)圖像,輸出同樣是一個(gè)圖像。由于生成圖像只需要在網(wǎng)絡(luò)中計(jì)算一遍,所以速度比原始圖像風(fēng)格遷移提高很多。

  同樣使用數(shù)學(xué)符號(hào)嚴(yán)格地闡述上面地過程:設(shè)輸入的圖像為$vec{x}$,經(jīng)過圖像生成網(wǎng)絡(luò)生成的圖像為$vec{y}$。$vec{y}$在內(nèi)容上應(yīng)該與原始的內(nèi)容圖像$vec{y}_{c}$接近,因此可以利用損失網(wǎng)絡(luò)定義內(nèi)容損失$L_{content}(vec{y},vec{y}_{c})$,內(nèi)容損失使用的是VGG-16中的relu3_3層輸出的特征,對(duì)應(yīng)上圖中的$l_{feat}^{phi ,relu3\_3}$。另一方面,我們還希望$vec{y}$具有目標(biāo)風(fēng)格圖像$vec{y}_{s}$的風(fēng)格,因此又可以定義一個(gè)風(fēng)格損失$L_{total}(vec{y},vec{y}_{c},vec{y}_{s})$。定義風(fēng)格損失時(shí)使用了VGG-16的四個(gè)中間層relu1_2,relu2_2,relu3_3,relu4_3,對(duì)應(yīng)圖中的$l_{style}^{phi ,relu1\_2}$、$l_{style}^{phi ,relu2\_2}$、$l_{style}^{phi ,relu3\_3}$、$l_{style}^{phi ,relu4\_3}$。同樣組合這兩個(gè)損失得到一個(gè)總損失$L_{total}(vec{y},vec{y}_{c},vec{y}_{s})$。利用總損失可以訓(xùn)練圖像生成網(wǎng)絡(luò)。訓(xùn)練完成后直接使用圖像生成網(wǎng)絡(luò)生成圖像。值得一提的是,在整個(gè)訓(xùn)練過程中,一般只固定一種風(fēng)格$vec{y}_{s}$,而內(nèi)容圖像$vec{y}_{c}$取和輸入$vec{x}$一樣,即$vec{y}_{s}$=$vec{x}$。

  下面詳細(xì)的比較原始圖像風(fēng)格遷移與快速圖像風(fēng)格遷移。

   

  這篇博客詳細(xì)介紹了原始圖像風(fēng)格遷移的基本原理,其中內(nèi)容損失、風(fēng)格損失兩種損失函數(shù)的定義尤為關(guān)鍵。接著還介紹了快速圖像風(fēng)格遷移的原理,以及它和原始圖像風(fēng)格遷移的對(duì)比。

總結(jié)

以上是生活随笔為你收集整理的图像风格迁移原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。