【深度学习】FaceChain-SuDe,免训练,AI换脸

https://arxiv.org/abs/2403.06775

FaceChain-SuDe: Building Derived Class to Inherit Category Attributes for One-shot Subject-Driven Generation

摘要

最近,基于主体驱动的生成技术由于其个性化文本到图像生成的能力,受到了广泛关注。典型的研究工作主要集中在学习新主体的私有属性。然而,一个重要的事实没有被认真对待,即主体并不是一个孤立的新概念,而应该是预训练模型中某个类别的特化。这导致主体无法全面继承其类别中的属性,从而导致属性相关生成效果不佳。在本文中,受到面向对象编程的启发,我们将主体建模为派生类,其基类是其语义类别。这种建模使得主体能够从其类别继承公共属性,同时从用户提供的示例中学习其私有属性。具体来说,我们提出了一种即插即用的方法,称为Subject-Derived正则化(SuDe)。它通过约束主体驱动生成的图像在语义上属于主体的类别,构建了基类-派生类的建模。在三个基准和两个骨干网络下进行的广泛实验中,我们的SuDe方法在保持主体忠实度的同时,实现了富有想象力的属性相关生成。代码将很快在FaceChain开源。

1. 介绍

最近,随着文本到图像扩散模型的快速发展【22, 26, 29, 32】,人们可以轻松地使用文本提示生成高质量、照片般逼真且富有想象力的图像。这使得人们对AI绘画在游戏设计、电影拍摄等各个领域有了新的期待。其中,主体驱动的生成是一种有趣的应用,旨在为特定主体定制生成。例如,您感兴趣的东西如宠物、吊坠、动漫角色等。这些主体对于每个自然人(用户)来说是特定的,并不存在于预训练扩散模型的大规模训练中。为了实现这一应用,用户需要提供一些示例图像,以便将主体与一个特殊的标记({S*})绑定,然后可以用来指导进一步的定制。

现有的方法可以分为两种:离线方法和在线方法。前者【31, 41】采用离线训练的编码器直接将主体示例编码为文本嵌入,从而实现高测试效率。但其编码器的训练依赖于额外的大规模图像数据集,甚至还需要像素级的注释以获得更好的性能【41】。后者【13, 14, 18, 30】采用测试时微调策略来获得代表特定主体的文本嵌入。尽管牺牲了测试效率,但这种方法消除了对额外数据的依赖,更便于应用部署。由于其灵活性,本文中我们重点改进在线方法。

在部署中,最用户友好的方式仅需要用户上传一个示例图像,即一次性主体驱动的生成。然而,我们发现现有方法在这一具有挑战性但有价值的场景中,特别是在属性相关提示下,表现并不总是令人满意。如图1(a)所示,基线方法未能使“Spike”奔跑、跳跃或张嘴,这些都是狗的自然属性。有趣的是,预训练模型可以为非定制的“狗”生成这些属性【22, 26, 29, 32】。由此我们推测,图1中的失败是因为单一的示例图像不足以提供定制主体所需的属性,而这些属性无法由预训练模型自动补全。基于上述考虑,我们提出通过使主体(“Spike”)显式继承其语义类别(“狗”)的属性来解决这一问题。具体来说,受到面向对象编程(OOP)中定义的启发,我们将主体建模为其类别的派生类。如图1(b)所示,语义类别(“狗”)被视为基类,包含由预训练模型提供的公共属性。主体(“Spike”)被建模为“狗”的派生类,继承其公共属性,同时从用户提供的示例中学习私有属性。从图1(a)的可视化结果来看,我们的建模显著改善了基线方法在属性相关生成方面的表现。

在这里插入图片描述
图1

(a) 该实验对象是一只名为“Spike”的金毛猎犬,基准模型是 DreamBooth [30]。基准模型的失败是因为示例图像无法提供所需的属性,如“running”。我们的方法通过将“Dog”类别的这些属性继承到“Spike”来解决这一问题。

(b) 我们将“Spike”构建为基类“Dog”的派生类。在本文中,我们将预训练模型的基类的一般属性记录为公共属性,而对象特定的属性记录为私有属性。红色波浪线标记的部分是 C++ 中的“继承”语法 [37]。

从人类理解的角度来看,上述建模,即主体(“Spike”)是其类别(“狗”)的派生类,是一个自然的事实。但对于生成模型(例如扩散模型)来说,这种建模是不自然的,因为它没有“Spike”这一主体的先验概念。因此,为了实现这种建模,我们提出了一种Subject Derivation正则化(SuDe),以约束主体的生成图像可以分类到其对应的语义类别中。以上述例子为例,生成的“Spike的照片”应该有很高的概率属于“狗的照片”。这种正则化不能通过添加分类器轻易实现,因为其语义可能与预训练扩散模型中的语义不一致。因此,我们提出显式揭示扩散模型中的隐式分类器以实现上述分类的正则化。

我们的SuDe是一种即插即用的方法,可以方便地与现有的主体驱动方法结合。我们在三个精心设计的基准上进行了评估,分别是DreamBooth【30】、Custom Diffusion【18】和ViCo【14】。结果表明,我们的方法可以显著改善属性相关生成,同时保持主体忠实度。

我们的主要贡献如下:

  • 我们为主体驱动生成提供了一个新的视角,即将主体建模为其语义类别的派生类,基类。
  • 我们提出了一种主体派生正则化(SuDe),通过隐式扩散分类器构建主体与其类别之间的基类-派生类关系。
  • 我们的SuDe可以方便地与现有基线方法结合,在即插即用的方式下显著改善属性相关生成,同时保持主体忠实度。

