Style Injection in Diffusion: A Training-free Approach for Adapting Large-scale Diffusion Models for Style Transfer-CVPR2024HighLight
代碼:https://github.com/jiwoogit/StyleID
論文:https://jiwoogit.github.io/StyleID_site/
為了解決風格遷移時在推理階段微調非常耗時的問題,提出操縱自注意力層的特征作為交叉注意力機制的工作方式,目標是通過利用預訓練的大規模文本到圖像擴散模型的生成能力來解決藝術風格遷移.在生成過程中,用風格形象的key和value來替代內容的key和value。 此外,引入查詢保存和注意力溫度縮放來減輕原始內容中斷的問題,并引入初始潛在自適應實例歸一化(AdaIN)來處理不和諧的顏色(未能傳輸樣式顏色)。 實驗結果表明,所提出的方法在傳統和基于擴散的風格轉移基線方面都超越了最先進的方法。
MOTIVATION
-
基于擴散模型(Diffusion Models, DM)的風格遷移的一般方法及其局限性:
- 一般方法利用預訓練的擴散模型的生成能力來進行風格遷移。一些研究專注于顯式解耦風格和內容,以實現可解釋和可控的風格遷移。其他一些研究專注于將風格圖像反轉(invert)到大規模文本到圖像擴散模型的文本潛在空間中。
- 這些方法通常需要對每個風格圖像進行基于梯度的優化(fine-tuning)和文本反轉(在推理階段(inference-stage),這是一個耗時的過程。
- DiffStyle是一種無需訓練的風格遷移方法,它避免了耗時的優化步驟。然而DiffStyle被認為難以應用于潛在擴散模型(Latent Diffusion Model, LDM),這限制了用戶利用大規模模型的顯著生成能力,因為DiffStyle無法很好地與這些模型集成。
-
將免訓練風格遷移擴展到大規模預訓練 DM 上的應用
- Plug-and-play表明,殘差塊和自注意力(SA)的attention map決定了生成圖像的空間布局
- Prompt-to-Prompt通過替換從文本提示中獲得的交叉注意(CA)的鍵和值來本地編輯圖像,同時保留其原始注意圖。這說明了交叉注意力的鍵和值可以調整填充圖像內容的方式。
- 所有這些工作都表明:1)attention maps決定空間布局,2)CA(交叉注意力) 的鍵和值調整要填充的內容。
-
相應啟發:認為 SA 層是轉移風格的有效方法。
- 與 CA 類似,替換 SA 的key和value(用style圖像的value和value替contern 圖像的key和value),將特定圖像的風格(textures)與不同圖像的內容(semantics and spatial layout)結合起來。
- 與 CA 類似,替換 SA 的key和value(用style圖像的value和value替contern 圖像的key和value),將特定圖像的風格(textures)與不同圖像的內容(semantics and spatial layout)結合起來。
-
此外,強調 SA 層在有風格遷移的特性:
-
語義相似性的保持:在基于SA的風格遷移中,內容圖像的patches(查詢,query)如果具有語義上的相似性,它們會與相似的風格(鍵,key)相互作用。這意味著,即使在風格遷移之后,這些內容圖像區域之間的關系仍然得以保持。這有助于保持圖像內容的完整性和語義連貫性。也就是說,采用 SA 的風格遷移可以保留原始內容,因為具有相似性的內容塊往往會從相應的風格圖像塊接收相似的注意力分數。
-
強大的特征表示能力:由于大規模擴散模型(Diffusion Model, DM)具有強大的特征表示能力,content image對應的每個查詢區域(each patch of the query)都能與具有相似紋理和語義的鍵(key)建立更高的相似性。換句話說,內容圖像中的每個小區域都能夠在風格圖像中找到具有相似紋理和語義的對應區域,這種相似性有助于模型在進行風格遷移時更好地保留內容圖像的語義信息,并根據風格圖像的紋理特征進行調整。這種特性允許模型更精確地識別和遷移與內容圖像區域相匹配的風格特征。這種相似性鼓勵模型基于內容和風格圖像之間局部紋理(例如邊緣)的相似性來進行風格遷移。
-
CONTRIBUTION
- 提出了一種風格遷移方法,通過對自注意力特征的簡單操作來利用大規模預訓練的 DM; 用樣式替換內容的鍵和值,無需任何優化或監督(例如文本)。
- 通過提出三個組件進一步改進風格遷移的樸素方法,以正確適應風格; 查詢保存(query preservation)、注意力溫度縮放(attention temperature scaling)和初始潛在 AdaIN(initial latent AdaIN)。
- 對風格遷移數據集的大量實驗驗證了所提出的方法顯著優于以前的方法并實現了最先進的性能。
RELATED WORKS
Diffusion Model-based Neural Style Transfer
- InST 引入了一種基于文本反轉的方法,旨在將給定的風格映射到相應的文本嵌入。
- StyleDiffusion旨在通過引入基于CLIP的風格分離損失來解耦風格和內容,并微調DM以進行風格遷移。
- DiffStyle 提出了一種免訓練的風格轉移方法,該方法利用 h-space并調整跳躍連接(skip connections),分別有效地傳達風格和內容信息。 然而,當 DiffStyle 應用于穩定擴散SD時,它們的行為與典型的風格轉移方法有很大不同; 不僅紋理也發生了變化,空間布局等語義也發生了變化。
Attention-based Image Editing in DM
預訓練的文本到圖像擴散模型在圖像編輯方面取得了顯著進展,這些模型被廣泛用于各種圖像編輯任務。
- Prompt-to-Prompt方法:
- 提出了一種基于文本的局部圖像編輯方法,通過操縱交叉注意力(cross-attention)圖來實現。
- 該方法觀察到交叉注意力在建立圖像空間布局與文本提示中每個詞之間的關系方面起著重要作用。
- Prompt-to-Prompt在保持注意力圖的同時改變交叉注意力(CA)的文本條件。 由于注意力圖影響輸出的空間布局,替換的文本條件決定了在生成的圖像中繪制什么,這些條件實際上是 CA 中的鍵和值。通過替換原始文本和交叉注意力圖為期望的版本,可以獲得與文本條件匹配的編輯圖像。
- Plug-and-play方法:
- “Plug-and-play”引入了一種文本引導的圖像到圖像翻譯方法。
- 發現空間特征(即來自殘差塊的特征)和自注意力圖決定了合成圖像的空間布局。
- 在給定文本條件下生成新圖像時,使用原始圖像的特征和注意力圖引導擴散模型,以保留原始的空間布局。
- MasaCtrl方法:
- “MasaCtrl”提出了一種使用文本提示進行一致性圖像編輯的相互自注意力控制方法。
- 該方法保留了源圖像自注意力層的鍵和值,同時用期望的文本提示對模型進行條件化。
LDM(Latent Diffusion Model)
潛在擴散模型(LDM)是一種在低維潛在空間中訓練的擴散模型,目的是聚焦于數據的語義比特,降低計算成本。其利用預先訓練的編碼器encoder,將數據集中的全部圖像編碼為潛在空間 z中的表示。并在潛在空間 z上訓練擴散模型,訓練時需要預測在時間步t時潛在表示 z t z_t zt?對應的噪聲 ? \epsilon ?。文本利用stable diffusion:
L L D M = E z , ? , t [ ∥ ? ? ? θ ( z t , t , y ) ∥ 2 2 ] , L_{\mathrm{LDM}}=\mathbb{E}_{z,\epsilon,t}[\|\epsilon-\epsilon_\theta(z_t,t,y)\|_2^2], LLDM?=Ez,?,t?[∥???θ?(zt?,t,y)∥22?],
- ?∈N(0,1)是噪聲
- 在給定圖像 x ∈ R x∈R%{h×W×3} x∈R的情況下,編碼器E將x編碼為潛在表示 z ∈ R h × w × c z∈R^{h×w×c} z∈Rh×w×c,并且解碼器從潛在表示重建圖像。
- t是從{1,…,T}均勻采樣的時間步數
- y是條件,即文本
- ? θ ?_θ ?θ?是預測加到上的噪聲的unet神經網絡,每個block for each resolution依次包括殘差塊、自我注意塊(SA)和交叉注意塊(CA)
自注意力快
重點關注利用 SA 塊(自注意力機制塊)來傳輸style:
Q = W Q ( ? ) , K = W K ( ? ) , V = W V ( ? ) , ? o u t = A t t n ( Q , K , V ) = s o f t m a x ( Q K T d ) ? V , Q=W_{Q}(\phi),K=W_{K}(\phi),V=W_{V}(\phi),\\\phi_{\mathrm{out}}=\mathrm{Attn}(Q,K,V)=\mathrm{softmax}(\frac{QK^{T}}{\sqrt{d}})\cdot V, Q=WQ?(?),K=WK?(?),V=WV?(?),?out?=Attn(Q,K,V)=softmax(d?QKT?)?V,
- ? {\phi} ?:殘差快residual后面的特征
- d:投影query的維度
- W(.):投影層
- y:我們不使用任何文本提示,y始終是空文本提示" "
- ? o u t {\phi}_{out} ?out?:每個位置的注意力權重
METHODS
Attention-based Style Injection
輸入風格
啟發與方法:
- 從“Prompt-to-Prompt”獲得啟發,文章提出一種操作自注意力層(SA)的方法,類似于交叉注意力(CA)。
- 將風格圖像 I s I_s Is? 的特征作為條件,通過在生成過程中替換內容圖像的鍵和值,實現風格圖像紋理向內容圖像的遷移。
潛在特征獲取:
- 使用DDIM(Denoising Diffusion Implicit Models)反演技術來獲取內容和風格圖像的潛在特征,在反演過程中,收集風格圖像的自注意力層特征。
- 定義從 t = 0 t=0 t=0到 t = T t=T t=T 的時間步長集合,用于描述圖像從清晰狀態 z c 0 z_c^0 zc0?和 z s 0 z_s^0 zs0?(內容圖像和風格圖像)逐步轉化為 t = T t=T t=T時的高斯噪聲的擴散過程特征收集.在正向過程的每個時間步 t t t收集內容圖像的查詢特征 Q c t Q_c^t Qct?和風格圖像的鍵和值特征 K s t , V s t K_s^t, V_s^t Kst?,Vst?
風格注入:
- 通過復制內容潛在噪聲 z T c z_T^c zTc? 來將風格化處理后的潛在噪聲 (stylized latent noise) z T c s z_T^{cs} zTcs?初始化.
- 在 z t c s z_t^{cs} ztcs?逆擴散過程,將風格圖像的鍵 K s t K_s^t Kst?和值 V s t V_s^t Vst? 注入到自注意力層,替代原有的鍵 K c s t K_{cs}^t Kcst?和值 V c s t V_{cs}^t Vcst?。
內容干擾問題以及查詢保留
原因:僅替換鍵和值可能導致內容干擾( content disruption).因為隨著逆擴散過程的進行,注意力值的變化會逐步改變風格化潛在表示的內容,由于注意力值的變化,原始內容的關鍵信息可能會逐漸丟失,導致生成的圖像內容與原始圖像內容有所不同。
實現:混合風格后化的潛在表示的query和內容圖像的query
Q ~ t c s = γ × Q t c + ( 1 ? γ ) × Q t c s , ? o u t c s = A t t n ( Q ~ t c s , K t s , V t s ) , \tilde{Q}_{t}^{cs}=\gamma\times Q_{t}^{c}+(1-\gamma)\times Q_{t}^{cs},\\ \phi_{\mathrm{out}}^{\mathrm{cs}}=\mathrm{Attn}(\tilde{Q}_{t}^{cs},K_{t}^{s},V_{t}^{s}), Q~?tcs?=γ×Qtc?+(1?γ)×Qtcs?,?outcs?=Attn(Q~?tcs?,Kts?,Vts?),
- Q c s t Q_{cs}^t Qcst?:風格化處理后的的潛在表示的query
- Q c t Q_c^t Qct?: 內容圖像的query
- γ \gamma γ :一個介于 0 到 1 之間的混合比例參數,通過調整 γ \gamma γ的值,可以控制風格遷移的程度。較高的 γ \gamma γ值會保留更多的原始內容信息,而較低的 γ \gamma γ值會加強風格遷移的效果
- ? o u t \phi_{\mathrm{out}} ?out?:自注意力計算的輸出
- 將這些操作應用于與局部紋理相關的解碼器的后面層(SD 中的第 7-2 個解碼器層)。
Attention Temperature Scaling
注意力圖是通過查詢(query)和鍵(key)特征之間的縮放點積來計算的。
- 在訓練期間,SA層中的查詢和鍵特征來自同一圖像,因此它們之間的相似性很高。
- 在風格遷移中,如果用風格圖像的鍵特征替換內容圖像的鍵特征,由于風格和內容很可能是不相關的,整體相似性會降低。這會導致計算出的注意力圖變得模糊或平滑,從而使輸出圖像變得不清晰,這對于同時捕捉內容和風格信息是不利的。
為了解決這個問題,作者測量了注意力圖的標準差,同時消除了基于注意力的風格注入。
-
計算在應用 softmax 之前的attention map,即計算查詢和鍵之間的縮放點積,以得到注意力圖,實驗驗證了這種風格注入往往會降低整個時間步上注意力圖的標準差
-
為了更清晰地校正注意力圖,我們引入了注意力溫度縮放參數。 具體來說,我們將進行softmax之前的注意力圖(attention map)乘以大于1的恒定溫度縮放參數τ:
-
A t t n τ ( Q t c s ~ , K t s , V t s ) = s o f t m a x ( τ Q t c s ~ ( K t s ) T d ) ? V t s , τ > 1 \mathrm{Attn}_{\tau}(\tilde{Q_{t}^{cs}},K_{t}^{s},V_{t}^{s})=\mathrm{softmax}(\frac{\tau \tilde{Q_{t}^{cs}}(K_{t}^{s})^{T}}{\sqrt{d}})\cdot V_{t}^{s},\tau>1 Attnτ?(Qtcs?~?,Kts?,Vts?)=softmax(d?τQtcs?~?(Kts?)T?)?Vts?,τ>1
-
使用 τ = 1.5 作為默認設置,這是整個時間步長的平均比率。 如圖 (b) 所示,確認它有效地校準了注意力圖的標準差,使其與其原始值相似.softmax之后的注意力圖將比其原始值更清晰
-
Initial Latent AdaIN
僅使用基于注意力的樣式注入進行的樣式遷移通常無法捕獲給定樣式的色調。
- 圖5(a)表示:紋理和局部圖案成功轉移到內容圖像,同時內容圖像的色調仍然保留。
- 圖5(b)表示即使注入樣式的查詢、鍵和值,生成的圖像仍然保留內容的色調。(為了確定 SA 中每個特征對色調的影響,還在樣式注入過程中添加了query。 然而,色調仍然與內容相似,因此自注意力特征對色調的影響較小)
分析了 DM 的另一個重要部分:initial latent noise
- 擴散模型在合成純白色或黑色圖像時存在困難,傾向于生成具有中等顏色的圖像,因為初始噪聲是從均值為零、方差為單位的正態分布中采樣的。
- 因此假設初始噪聲的統計數據對生成圖像的顏色和亮度有很大影響。
為了利用兩種初始潛在(initial latents)中的有價值信息,作者采用AdaIN(自適應實例歸一化)來調節初始潛在,以有效傳遞色調信息。
z T c s = σ ( z T s ) ( z T c ? μ ( z T c ) σ ( z T c ) ) + μ ( z T s ) , z_T^{cs}=\sigma(z_T^s)\left(\frac{z_T^c-\mu(z_T^c)}{\sigma(z_T^c)}\right)+\mu(z_T^s), zTcs?=σ(zTs?)(σ(zTc?)zTc??μ(zTc?)?)+μ(zTs?),
- AdaIN通過調整初始潛在的通道均值和標準差來實現顏色風格的遷移
- 若嘗試直接從 Z s T Z_s^T ZsT?生成圖像,合成結果的結構信息也會跟隨風格圖像,丟失內容的結構。
- μ(?) 和 σ(?) :分別表示通道級別的均值(channel-wise mean)和標準差
- 通過AdaIN處理后的初始潛在 z c s T z_{cs}^T zcsT? 保留了內容信息 z c T z_c^T zcT?,同時使通道均值和標準差與風格圖像 z s T z_s^T zsT?對齊。
Experiment
實驗設置
作者在LAION數據集上使用了Stable Diffusion 1.4預訓練模型,并采用了DDIM采樣方法,總共進行了50個時間步(t = {1, …, 50})的迭代。于超參數的默認設置,作者使用了γ = 0.75和τ = 1.5。
評估協議
AIGC常見圖像質量評估可以跳轉到這篇博客~
AIGC-常見圖像質量評估MSE、PSNR、SSIM、LPIPS、FID、CSFD,余弦相似度
ArtFID
為了避免傳統風格遷移方法可能過度擬合 Style Loss 的問題,作者采用了 ArtFID 作為評估指標,它綜合考慮了內容和風格的保持,并與人類判斷高度一致。
A r t F I D = ( 1 + L P I P S ) ? ( 1 + F I D ) ArtFID = (1 + LPIPS) · (1 + FID) ArtFID=(1+LPIPS)?(1+FID)
-
LPIPS 測量風格化圖像和相應內容圖像之間的內容保真度
- Learned Perceptual Image Patch Similarity 學習感知圖像塊相似度,LPIPS是一種衡量圖像感知相似性的指標,它通過比較圖像塊的深層特征來工作,這些特征能夠捕捉到人類視覺系統中對圖像質量的感知。
- LPIPS的值越低表示兩張圖像越相似,反之,則差異越大
- d ( x , x 0 ) = ∑ l 1 H l W l ∑ h , w ∣ ∣ w l ⊙ ( y ^ h w l ? y ^ 0 h w l ) ∣ ∣ 2 2 d(x,x_0)=\sum_l\frac1{H_lW_l}\sum_{h,w}||w_l\odot(\hat{y}_{hw}^l-\hat{y}_{0hw}^l)||_2^2 d(x,x0?)=∑l?Hl?Wl?1?∑h,w?∣∣wl?⊙(y^?hwl??y^?0hwl?)∣∣22?
- d d d: x , x 0 x,x_0 x,x0?之間的距離
- 從 l l l層提取特征堆(feature stack)并在通道維度中進行單位規格化(unit-normalize)。
- 利用向量 W l W_l Wl?來放縮激活通道數,最終計算 L 2 L_2 L2?距離。
- 最后在空間上平均,在通道上求和。
-
FID 評估風格化圖像和相應風格圖像之間的風格保真度
- F I D = ∥ μ r ? μ g ∥ 2 2 + T r ( Σ r + Σ g ? 2 ( Σ r Σ g ) 1 / 2 ) \mathrm{FID}=\|\mu_r-\mu_g\|_2^2+\mathrm{Tr}(\Sigma_r+\Sigma_g-2(\Sigma_r\Sigma_g)^{1/2}) FID=∥μr??μg?∥22?+Tr(Σr?+Σg??2(Σr?Σg?)1/2)
- FID得分越低,表示生成圖像的特征分布與真實圖像的特征分布越接近,即生成模型的性能越好。
- FID能夠捕捉到圖像的全局風格和分布特性
dataset
使用 MSCOCO 數據集的內容圖像和 WikiArt 數據集的風格圖像進行評估。 所有輸入圖像均經過中心裁剪,分辨率為 512 × 512。 此外,為了進行定量比較,從每個數據集中隨機選擇 20 個內容圖像和 40 個風格圖像,產生 800 個風格化圖像,如 StyTR2所做的那樣。
Content Feature Structural Distance-CFSD內容特征結構距離
在風格遷移評估中,內容保真度通常依賴于LPIPS距離,該指標使用了在ImageNet數據集上預訓練的AlexNet模型的特征空間,這使得LPIPS對紋理有偏見。圖像的風格信息可能會影響LPIPS分數,因為它偏向于紋理特征。為了減少風格信息對評估的影響,作者引入了CFSD,這是一種只考慮圖像塊之間空間相關性的新距離度量。
CFSD的計算步驟:
- 獲取特征圖:對于給定圖像 I I I,首先獲取特征圖 F ∈ R h × w × c F \in \mathbb{R}^{h \times w \times c} F∈Rh×w×c,這是VGG19網絡中conv3層的輸出特征。
- 計算相似性矩陣:計算特征圖 F F F中每對特征之間的相似性,得到相似性矩陣 M = F × F T M = F \times F^T M=F×FT,其中 M ∈ R h × w × h × w M \in \mathbb{R}^{h \times w \times h \times w} M∈Rh×w×h×w。
- 應用softmax操作:對相似性矩陣 M M M 的每個元素應用softmax操作,將其建模為概率分布,得到相關性矩陣 S = [ softmax ( M i ) ] h × w i = 1 S = [\text{softmax}(M_i)]_{h \times w}^{i=1} S=[softmax(Mi?)]h×wi=1?,其中 M i ∈ R 1 × h × w M_i \in \mathbb{R}^{1 \times h \times w} Mi?∈R1×h×w 是第 i i i 個圖像塊與其他塊的相似性。
- 計算KL散度:CFSD定義為兩個相關性矩陣之間的Kullback-Leibler散度(KL-divergence)。
CFSD公式:
C F S D = 1 h w ∑ i = 1 h w D K L ( S i c ∣ ∣ S i c s ) , \mathrm{CFSD}=\frac{1}{hw}\sum_{i=1}^{hw}D_{\mathrm{KL}}(S_{i}^{c}||S_{i}^{cs}), CFSD=hw1?i=1∑hw?DKL?(Sic?∣∣Sics?),
- S i c S_{i}^{c} Sic?:內容圖像對應的相關性矩陣的第i個元素,這些矩陣是通過計算圖像特征圖(例如,VGG19網絡的conv3層輸出)中每對特征之間的相似性得到的。
- S i c s S_{i}^{cs} Sics?:風格圖像對應的相關性矩陣的第i個元素
- D K L D_{KL} DKL?:KL散度
#F:\AIGCprojects\StyleID\evaluation\eval_artfid.py
def compute_patch_simi(path_to_stylized, path_to_content, batch_size, device, num_workers=1):"""Computes the distance for the given paths.Args:path_to_stylized (str): Path to the stylized images.path_to_style (str): Path to the style images. [注:這里應該為 path_to_content,修正為 path_to_content]batch_size (int): Batch size for computing activations.content_metric (str): Metric to use for content distance. Choices: 'lpips', 'vgg', 'alexnet' [注:缺少 content_metric 參數]device (str): Device for computing activations.num_workers (int): Number of threads for data loading.Returns:(float) FID value. [注:文檔中寫的是 FID value,但函數名為 compute_patch_simi,可能存在混淆,需要核對和確認]"""device = torch.device('cuda') if device == 'cuda' and torch.cuda.is_available() else torch.device('cpu')# 根據路徑獲取圖像路徑并排序以匹配樣式化圖像與對應的內容圖像stylized_image_paths = get_image_paths(path_to_stylized, sort=True)content_image_paths = get_image_paths(path_to_content, sort=True)# 確保樣式化圖像和內容圖像數量相等assert len(stylized_image_paths) == len(content_image_paths), 'Number of stylized images and number of content images must be equal.'# 定義圖像轉換方法style_transforms = ToTensor()# 創建樣式化圖像的數據集和數據加載器dataset_stylized = ImagePathDataset(stylized_image_paths, transforms=style_transforms)dataloader_stylized = torch.utils.data.DataLoader(dataset_stylized,batch_size=batch_size,shuffle=False,drop_last=False,num_workers=num_workers)# 創建內容圖像的數據集和數據加載器dataset_content = ImagePathDataset(content_image_paths, transforms=style_transforms)dataloader_content = torch.utils.data.DataLoader(dataset_content,batch_size=batch_size,shuffle=False,drop_last=False,num_workers=num_workers)# 初始化用于計算距離的度量類metric = image_metrics.PatchSimi(device=device).to(device)dist_sum = 0.0N = 0pbar = tqdm(total=len(stylized_image_paths))# 遍歷樣式化圖像和內容圖像的批次for batch_stylized, batch_content in zip(dataloader_stylized, dataloader_content):# 在不計算梯度的上下文中進行操作,節省內存和計算資源with torch.no_grad():# 計算當前批次的距離batch_dist = metric(batch_stylized.to(device), batch_content.to(device))N += batch_stylized.shape[0]dist_sum += torch.sum(batch_dist)pbar.update(batch_stylized.shape[0])pbar.close()return dist_sum / Ndef compute_cfsd(path_to_stylized, path_to_content, batch_size, device, num_workers=1):"""Computes CFSD for the given paths.Args:path_to_stylized (str): Path to the stylized images.path_to_content (str): Path to the content images.batch_size (int): Batch size for computing activations.device (str): Device for computing activations.num_workers (int): Number of threads for data loading.Returns:(float) CFSD value."""print('Compute CFSD value...')# 計算 Patch Similarity,該函數返回樣式化圖像和內容圖像的距離值simi_val = compute_patch_simi(path_to_stylized, path_to_content, 1, device, num_workers)# 將距離值保留四位小數simi_dist = f'{simi_val.item():.4f}'return simi_dist
#evaluation\image_metrics.py
class PatchSimi(nn.Module):def __init__(self, device=None):# 初始化函數super(PatchSimi, self).__init__()# 加載預訓練的 VGG19 模型,并移到指定設備上進行評估self.model = models.vgg19(pretrained=True).features.to(device).eval()# 指定層名稱和替換名稱的映射self.layers = {"11": "conv3"}# 圖像歸一化的均值和標準差self.norm_mean = (0.485, 0.456, 0.406)self.norm_std = (0.229, 0.224, 0.225)# KL 散度損失函數self.kld = torch.nn.KLDivLoss(reduction='batchmean')self.device = devicedef get_feats(self, img):features = []# 遍歷 VGG19 模型的各層并提取特征for name, layer in self.model._modules.items():img = layer(img)if name in self.layers:features.append(img)return featuresdef normalize(self, input):# 圖像歸一化處理return transforms.functional.normalize(input, self.norm_mean, self.norm_std)def patch_simi_cnt(self, input):b, c, h, w = input.size()# 轉置和重塑特征input = torch.transpose(input, 1, 3)features = input.reshape(b, h*w, c).div(c)feature_t = torch.transpose(features, 1, 2)# 計算內容圖像的特征相似度patch_simi = F.log_softmax(torch.bmm(features, feature_t), dim=-1)return patch_simi.reshape(b, -1)def patch_simi_out(self, input):b, c, h, w = input.size()# 轉置和重塑特征input = torch.transpose(input, 1, 3)features = input.reshape(b, h*w, c).div(c)feature_t = torch.transpose(features, 1, 2)# 計算樣式化圖像的特征相似度patch_simi = F.softmax(torch.bmm(features, feature_t), dim=-1)return patch_simi.reshape(b, -1)def forward(self, input, target):src_feats = self.get_feats(self.normalize(input))target_feats = self.get_feats(self.normalize(target))init_loss = 0.# 計算各層的 KL 散度并求和作為初始損失值for idx in range(len(src_feats)):init_loss += F.kl_div(self.patch_simi_cnt(src_feats[idx]), self.patch_simi_out(target_feats[idx]), reduction='batchmean')
效果
與傳統風格遷移方法的比較:時間快,效果好
- 在ArtFID(藝術風格遷移評價指標)方面,作者的方法大大超越了傳統方法,ArtFID與人類偏好一致。
- 在FID(Fréchet Inception Distance)方面,作者的方法記錄了最低的分數,表明風格化圖像與目標風格高度相似。
- 在內容保真度指標CFSD(Content Feature Structural Distance)和LPIPS(Learned Perceptual Image Patch Similarity)方面,作者的方法也展現出了優越的得分。
- 他們的方法可以通過調整參數γ來任意調整風格遷移的程度,并且在匹配LPIPS(內容)的值時,在FID(風格)方面顯著超越了其他所有方法。
- 作者的方法比其他方法顯著更快,即使使用了大規模的擴散模型。這種更快的速度來自于作者的方法可以使用更少的DDIM反演步驟,因為在反演步驟中額外利用了收集到的特征,大大降低了對內容和風格完美反演的必要性
作者的方法在保持內容圖像的結構信息方面表現更好,同時能夠有效地遷移風格:
- 以圖6為例,作者展示了他們的方法在保留橋梁結構方面的優勢,而其他baseline在保持結構或遷移風格方面存在挑戰。
- 相比之下,其他基線在給定任意內容風格對時,往往會丟失內容的結構或未能成功遷移風格。例如,DiffuseIT和DiffStyle在生成形狀合理且視覺上可信的圖像或保留原始內容方面存在問題。另一方面,InST雖然能夠合成逼真的圖像,但在風格遷移或改變圖像內容方面存在挑戰。