AIGC-风格迁移-style Injection in Diffusion-CVPR2024HighLight-论文精度

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)结合起来。
      在这里插入图片描述
  • 此外,强调 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} xR的情况下,编码器E将x编码为潜在表示 z ∈ R h × w × c z∈R^{h×w×c} zRh×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)=lHlWl1h,w∣∣wl(y^hwly^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μg22+Tr(Σr+Σg2(Σ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} FRh×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} MRh×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} MiR1×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=hw1i=1hwDKL(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虽然能够合成逼真的图像,但在风格迁移或改变图像内容方面存在挑战。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/15204.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

你真的会使用Vue3的onMounted钩子函数吗?Vue3中onMounted的用法详解

目录 一、onMounted的前世今生 1.1、onMounted是什么 1.2、onMounted在vue2中的前身 1.2.1、vue2中的onMounted 1.2.2、Vue2与Vue3的onMounted对比 1.3、vue3中onMounted的用法 1.3.1、基础用法 1.3.2、顺序执行异步操作 1.3.3、并行执行多个异步操作 1.3.4、执行一次…

Rust腐蚀怎么用服务器一键开服联机教程

1、进入控制面板 首次登陆需要点击下方重置密码,如何再点击登录面板,点击后会跳转到登录页面,输入用户名和密码登录即可 2、设置游戏端口 由于腐蚀的设置需要三个端口,它们用于游戏端口(必须为首选端口)&a…

FFMPEG 解码过程初步学习

1. 视频文件解码过程 解码过程 步骤如下: 视频文件(封装格式,MP4/FLV/AVI 等)获取视频格式信息等解复用为Stream 流, 准备解码用的Codec将Stream 流 使用解码器解为Raw 格式针 1.1 音视频格式填充: int…

找不到msvcr110.dll无法继续执行代码的原因分析及解决方法

在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是找不到msvcr110.dll文件。这个错误通常发生在运行某些程序或游戏时,系统无法找到所需的动态链接库文件。为了解决这个问题,下面我将介绍5种常见的解决方法。 一&#…

Vue3实现上传照片以及回显

Vue3实现上传照片以及回显 一、安装Element Plus二、案例1、基本示例 三、进阶案例1、代码2、代码解释1、上传接口展示2、查询接口展示组件属性 3、效果展示 一、安装Element Plus 使用 Element Plus 组件库来实现上传照片和回显同样很简单,你可以按照以下步骤进行…

用栈实现队列(C语言)

目录 题目题目分析 代码栈的实现结构体。栈的初始化栈的销毁 入栈删除查找顶部数据判空 答案结构体初始化插入数据删除数据获取队列开头元素判空销毁栈 题目 题目分析 链接: 题目 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、po…

pyside6下没有designer.exe、pyside6-uic.exe等

使用conda安装的pyside6(conda install pyside6),发现pyside6目录下没有designer.exe、pyside6-uic.exe等;designer.exe在Miniconda3/Library/bin下 pyside6-uic.exe、pyside6-rcc.exe在Miniconda3\Scripts下 但是 使用pip安装…

【MyBatis】MyBatis解析全局配置文件源码详解

目录 一、前言 思维导图概括 二、配置文件解析过程分析 2.1 配置文件解析入口 2.2 初始化XMLConfigBuilder 2.3 XMLConfigBuilder#parse()方法:解析全局配置文件 2.3.1 解析properties配置 2.3.2 解析settings配置 2.3.2.1 元信息对象(MetaClas…

解决移植Metasploitable3到VM虚拟机无网络的问题

第一步 导入后不要开机,先在虚拟机设置里面将原有的两个网络适配器移除。 第二步 接着在选项里面,在客户机操作系统里面,选择Microsoft Windwos(W), 版本选择Windows Server 2008 R2 x64 第三步 先打开虚拟机,然后…

Python_文件操作_学习

目录 一、关于文件的打开和关闭 1. 文件的打开 2.文件的关闭 二、文件的读取 1. 文件的读_r 2. 使用readline 3.使用readlines 三、文件的写入 1. 文本的新建写入 2.文本的追加写入 四、文件的删除和重命名 1.文件的重命名 2.文件的删除 五、文件的定位读写 1.t…

Unity Miscellaneous入门

概述 在Unity中有非常多好用的组件,也是Unity为我们提供的方便的开发工具,它的功能可能不是主流的内容,比如渲染,音乐,视频等等,所有Unity把这些内容统一归到了一个杂项文件组中。 Unity组件入门篇总目录-…

Python线程

Python线程 1. 进程和线程 先来了解下进程和线程。 类比: 一个工厂,至少有一个车间,一个车间中至少有一个工人,最终是工人在工作。 一个程序,至少有一个进程,一个进程中至少有一个线程,最终…

langchain实战-从0到1搭建ai聊天机器人

介绍 当前,人工智能大模型公司如雨后春笋般迅速涌现,例如 OpenAI、文心一言、通义千问等,它们提供了成熟的 API 调用服务。然而,随之而来的是不同公司的繁琐协议接入过程,这让许多开发者感到头疼不已。有没有一种统一…

SpringBoot + Redis实现对接口的限流

目录 前言 什么是限流? 实现限流 创建一个注解类 接着创建一个切面类 前言 在项目中,对于接口的限流,是任何项目都必不可少的一部分,主要是为了防止用户频繁的发送请求,对服务器造成压力。 另外一点就是防止外来攻…

C++之第八课

课程列表 今天我们来学一学C里的一些实用的东西。 1.域宽 说到域宽setw&#xff0c;就叒要加头文件了。 #include<iomanip> 使用格式是&#xff1a; cout<<setw(5)<<"123"; setw括号里面可以改数字&#xff0c;后面就是输出内容了&#xff…

COD论文笔记 Boundary-Guided Camouflaged Object Detection

动机 挑战性任务&#xff1a;伪装物体检测&#xff08;COD&#xff09;是一个重要且具有挑战性的任务&#xff0c;因为伪装物体往往与背景高度相似&#xff0c;使得准确识别和分割非常困难。现有方法的不足&#xff1a;现有的深度学习方法难以有效识别伪装物体的结构和细节&am…

MySQL索引、视图练习

素材 1.学生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept) 学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键 2.课程表&#xff1a;Course (Cno, Cname,) 课程号&#xff0c;课程名 Cno为主键 3.学生选课表&#xff1a;SC (Sno…

Home Credit - Credit Risk Model Stability

本篇是对Kaggle上Home Credit - Credit Risk Model Stability竞赛中的开源代码VotingClassifier Home Credit的解读。原链接在VotingClassifier Home Credit (kaggle.com)。 %%writefile script.py import sys from pathlib import Path import subprocess import os import g…

浅谈JMeter运行原理

浅谈JMeter运行原理 JMeter架构基础 JMeter基于Java平台开发&#xff0c;运行于Java虚拟机&#xff08;JVM&#xff09;之上。这意味着它可以在任何支持JVM的操作系统上运行&#xff0c;包括Windows、Linux、macOS等。其核心架构设计围绕着多线程执行机制&#xff0c;这使得它…