相关工作

2.1 面向对象编程

面向对象编程 (Object-Oriented Programming, OOP) 是一种具有对象概念的编程范式【2, 28, 40】,包括四个重要定义:类、属性、派生和继承。类是用于创建包含某些属性的对象的模板,这些属性包括公有属性和私有属性。前者可以在类外部访问,而后者不能。派生是定义一个属于现有类的新类,例如,可以从“Dog”类派生出一个新的“Golden Retriever”类,前者称为派生类,后者称为基类。继承意味着派生类应该继承基类的一些属性,例如,“Golden Retriever”应该继承“Dog”的“running”和“jumping”等属性。在本文中,我们将以主题驱动的生成建模为类派生,其中主题是派生类,其语义类别是相应的基类。为了适应这一任务,我们使用公有属性来表示一般特性,如“running”,使用私有属性来表示具体特性,如主题标识符。基类(类别)包含由预训练扩散模型提供的公有属性,而派生类(主题)从示例图像中学习私有属性,同时继承其类别的公有属性。

2.2 文本到图像生成

文本到图像生成旨在通过输入文本的指导生成高质量的图像,这通过结合生成模型与图像-文本预训练模型(例如,CLIP【24】)来实现。从生成器的角度来看,可以大致分为三类:基于GAN的方法、基于VAE的方法和基于扩散的方法。基于GAN的方法【9, 27, 38, 42, 44】采用生成对抗网络作为生成器,在结构化图像如人脸上表现良好,但在具有多变组件的复杂场景中表现较差。基于VAE的方法【6, 10, 12, 25】使用变分自编码器生成图像,能够合成多样化的图像,但有时无法很好地匹配文本。最近,基于扩散的方法【4, 11, 22, 26, 29, 32】取得了SOTA(State-of-the-Art)表现,能够根据文本提示生成照片级真实感的图像。在本文中,我们专注于将预训练的文本到图像扩散模型应用于主题定制化。

2.3 主题驱动的生成

给定一个特定主题,主题驱动的生成旨在通过文本指导生成该主题的新图像。先驱工作根据训练策略可分为两类:离线方法和在线方法。离线方法【7, 8, 31, 41】直接将主题的示例图像编码为文本嵌入,因此需要训练一个额外的编码器。虽然具有高测试效率,但由于需要大规模数据集进行离线训练,成本较高。在线方法【13, 14, 18, 30, 39】在测试时通过微调预训练模型来学习新主题,用一个特定的token ‘{S*}’表示主题。尽管牺牲了一些测试效率,但不需要额外的数据集和网络。然而,对于最用户友好的单次场景,这些方法无法很好地定制与属性相关的生成。为此,我们提出将主题构建为其类别的派生类,以继承公有属性同时学习私有属性。一些先前的工作【18, 30】通过提示工程部分考虑了这个问题,但我们在第5.4.5节中展示了我们的方法SuDe更为满意。

方法

3.1 预备知识

3.1.1 文本到图像扩散模型

扩散模型【15, 34】通过从高斯噪声中恢复图像来近似真实数据分布。它们使用一个前向过程逐渐在清晰图像(或其潜在代码) x 0 x_0 x0上添加噪声 ϵ ∼ N ( 0 , I ) \epsilon \sim N(0,I) ϵN(0,I),以获得一系列噪声变量 x 1 x_1 x1 x T x_T xT,其中 T T T通常等于1000,如下所示:

x t = α t x 0 + 1 − α t ϵ x_t = \sqrt{\alpha_t} x_0 + \sqrt{1 - \alpha_t} \epsilon xt=αt x0+1αt ϵ

其中 α t \alpha_t αt是控制噪声进程的 t t t相关变量。在文本到图像生成中,生成的图像由文本描述 P P P指导。给定步骤 t t t处的噪声变量 x t x_t xt,模型训练逐渐对 x t x_t xt去噪,如下所示:

E x , c , ϵ , t [ w t ∣ ∣ x t − 1 − x θ ( x t , c , t ) ∣ ∣ 2 ] E_{x,c,\epsilon,t}[w_t ||x_{t-1} - x_\theta(x_t, c, t)||^2] Ex,c,ϵ,t[wt∣∣xt1xθ(xt,c,t)2]

其中 x θ x_\theta xθ是模型预测, w t w_t wt是步骤 t t t的损失权重, c = Γ ( P ) c = \Gamma(P) c=Γ(P)是文本提示的嵌入, Γ ( ⋅ ) \Gamma(·) Γ()是预训练的文本编码器,例如BERT【17】。在我们的实验中,我们使用Stable Diffusion【3】,其基于LDM【29】,并使用CLIP【24】文本编码器作为我们的主干模型。

3.1.2 主题驱动的微调

概述:主题驱动生成的核心是将新主题的概念植入预训练的扩散模型中。现有工作【13, 14, 18, 30, 43】通过微调扩散模型的部分或全部参数、文本嵌入或适配器实现这一点,如下所示:

L s u b = ∣ ∣ x t − 1 − x θ ( x t , c s u b , t ) ∣ ∣ 2 L_{sub} = ||x_{t-1} - x_\theta(x_t, c_{sub}, t)||^2 Lsub=∣∣xt1xθ(xt,csub,t)2

其中这里的 x t − 1 x_{t-1} xt1是步骤 t − 1 t-1 t1处的用户提供的示例的噪声版本, c s u b c_{sub} csub是主题提示的嵌入(例如,“photo of a {S*}”)。‘{S*}’代表主题名称。

动机:使用上述公式3,现有方法可以学习主题的特定属性。然而,用户提供的单个示例中的属性不足以进行富有想象力的定制。现有方法没有设计来解决这个问题,只依赖于预训练的扩散模型自动填充缺失的属性。但我们发现这不够令人满意,例如在图1中,基线未能将‘Spike’狗定制为‘running’和‘jumping’。为此,我们提出将主题建模为其语义类别(基类)的派生类。这有助于主题继承其类别的公有属性,同时学习其私有属性,从而在保持主题一致性的同时改善属性相关的生成。具体而言,如图2(a)所示,通过重构主题示例捕捉私有属性。并且通过鼓励由主题提示({S*})指导的 x t − 1 x_{t-1} xt1语义上属于其类别(例如“Dog”),继承公有属性,如图2(b)所示。

3.2 主题派生正则化

派生类是面向对象编程中的定义,而不是命题。因此,没有可以直接用来约束主题成为其类别的派生类的充分条件。然而,根据派生的定义,自然存在一个必要条件:派生类应该是其基类的子类。我们发现约束这个必要条件对帮助主题继承其类别的属性非常有效。具体而言,我们正则化主题驱动生成的图像,使其属于主题的类别,如下所示:

L s u d e = − log ⁡ [ p ( c c a t e ∣ x θ ( x t , c s u b , t ) ) ] L_{sude} = -\log[p(c_{cate} | x_\theta(x_t, c_{sub}, t))] Lsude=log[p(ccatexθ(xt,csub,t))]

其中 c c a t e c_{cate} ccate c s u b c_{sub} csub是类别和主题的条件。公式4很好地构建了一个派生类主题,原因有二:(1) 类别的属性反映在其嵌入 c c a t e c_{cate} ccate中,其中大部分是应该继承的公有属性。这是因为嵌入是由预训练的大型语言模型(LLM)【17】获得的,其训练主要涉及一般属性。(2) 如第4节分析的那样,优化 L s u d e L_{sude} Lsude结合公式3等同于增加 p ( x t − 1 ∣ x t , c s u b , c c a t e ) p(x_{t-1} | x_t, c_{sub}, c_{cate}) p(xt1xt,csub,ccate),这意味着生成一个同时满足 c s u b c_{sub} csub(私有属性)和 c c a t e c_{cate} ccate(公有属性)条件的样本。尽管形式简单,公式4不能直接优化。在接下来的部分,我们描述如何在3.2.1节中计算它,并在3.2.2节中防止训练崩溃的必要策略。

3.2.1 主题派生损失

公式4中的概率不能通过一个额外的分类器容易获得,因为它的语义可能与预训练的扩散模型不对齐。为了确保语义对齐,我们提出在扩散模型本身中揭示隐式分类器。使用贝叶斯定理【16】:

p ( c c a t e ∣ x θ ( x t , c s u b , t ) ) = C t ⋅ p ( x θ ( x t , c s u b , t ) ∣ x t , c c a t e ) p ( x θ ( x t , c s u b , t ) ∣ x t ) p(c_{cate} | x_\theta(x_t, c_{sub}, t)) = C_t \cdot \frac{p(x_\theta(x_t, c_{sub}, t) | x_t, c_{cate})}{p(x_\theta(x_t, c_{sub}, t) | x_t)} p(ccatexθ(xt,csub,t))=Ctp(xθ(xt,csub,t)xt)p(xθ(xt,csub,t)xt,ccate)

其中 C t = p ( c c a t e ∣ x t ) C_t = p(c_{cate} | x_t) Ct=p(ccatext) t − 1 t-1 t1无关,因此在反向传播中可以忽略。在Stable Diffusion【3】中,相邻步骤(即 t − 1 t-1 t1 t t t)的预测被设计为条件高斯分布:

p ( x t − 1 ∣ x t , c ) ∼ N ( x t − 1 ; x θ ( x t , c , t ) , σ t 2 I ) ∝ exp ⁡ ( − ∣ ∣ x t − 1 − x θ ( x t , c , t ) ∣ ∣ 2 / 2 σ t 2 ) p(x_{t-1} | x_t, c) \sim N(x_{t-1}; x_\theta(x_t, c, t), \sigma^2_t I) \propto \exp(-||x_{t-1} - x_\theta(x_t, c, t)||^2 / 2\sigma^2_t) p(xt1xt,c)N(xt1;xθ(xt,c,t),σt2I)exp(∣∣xt1xθ(xt,c,t)2/2σt2)

其中均值是步骤 t t t处的预测,标准差是 t t t的函数。从公式5和6,我们可以将公式4转换为可计算的形式:

L s u d e = 1 2 σ t 2 [ ∣ ∣ x θ ( x t , c s u b , t ) − x θ ‾ ( x t , c c a t e , t ) ∣ ∣ 2 − ∣ ∣ x θ ( x t , c s u b , t ) − x θ ‾ ( x t , t ) ∣ ∣ 2 ] L_{sude} = \frac{1}{2\sigma^2_t} [||x_\theta(x_t, c_{sub}, t) - \overline{x_\theta}(x_t, c_{cate}, t)||^2 - ||x_\theta(x_t, c_{sub}, t) - \overline{x_\theta}(x_t, t)||^2] Lsude=2σt21[∣∣xθ(xt,csub,t)xθ(xt,ccate,t)2∣∣xθ(xt,csub,t)xθ(xt,t)2]

其中 x θ ‾ ( x t , c c a t e , t ) \overline{x_\theta}(x_t, c_{cate}, t) xθ(xt,ccate,t)是条件 c c a t e c_{cate} ccate的预测, x θ ‾ ( x t , t ) \overline{x_\theta}(x_t, t) xθ(xt,t)是无条件预测。 θ ‾ \overline{\theta} θ表示训练中分离,表明只有 x θ ( x t , c s u b , t ) x_\theta(x_t, c_{sub}, t) xθ(xt,csub,t)是梯度可传递的,而 x θ ‾ ( x t , c c a t e , t ) \overline{x_\theta}(x_t, c_{cate}, t) xθ(xt,ccate,t) x θ ‾ ( x t , t ) \overline{x_\theta}(x_t, t) xθ(xt,t)的梯度被截断。这是因为它们是我们要保留的预训练模型中的先验。

3.2.2 损失截断

优化方程(4)会导致 p ( c c a t e ∣ x θ ( x t − 1 , c s u b , t ) ) p(c_{cate} | x_{\theta}(x_{t-1}, c_{sub}, t)) p(ccatexθ(xt1,csub,t))增加至接近1。然而,这个项表示在步骤 t − 1 t-1 t1时噪声图像的分类概率。由于噪声的影响,它不应接近1。因此,我们提出提供一个阈值来截断 L s u d e L_{sude} Lsude。具体来说,对于基于 c c a t e c_{cate} ccate生成的图像,其属于 c c a t e c_{cate} ccate的概率可以用作参考。这表示在步骤 t − 1 t-1 t1时噪声图像的适当分类概率。因此,我们使用该概率的负对数似然作为阈值 τ \tau τ,它可以通过将 c s u b c_{sub} csub替换为 c c a t e c_{cate} ccate来计算,如公式(7)所示:

τ t = − log ⁡ [ p ( c c a t e ∣ x θ ( x t , c c a t e , t ) ) ] = − 1 2 σ t 2 ∣ ∣ x θ ‾ ( x t , c c a t e , t ) − x θ ‾ ( x t , t ) ∣ ∣ 2 \tau_t = -\log[p(c_{cate} | x_{\theta}(x_t, c_{cate}, t))] = -\frac{1}{2\sigma_t^2} ||\overline{x_{\theta}}(x_t, c_{cate}, t) - \overline{x_{\theta}}(x_t, t)||^2 τt=log[p(ccatexθ(xt,ccate,t))]=2σt21∣∣xθ(xt,ccate,t)xθ(xt,t)2
(8)

公式(8)表示在步骤 t t t L s u d e L_{sude} Lsude的下界。当损失值小于或等于 L s u d e L_{sude} Lsude时,优化应停止。因此,我们截断 L s u d e L_{sude} Lsude如下:

L s u d e = λ τ ⋅ L s u d e , λ τ = { 0 , 如果   L s u d e ≤ τ t 1 , 否则 L_{sude} = \lambda_{\tau} \cdot L_{sude}, \quad \lambda_{\tau} = \begin{cases} 0, & \text{如果} \, L_{sude} \leq \tau_t \\ 1, & \text{否则} \end{cases} Lsude=λτLsude,λτ={0,1,如果Lsudeτt否则
(9)

在实践中,这种截断对于保持训练稳定性非常重要。详细信息见第5.4.2节。

3.3 总体优化目标

我们的方法仅引入了一个新的损失函数 L s u d e L_{sude} Lsude,因此可以方便地以即插即用的方式嵌入现有的流程中:

L = E x , c , ϵ , t [ L s u b + w s L s u d e + w r L r e g ] L = \mathbb{E}_{x, c, \epsilon, t} [L_{sub} + w_s L_{sude} + w_r L_{reg}] L=Ex,c,ϵ,t[Lsub+wsLsude+wrLreg]
(10)

其中, L s u b L_{sub} Lsub是用于学习主体私有属性的重构损失,如公式(3)所述。 L r e g L_{reg} Lreg是通常用于防止模型过拟合主体示例的正则化损失。通常,它与 c s u b c_{sub} csub无关,并在各种基线中有灵活的定义【14, 30】。 w s w_s ws w r w_r wr用于控制损失权重。在实践中,我们保持 L s u b L_{sub} Lsub L r e g L_{reg} Lreg与基线一致,仅通过添加我们的 L s u d e L_{sude} Lsude来改变训练过程。

4. 理论分析

这里我们分析SuDe的有效性,因为它建模了 p ( x t − 1 ∣ x t , c s u b , c c a t e ) p(x_{t-1} | x_t, c_{sub}, c_{cate}) p(xt1xt,csub,ccate)。根据公式(3),(4)和DDPM【15】,我们可以表达 L s u b L_{sub} Lsub L s u d e L_{sude} Lsude如下:

L s u b = − log ⁡ [ p ( x t − 1 ∣ x t , c s u b ) ] L s u d e = − log ⁡ [ p ( c c a t e ∣ x t − 1 , c s u b ) ] L_{sub} = -\log[p(x_{t-1} | x_t, c_{sub})] \\ L_{sude} = -\log[p(c_{cate} | x_{t-1}, c_{sub})] Lsub=log[p(xt1xt,csub)]Lsude=log[p(ccatext1,csub)]
(11)

这里我们首先简化 w s w_s ws为1以便于理解:

L s u b + L s u d e = − log ⁡ [ p ( x t − 1 ∣ x t , c s u b ) ⋅ p ( c c a t e ∣ x t − 1 , c s u b ) ] = − log ⁡ [ p ( x t − 1 ∣ x t , c s u b , c c a t e ) ⋅ p ( c c a t e ∣ x t , c s u b ) ] = − log ⁡ [ p ( x t − 1 ∣ x t , c s u b , c c a t e ) ] + S t L_{sub} + L_{sude} = -\log[p(x_{t-1} | x_t, c_{sub}) \cdot p(c_{cate} | x_{t-1}, c_{sub})] = -\log[p(x_{t-1} | x_t, c_{sub}, c_{cate}) \cdot p(c_{cate} | x_t, c_{sub})] = -\log[p(x_{t-1} | x_t, c_{sub}, c_{cate})] + S_t Lsub+Lsude=log[p(xt1xt,csub)p(ccatext1,csub)]=log[p(xt1xt,csub,ccate)p(ccatext,csub)]=log[p(xt1xt,csub,ccate)]+St
(12)

其中, S t = − log ⁡ [ p ( c c a t e ∣ x t , c s u b ) ] S_t = -\log[p(c_{cate} | x_t, c_{sub})] St=log[p(ccatext,csub)] t − 1 t-1 t1无关。从公式(12)可以看出,我们的方法建模了 p ( x t − 1 ∣ x t , c s u b , c c a t e ) p(x_{t-1} | x_t, c_{sub}, c_{cate}) p(xt1xt,csub,ccate)的分布,该分布同时以 c s u b c_{sub} csub c c a t e c_{cate} ccate为条件,因此可以生成具有来自 c s u b c_{sub} csub的私有属性和来自 c c a t e c_{cate} ccate的公共属性的图像。

在实践中, w s w_s ws是各种基线上的变化超参数。这不会改变上述结论,因为:

w s ⋅ L s u d e = − log ⁡ [ p w s ( c c a t e ∣ x t − 1 , c s u b ) ] p w s ( c c a t e ∣ x t − 1 , c s u b ) ∝ p ( c c a t e ∣ x t − 1 , c s u b ) w_s \cdot L_{sude} = -\log[p_{w_s}(c_{cate} | x_{t-1}, c_{sub})] \\ p_{w_s}(c_{cate} | x_{t-1}, c_{sub}) \propto p(c_{cate} | x_{t-1}, c_{sub}) wsLsude=log[pws(ccatext1,csub)]pws(ccatext1,csub)p(ccatext1,csub)
(13)

其中 a ∝ b a \propto b ab表示 a a a b b b正相关。基于公式(13),我们可以看出 L s u b + w s L s u d e L_{sub} + w_s L_{sude} Lsub+wsLsude − log ⁡ [ p ( x t − 1 ∣ x t , c s u b , c c a t e ) ] -\log[p(x_{t-1} | x_t, c_{sub}, c_{cate})] log[p(xt1xt,csub,ccate)]正相关。这意味着,当 w s w_s ws不等于1时,优化我们的 L s u d e L_{sude} Lsude L s u b L_{sub} Lsub仍然可以增加 p ( x t − 1 ∣ x t , c s u b , c c a t e ) p(x_{t-1} | x_t, c_{sub}, c_{cate}) p(xt1xt,csub,ccate)

5. 实验

5.1 实现细节

框架:我们在三个精心设计的框架上评估了SuDe的即插即用效果:DreamBooth【30】、Custom Diffusion【18】和ViCo【14】,使用了两个主干网络,Stable-diffusion v1.4(SD-v1.4)和Stable-diffusion v1.5(SD-v1.5)【3】。在实践中,我们保持所有基线的设计和超参数不变,仅在训练损失中添加我们的 L s u d e L_{sude} Lsude。对于超参数 w s w_s ws,由于这些基线有不同的训练范式(如可优化参数、学习率等),很难找到适用于所有基线的固定 w s w_s ws。我们在DreamBooth上设定为0.4,在ViCo上设定为1.5,在Custom Diffusion上设定为2.0。需要注意的是,用户可以根据不同的主体在实际应用中调整 w s w_s ws。这只需付出很小的代价,因为我们的SuDe是一个测试时调优基线的插件,具有高效性(如在单个3090 GPU上对ViCo的调优约7分钟)。

数据集:在定量实验中,我们使用了DreamBooth【30】提供的DreamBench数据集,该数据集包含来自15个类别的30个主体,每个主体有5个示例图像。由于我们专注于单次定制,这里我们在所有实验中只使用一个示例图像(编号为’00.jpg’)。在先前的工作中,他们收集的大多数提示与属性无关,如‘在沙滩/雪/森林中的{S*}照片’,仅改变图像背景。为了更好地研究我们方法的有效性,我们为每个主体收集了5个与属性相关的提示。示例如‘奔跑的{S*}照片’(对于狗),‘燃烧的{S*}照片’(对于蜡烛)。此外,各种基线有其独特的提示模板。具体来说,对于ViCo,其模板是‘{S*}的照片’,而对于DreamBooth和Custom Diffusion,模板是‘{S*} [类别]的照片’。在实践中,我们使用各种基线的默认模板。在本文中,为了方便书写,我们统一记录{S*}和{S*} [类别]为{S*}。此外,我们还在附录中展示了其他定性示例,这些示例收集自Unsplash【1】。

指标:对于主体驱动的生成任务,有两个重要方面是主体保真度和文本对齐度。对于第一个方面,我们参考先前的工作,使用DINO-I和CLIP-I作为指标。它们是生成图像和真实图像的DINO【5】(或CLIP【24】)嵌入的平均成对余弦相似度。如【14, 30】所述,DINO-I比CLIP-I更能反映保真度,因为DINO可以捕捉同一类别中主体的差异。对于第二个方面,我们参考先前的工作,使用CLIP-T作为指标,这是提示和生成图像的CLIP【24】嵌入的平均余弦相似度。此外,我们提出了一个新指标来评估属性的文本对齐度,简称为属性对齐度。这不能通过CLIP-T反映,因为CLIP仅在分类级别上粗略训练,对动作和材料等属性不敏感。具体来说,我们

使用BLIP-T,这是提示和生成图像的BLIP【19】嵌入的平均余弦相似度。由于BLIP被训练用于处理图像描述任务,因此它能更好地衡量属性对齐度。

在这里插入图片描述
在这里插入图片描述

5.2. 定性结果

这里,我们在图3中可视化了在三种基线上有无我们方法生成的图像。

属性对齐

定性上,我们看到使用我们的SuDe方法生成的图像在属性相关文本上对齐得更好。例如,在第1行,Custom Diffusion不能让狗玩球;在第2行,DreamBooth不能让卡通人物跑步;在第3行,ViCo不能给茶壶一个金色的材质。相比之下,结合了我们的SuDe后,他们的生成可以很好地反映这些属性。这是因为我们的SuDe帮助每个主体继承了其语义类别中的公共属性。

图像保真度

此外,我们的方法在生成富含属性的图像时仍能保持主体的保真度。例如,在第1行,使用SuDe生成的狗的姿势与示例图像非常不同,但我们仍然可以确定它们是同一只狗,因为它们具有私有属性,例如金色的毛发、面部特征等。

5.3. 定量结果

这里我们定量验证了第5.2节中的结论。如表1所示,我们的SuDe在属性对齐上取得了稳定的提升,即在SD-v1.4和SD-v1.5下,BLIP-T在ViCo上分别提高了4.2%和2.6%,在Custom Diffusion上提高了0.9%和2.0%,在DreamBooth上提高了1.2%和1.5%。此外,我们还展示了一个灵活的 w s w_s ws (在[0.5, 1.0, 2.0] · w s w_s ws中选取的最佳结果)标记的性能。我们看到这种低成本调整可以进一步扩大提升,即在SD-v1.4和SD-v1.5下,BLIP-T在ViCo上分别提高了5.3%和3.9%,在Custom Diffusion上提高了1.1%和2.3%,在DreamBooth上提高了3.2%和2.0%。关于 w s w_s ws 的更多分析在第5.4.1节中。对于主体保真度,SuDe只对基线的DINO-I带来了轻微波动,表明我们的方法不会牺牲主体保真度。

5.4. 经验研究

5.4.1 训练权重 w s w_s ws

w s w_s ws 影响 L s u d e L_{sude} Lsude 的权重比例。我们在图4中可视化了不同 w s w_s ws 下生成的图像,通过这些图像我们可以总结出:1)随着 w s w_s ws 的增加,主体(例如,茶壶)可以更全面地继承公共属性(例如,清晰)。在适当范围内(例如,茶壶的[0.5, 2] · w s w_s ws),可以很好地保持主体的保真度。但 w s w_s ws 过大导致我们的模型失去主体保真度(例如,碗的4 · w s w_s ws),因为它稀释了学习私有属性的 L s u b L_{sub} Lsub。2)对于属性简单的主体(例如,碗),较小的 w s w_s ws 更合适,而对于属性复杂的主体(例如,狗),较大的 w s w_s ws 更合适。另一个有趣的现象是,图4第1行中,基线生成的图像中有浆果,而我们的SuDe没有。这是因为尽管浆果出现在示例中,但它不是碗的属性,因此没有被我们派生的类别建模捕获。此外,在第5.4.3节中,我们展示了我们的方法还可以通过提示结合属性相关和属性无关的生成,用户可以进行诸如“带有樱桃的金属{S∗}照片”这样的定制。

5.4.2 损失截断消融

在第3.2.2节中,设计损失截断是为了防止 p ( c c a t e ∣ x θ ( x t , c s u b , t ) ) p(c_{cate}|x_{\theta}(x_t,c_{sub},t)) p(ccatexθ(xt,csub,t)) 过度优化。这里我们验证了这种截断对于防止训练崩溃的重要性。如图5所示,没有截断的情况下,生成在第2轮展示出失真,并在第3轮完全崩溃。这是因为过度优化 p ( c c a t e ∣ x θ ( x t , c s u b , t ) ) p(c_{cate}|x_{\theta}(x_t,c_{sub},t)) p(ccatexθ(xt,csub,t)) 使噪声图像具有过高的分类概率。一个极端的例子是将纯噪声分类为某一类别的概率为1。这破坏了预训练扩散模型的语义空间,导致生成崩溃。

5.4.3 结合属性无关的提示

在以上章节中,我们主要展示了我们SuDe在属性相关生成方面的优势。这里我们展示了我们的方法的优势也可以结合属性无关的提示进行更具创意的定制。如图6所示,我们的方法可以和谐地生成图像,例如,在各种背景下跑步的{S ∗ }(狗)、在各种背景下燃烧的{S ∗ }(蜡烛)、以及带有各种水果的{S ∗ }金属(碗)。

5.4.4 与类别图像正则化的比较

在现有的主体驱动生成方法中【14, 18, 30】,如公式10所述,通常使用一个正则化项 L r e g L_{reg} Lreg 来防止模型过拟合到主体示例。这里我们讨论 L r e g L_{reg} Lreg 和我们的 L s u d e L_{sude} Lsude 的角色差异。以DreamBooth中的类别图像正则化为例,定义如下:
L r e g = ∣ ∣ x θ ˉ p r ( x t , c c a t e , t ) − x θ ( x t , c c a t e , t ) ∣ ∣ 2 , L_{reg} = ||x_{\bar{\theta}_{pr}}(x_t,c_{cate},t) - x_{\theta}(x_t,c_{cate},t)||^2, Lreg=∣∣xθˉpr(xt,ccate,t)xθ(xt,ccate,t)2,
其中 x θ ˉ p r x_{\bar{\theta}_{pr}} xθˉpr 是冻结的预训练扩散模型。可以看出,公式14在主体驱动微调前后,通过 c c a t e c_{cate} ccate 条件生成保持一致。视觉上,根据图8,我们发现 L r e g L_{reg} Lreg 主要有利于背景编辑。但它只使用‘类别提示’( c c a t e c_{cate} ccate)单独进行,忽略了 c s u b c_{sub} csub c c a t e c_{cate} ccate 之间的联系建模。因此,它不能像我们的SuDe那样有利于属性编辑。

5.4.5 与修改提示的比较

本质上,我们的SuDe通过其类别的公共属性丰富了主体的概念。一种简单的替代方法是同时在文本提示中提供主体标记和类别标记,例如“{S ∗ }[category]的照片”,这已经在DreamBooth【30】和Custom Diffusion【18】基线中使用了。上述对这两个基线的比较表明,这种提示无法很好地解决属性缺失问题。这里我们进一步在ViCo基线上评估其他提示模板的性能,因为其默认提示仅包含主体标记。具体来说,我们验证了三个提示模板:P1:“[attribute] {S ∗ } [category]的照片”;P2:“[attribute] {S ∗ }的照片,并且是[category]”;P3:“{S ∗ }的照片,并且是[attribute] [category]”。参考提示学习中的工作【20, 23, 33, 35】,我们在这些模板中保留了触发词结构,即在主体驱动微调中使用的“{S ∗ }的照片”形式。

如表2所示,一个好的提示模板可以部分缓解这个问题,例如,P3的BLIP-T为41.2。但是,仍然有一些属性无法通过修改提示来补充,例如在图7中,P1到P3无法让狗“张开嘴”。这是因为它们只是在提示中放入了主体和类别,但忽略了像我们SuDe一样建模它们的关系。此外,我们的方法也可以在这些提示模板上工作,如表2所示,SuDe进一步改善了所有提示模板超过1.5%。

6. 结论

本文创造性地将主体驱动生成建模为构建一个派生类。具体来说,我们提出了主体派生正则化(SuDe),使主体从其语义类别中继承公共属性,同时从主体示例中学习其私有属性。作为一个即插即用的方法,我们的SuDe可以方便地结合现有基线并改进属性相关的生成。我们的SuDe面对最具挑战性但也是最有价值的一次性场景,可以生成富有想象力的定制,展示了有吸引力的应用前景。

更广泛的影响

主体驱动生成是一个新兴应用,目前的大多数工作集中在使用属性无关提示进行图像定制。但可以预见且有价值的场景是进行用户提供图像的多模式定制,其中属性相关生成将被广泛需要。本文提出的建模方法将主体构建为其语义类别的派生类,能够进行良好的属性相关生成,从而为未来的主体驱动应用提供了一个有前途的解决方案。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Stable Diffusion - 光影魔法,SD中的光影控制(附模型)

今天继续分享SD中光影控制的运用和效果。 光影控制体验 — 这次介绍的光影控制效果如下: autumn lights:秋天光景,街景与人物服装也会变成秋装 spring lights:春天光景,街景与人物服装也会变成春装 summer lights…

【Python爬虫教程】第7篇-requests模块的cookies保存和使用

文章目录 为什么要保存cookiesrequests.utils工具类保存cookies到本地文件从本地文件解析cookies使用使用实践 为什么要保存cookies 保存cookies是避免每次都登录获取权限,一遍权限是有过期时间的,不需要每次重复登录,可以将cookies保存起来…

招聘难怎么破?这38个面试问题,助你精准筛选出适用人才!

对于专门负责招聘工作的人员来说,每天都有很多很多面试要应对,但你还不能敷衍,因为不能高效地挑选出合适的人才,你的招聘目标就没办法完成了。精准筛选你所需要的人才,跟面试官面试的时候提出的问题有很大关系。因为好…

29.【C语言】自定义函数

1、自定义详解 *提示&#xff1a;先看第12,19篇 例&#xff1a;写一个程序交换两个变量的值 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> void swap(int x, int y) {int z 0;z x;x y;y z; } int main() {int a 10;int b 20;swap(a, b);printf("%d…

【算法消费者行为】算法性能预期如何增强冲动性购买?—推文分享—2024-07-16

今天的推文主题是&#xff1a;【算法&消费者行为】 第一篇&#xff1a;如何通过管理多种刺激来优化客户体验&#xff1f;购买行为的驱动因素是隐性还是显性的消费者态度&#xff1f;第二篇&#xff1a;算法性能期望如何增强在线零售中的即兴购买行为。第三篇&#xff1a;社…

详解linux驱动框架(开篇)

该系列博客只是个人记录&#xff0c;笔者本人也是菜鸟&#xff0c;如果出现大量错误&#xff0c;欢迎留言评论&#xff0c;请不要进行人身攻击等行为。 让我们先从drivers/input/input.c入手&#xff0c;让我们想一想&#xff0c;当我们modprobe input1.ko时&#xff0c;内核会…

JuiceFS、Ceph 和 MinIO 结合使用

1. 流程图 将 JuiceFS、Ceph 和 MinIO 结合使用&#xff0c;可以充分利用 Ceph 的分布式存储能力、JuiceFS 的高性能文件系统特性&#xff0c;以及 MinIO 提供的对象存储接口。以下是一个方案&#xff0c;介绍如何配置和部署 JuiceFS 使用 Ceph 作为其底层存储&#xff0c;并通…

量化投资基础(三)之Fama-French 三因子模型(2)

点赞、关注&#xff0c;养成良好习惯 Life is short, U need Python 量化投资基础系列&#xff0c;不断更新中 1. 前言 Sharp&#xff08;1964&#xff09;&#xff0c;Lintner&#xff08;1965&#xff09;&#xff0c;Black&#xff08;1972&#xff09;的资本资产定价模型&…

【异常解决】Unable to start embedded Tomcat Nacos 启动报错

Unable to start embedded Tomcat Nacos 启动报错解决方案 一、背景描述二、原因分析三、解决方案 一、背景描述 Windows 本地启动 Nacos&#xff08;2.2.0&#xff09; 服务&#xff0c;控制台报错 Unable to start embedded Tomcat。 报错信息&#xff1a;Unable to start …

解决UniGUI中动态创建控件时,控件不按序显示的问题。

这两天遇到一个问题&#xff1a;我在UNIGUI中多批次动态创建控件&#xff0c;但是这些控件在显示时并没有按我想要的顺序排列。比如动态创建UnimContainerPanel面板&#xff0c;这个面板上放一些其它控件用于显示数据。在手机中从上到下按顺序显示出来&#xff0c;当第一批次时…

LabVIEW工业设备姿态监测系统

开发了一种基于LabVIEW的工业设备姿态监测系统&#xff0c;针对现有监测设备在适应性和反应时间上的不足&#xff0c;采用了LabVIEW软件和STM32微控制器&#xff0c;通过高精度姿态传感器实现了对设备姿态的快速准确监测&#xff0c;大大提高了工业作业的安全与效率。 项目背景…

Unable to obtain driver using Selenium Manager: Selenium Manager failed解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

jmeter-beanshell学习10-字符串补齐位数

每天都遇到新问题&#xff0c;今天又一个场景&#xff0c;一个字符串&#xff0c;如果不足11位&#xff0c;则左边补0&#xff0c;补够11位。 先要获取字符串长度&#xff0c;然后计算差多少位&#xff0c;补齐。今天又发现一个Object类型&#xff0c;这个类型有点厉害&#x…

【持续集成_05课_Linux部署SonarQube及结合开发项目部署】

一、Linux下安装SonarQube 1、安装sonarQube 前置条件&#xff1a;sonarQube不能使用root账号进行启动&#xff0c;所以需要创建普通用户及 其用户组 1&#xff09;创建组 2&#xff09;添加用户、组名、密码 3&#xff09;CMD上传qube文件-不能传到home路径下哦 4&#xff09…

探索Nuxt.js的useFetch:高效数据获取与处理指南

title: 探索Nuxt.js的useFetch&#xff1a;高效数据获取与处理指南 date: 2024/7/15 updated: 2024/7/15 author: cmdragon excerpt: 摘要&#xff1a;“探索Nuxt.js的useFetch&#xff1a;高效数据获取与处理指南”详述了Nuxt.js中useFetch函数的使用&#xff0c;包括基本用…

【前端4】表单 编辑模式、只读模式:HTML的`readonly`、el-input的v-if=“isEdit“

【前端】表单 编辑模式、只读模式 写在最前面一、什么是编辑模式与只读模式&#xff1f;应用场景编辑模式只读模式 二、编辑模式的实现例子只读模式的实现动态切换模式使用HTML的readonly属性使用Vue.js的v-if指令 三、前后端交互 <template>代码块两个字段独立是否直接与…

bash: ip: command not found

输入&#xff1a; ip addr 报错&#xff1a; bash: ip: command not found 报错解释&#xff1a; 这个错误表明在Docker容器中尝试执行ip addr命令时&#xff0c;找不到ip命令。这通常意味着iproute2包没有在容器的Linux发行版中安装或者没有正确地设置在容器的环境变量PA…

HackQuest介绍 web3 学习平台

HackQuest 官网地址&#xff1a; https://www.hackquest.io/zh HackQuest是一个专注于Web3技术教育的在线学习平台&#xff0c;旨在帮助全球开发者掌握区块链、加密货币和去中心化应用&#xff08;DApps&#xff09;领域的最新技能。该平台汇聚了超过14000名活跃开发者&#…

PyMongo Sort 操作:提升你的数据查询效率

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

通过Bugly上报的日志查找崩溃闪退原因

第一步&#xff0c;解析堆栈信息 在bugly上收集到的信息是这样的 0x000000010542e46c 0x0000000104db4000 6792300 OS应用发生崩溃时&#xff0c;系统会生成一份崩溃日志&#xff0c;这份日志中包含了崩溃时的堆栈信息&#xff0c;但这些堆栈信息并非直接指向源代码&#x…