AnimateDiff: Animate Your Personalized Text-to-Image Diffusion Models without Specific Tuning
代码:https://github.com/guoyww/animatediff/
论文:https://arxiv.org/abs/2307.04725
AnimateDiff 通过预训练的运动模块(motionmodule),直接将现有的个性化文本到图像 (T2I) 模型转换为相应的动画生成器,而无需进行特定于模型的调整。即将新初始化的运动建模模块插入到冻结的文本到图像模型中,并在视频剪辑上对其进行训练,以提炼出合理的运动先验。只需训练一次即可无缝集成到源自同一基础 T2I 的任何个性化 T2I 中。 经过训练后,运动模块可以插入个性化T2I模型中,形成个性化动画生成器。
MOTIVATION
文章的动机是要解决现有高质通过设置稀有字符串作为目标域标志的DreamBooth和LoRA)可以以较低成本将想象力转化为高质量图像,但是将动态运动添加到这些个性化T2I模型中,使其生成动画仍然是一个挑战。
CONTRIBUTION
提出了 AnimateDiff,这是一个实用的pipeline,无需进行特定的微调即可实现任何个性化 T2Is 的动画生成能力; 验证 Transformer 架构足以对运动先验进行建模,这为视频生成提供了宝贵的见解; 提出了MotionLoRA,一种轻量级微调技术,使预训练的运动模块适应新的运动模式; 用代表性社区模型全面评估animatediff,并将其与 Gen2 (2023) 和 Pika Labs (2023)等进行比较。RELATED WORKS
文生图模型
GLIDE[17]将文本条件引入扩散模型,并证明分类器引导产生更令人愉悦的结果 DALLE-2 [21] 通过 CLIP [19] 联合特征空间改进了文本-图像对齐 Imagen[25]结合了在文本语料库上预训练的大型语言模型[20]和级联扩散模型,以实现逼真的图像生成。 Stable Diffusion[22],即稳定扩散,提出在自动编码器的潜在空间中执行去噪过程,有效地减少所需的计算资源,同时保持生成图像的质量和灵活性。个性化的文生动画
Tune-a-Video [31] 通过轻微的架构修改和子网调优解决了一次性视频生成任务。 Text2Video-Zero [15] 引入了一种免训练方法,在给定预定义- 的仿射矩阵的情况下,通过潜在包装对预训练的 T2I 模型进行动画处理。 Align-Your-Latents [3],这是一种文本到视频 (T2V) 模型,可在 T2I 模型中训练单独的时间层。PRELIMINARY
Stable Diffusion
Stable Diffusion是本文选择作为基础文本到图像(T2I)模型的开源模型。它因其拥有一个发达的社区和许多高质量的个性化T2I模型而受到青睐。
工作原理:SD在预训练的自动编码器的潜在空间内执行扩散过程,使用编码器 E ( ⋅ ) E(\cdot) E(⋅)和解码器 D ( ⋅ ) D(\cdot) D(⋅)。 训练过程:在训练时,图像通过编码器转换为潜在表示 z 0 = E ( x 0 ) z_0 = E(x_0) z0=E(x0),然后通过前向扩散过程(forward process)逐渐加入噪声,生成 z t z_t zt。这个过程由预定义的 α ˉ t \bar{\alpha}_t αˉt控制每一步的噪声强度。 数学表达:前向扩散的数学公式为:z t = α ˉ t z 0 + 1 − α ˉ t ϵ , ϵ ∼ N ( 0 , I ) z_t = \sqrt{\bar{\alpha}_t} z_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon, \quad \epsilon \sim \mathcal{N}(0, I) zt=αˉt z0+1−αˉt ϵ,ϵ∼N(0,I) 去噪网络:去噪网络 ϵ θ ( ⋅ ) \epsilon_\theta(\cdot) ϵθ(⋅)学习逆转扩散过程,通过预测添加的噪声,并通过均方误差(MSE)损失函数来优化。 损失函数:MSE损失函数定义为:
L = E E ( x 0 ) , y , ϵ ∼ N ( 0 , I ) , t [ ∥ ϵ − ϵ θ ( z t , t , τ θ ( y ) ) ∥ 2 2 ] \mathcal{L} = \mathbb{E}_{\mathcal{E}(x_0), y, \epsilon \sim \mathcal{N}(0, I), t} \left[ \| \epsilon - \epsilon_\theta(z_t, t, \tau_\theta(y)) \|_2^2 \right] L=EE(x0),y,ϵ∼N(0,I),t[∥ϵ−ϵθ(zt,t,τθ(y))∥22] 网络结构:在SD中,去噪网络实现由UNet实现,包含四个分辨率级别的下采样(downsample)/上采样(upsample)块对以及一个中间块。每个网络块由ResNet、空间自注意力层和引入文本条件的交叉注意力层组成。
Low-Rank Adaptation (LoRA)
LoRA是一种加速大型模型微调的方法,最初用于语言模型的适应。以下是LoRA的关键点:
目的:LoRA旨在优化新引入的权重,而不是重新训练所有模型参数,以加快大型模型的微调过程。 原理:与传统的微调方法不同,LoRA不是重新训练模型的所有参数,而是引入新的参数——秩分解矩阵对,并且只优化这些新参数。LoRA限制了可训练参数的数量,同时保持原始权重不变,减少了灾难性遗忘的风险。 LoRA 对Stable Diffusion模型中最关键的部分进行微小改动:交叉注意力层。交叉注意力层的权重被排列成矩阵形式。 数学表达:引入LoRA后的模型权重更新为:W ′ = W + Δ W = W + A B T \mathcal{W}' = \mathcal{W} + \Delta \mathcal{W} = \mathcal{W} + AB^T W′=W+ΔW=W+ABT LoRA通过添加秩分解矩阵对A和B来实现,其中 A ∈ R m × r A \in \mathbb{R}^{m \times r} A∈Rm×r和 B ∈ R n × r B \in \mathbb{R}^{n \times r} B∈Rn×r, r r r是超参数,代表LoRA层的秩。 这些矩阵被视为预训练模型权重 W ∈ R m × n W \in \mathbb{R}^{m \times n} W∈Rm×n的残差,即通过 W ′ = W + A B T W' = W + AB^T W′=W+ABT更新模型权重。 只有新引入的矩阵A和B被优化,而原始的权重W保持不变(冻结)。
其中,A和B是秩分解矩阵对, r r r是超参数,表示LoRA层的秩。
METHODS-AnimateDiff
AnimateDiff的核心是一种用于训练即插即用运动模块(plug-and-play motion module)的方法,该模块学习来自于视频数据集的合理运动先验(motion priors)。在inference阶段,经训练的运动模块可以直接集成到个性化的T2I中,并且产生平滑的和视觉上吸引人的动画,而不需要特定的调整。通过训练 AnimateDiff 的三个组件(即域适配器、运动模块和 MotionLoRA)来实现这一目标。
Domain Adapter-使用域适配器减轻训练数据的负面影响
ALLEVIATE NEGATIVE EFFECTS FROM TRAINING DATA
公开可用的视频训练数据集由于收集困难,其视觉质量通常低于图像数据集。单独处理视频帧时,可能会遇到一些质量上的问题,这导致训练基础文本到图像(T2I)模型的高质量图像数据集与用于学习运动先验的目标视频数据集之间存在显著的质量域差异。这种质量差异可能会限制直接在原始视频数据上训练时动画生成pipeline的质量。
解决方案:领域适配器(Domain Adapter):
目的:为了避免运动模块学习到质量差异,同时保留基础T2I的知识,提出了一个独立的网络——Domain Adapter(to fit the domain information to a separate network)
实现:在推理时drop领域适配器,以减少上述域间差异造成的负面影响。
使用低秩适应(LoRA)技术实现领域适配器层,并将它们插入到基础T2I模型的self-/cross-attention layers。
公式表示:以查询投影( Q-projection)为例,内部特征Z经过投影后,通过领域适配器层的变换可以表示为:
Q
=
W
Q
z
+
AdapterLayer
(
z
)
=
W
Q
z
+
α
⋅
A
B
T
z
,
Q = \mathcal{W}^Q z + \text{AdapterLayer}(z) = \mathcal{W}^Q z + \alpha \cdot AB^T z, \quad
Q=WQz+AdapterLayer(z)=WQz+α⋅ABTz,
α = 1 \alpha = 1 α=1是一个标量,可以在推理时调整到其他值(设置为0可以完全移除领域适配器的效果)。
W Q \mathcal{W}^Q WQ:查询(Query)的权重矩阵,用于将内部特征( z )投影到查询空间。
z z z:内部特征向量,它是从视频帧或图像中提取的原始特征表示。
AdapterLayer ( z ) \text{AdapterLayer}(z) AdapterLayer(z):Domain Adapter对特征z的作用。这一层是为了调整特征,使其适应不同数据集之间的分布差异,与
A , B A,B A,B:这两个矩阵是LoRA(Low-Rank Adaptation)中的秩分解矩阵对。它们用于以低秩方式调整模型权重,从而减少训练参数的数量并避免灾难性遗忘。 A B T AB^T ABT代表了领域适配器层对特征z的调整量,通过低秩结构实现
优化目标:optimize only the parameters of the domain adapter on
static frames randomly sampled from video datasets with the same objective in
L
=
E
E
(
x
0
)
,
y
,
ϵ
∼
N
(
0
,
I
)
,
t
[
∥
ϵ
−
ϵ
θ
(
z
t
,
t
,
τ
θ
(
y
)
)
∥
2
2
]
\mathcal{L} = \mathbb{E}_{\mathcal{E}(x_0), y, \epsilon \sim \mathcal{N}(0, I), t} \left[ \| \epsilon - \epsilon_\theta(z_t, t, \tau_\theta(y)) \|_2^2 \right]
L=EE(x0),y,ϵ∼N(0,I),t[∥ϵ−ϵθ(zt,t,τθ(y))∥22]
damain adapter在训练阶段和推理阶段的应用
训练阶段(Training Phase): 目的:领域适配器在训练阶段的目的是调整模型,以适应视频数据集和图像数据集之间的视觉质量差异。由于视频数据集通常包含更多的噪声和较低的分辨率,领域适配器帮助模型学习如何从这些数据中提取有用的运动信息,同时忽略不相关的视觉伪影。 实现:通过在模型的自注意力或交叉注意力层中引入额外的参数(使用LoRA技术),领域适配器学习将视频帧的特征映射调整到与基础T2I模型训练时使用的特征空间。 推理阶段(Inference Phase): 灵活性:在推理阶段,领域适配器的使用是可选的,并且其贡献可以通过调整α值来控制。这种设计提供了灵活性,允许用户根据生成动画的特定需求来调整领域适配器的影响。 调整:如果用户希望生成的动画更加贴近原始T2I模型的风格,可以适当调整α值,使领域适配器对输出的影响减小。相反,如果用户希望动画更多地反映视频数据的特点,可以增加α值。MOTION MODULE——使用运动模块学习运动先决条件
为了在pre4-trained T2I 之上沿时间维度对运动动力学进行建模,必须:
膨胀(inflate) 2-dimensional diffusion以处理 3-dimensional video data 设计一个子模块(sub-module)以实现沿时间维度的有效信息交换。Network Inflation
基础T2I模型中的预训练图像层能够捕捉高质量的内容先验知识(high-quality con-tent priors)。为了更好的利用这些知识,网络膨胀的一个更好的方法是让这些图像层(image layers)独立处理视频帧(video frames)。
网络膨胀的方法:
通过修改模型结构,使其能够接受5D视频张量 x ∈ R b × c × f × h × w x \in \mathbb{R}^{b \times c \times f \times h \times w} x∈Rb×c×f×h×w作为输入。当内部特征图(internal feature maps)通过图像层(image layers)时,时间轴f通过重新整形为b轴而被忽略,从而允许网络独立处理每一帧。应用图像层处理后,再次将张量重塑回原始的5D形状,以便进行下一步的时间维度处理。
b:批处理轴(batch axis) c:通道数(channel) f:帧时间轴(frame-time axis),代表视频帧的序列 h 和w:帧的高度和宽度(spatial dimensions)motion module:newly inserted motion module ignores the spatial axis by reshaping h,w into b and then reshaping back after the module.
运动模块插入到预训练的图像层之间。当数据批处理通过图像层和我们的运动模块时,其时间和空间轴将分别重塑为批处理轴。 与上述不同的是,新插入的运动模块在每批中跨帧操作,以实现动画剪辑中的运动流畅性和内容一致性。sub-module design
在AnimateDiff框架中,模块设计部分的核心是以Transformer架构为基础并采用Transformer架构来创建一个专门处理时间维度(temporal axis)的运动模块,这个模块被称为“temporal Transformer”,通过实验发现这种设计足以对运动先验进行建模。
temporal Transformertemporal Transformer由多个自注意力块组成,这些块沿着时间轴排列,能够处理时间序列数据。
self-attention中增加正弦位置编码,使得网络关注当前帧时空位置
运动模块的输入是经过重塑的特征图(reshaped),其中空间维度(height和width)被合并到批处理轴中,得到长度为frames的batch * height * width序列,表示为 { z 1 , . . . , z f ; z i ∈ R ( b × h × w ) × c } \{z_1, ..., z_f; \, z_i \in \mathbb{R}^{(b \times h \times w) \times c}\} {z1,...,zf;zi∈R(b×h×w)×c}。
原本的5D视频张量被转换为一系列沿时间轴排列的向量。 重构后的特征图沿时间轴划分,形成长度为f的向量序列。每个向量 z i z_i zi包含了整个视频帧的所有信息,并且每个向量都对应于动画中的一个特定帧。然后向量将被投影并经过几个自注意力块。注意机制使得当前帧的生成能够合并来自其他帧的信息
z o u t = A t t e n t i o n ( Q , K , V ) = S o f t m a x ( Q K T / c ) ⋅ V z_{out}=\mathrm{Attention}(Q,K,V)=\mathrm{Softmax}(QK^{T}/\sqrt{c})\cdot V zout=Attention(Q,K,V)=Softmax(QKT/c )⋅V 使用motion module膨胀的T2 I模型不是单独生成每一帧,而是学习捕捉视觉内容随时间的变化,这些变化构成了动画剪辑中的运动动态 初始化为了避免附加模块可能引入的任何有害影响,我们对时间 Transformer 的输出投影层进行零初始化,并添加残差连接,以便运动模块在训练开始时是恒等映射 。
MOTIONLORA——适应新的运动模式
预训练的运动模块虽然能够捕捉一般性的运动先验,但在面对特定运动模式(如相机缩放、平移和翻滚等)时,需要进一步的调整。作为AnimateDiff的最后阶段,MotionLoRA提供了一种高效的微调方法,用于个性化运动效果。在运动模块的自注意力层中加入LoRA(Low-Rank Adaptation)层,这些层专门针对新运动模式的参考视频进行训练。
MotionLoRA的训练过程: 数据增强:通过基于规则的数据增强方法获取具有不同镜头类型的参考视频,例如通过逐渐缩小(放大)或扩大(缩小)视频帧的裁剪区域来实现变焦效果。 训练效率:MotionLoRA能够使用少量(20到50个)参考视频和少量(约2000次)训练迭代达到良好的效果,同时仅需要大约30M的存储空间。 MotionLoRA的优势:MotionLoRA的训练效率高,允许用户在有限的资源下快速调整模型以适应新的运动模式。由于LoRA的低秩特性,MotionLoRA还具有组合能力,即可以合并多个独立训练的MotionLoRA模型,在推理时实现复合运动效果。ANIMATEDIFF IN PRACTICE
training
视频数据批次 x 1 : f 0 ∈ R b × c × f × h × w x_{1:f}^0 \in \mathbb{R}^{b \times c \times f \times h \times w} x1:f0∈Rb×c×f×h×w 首先通过预训练的自动编码器进行逐帧编码,转换成潜在代码 z 1 : f 0 z_{1:f}^0 z1:f0。
潜在代码随后根据前向扩散计划添加噪声,生成噪声化的潜在代码 z t 1 : f = α ˉ t z 0 1 : f + 1 − α ˉ t ϵ 1 : f z_t^{1:f} = \sqrt{\bar{\alpha}_t} z_0^{1:f} + \sqrt{1 - \bar{\alpha}_t} \epsilon^{1:f} zt1:f=αˉt z01:f+1−αˉt ϵ1:f
膨胀模型输入噪声化的潜在代码和相应的文本提示,并预测需要添加的噪声。
运动模块的最终训练目标是通过最小化预测噪声和实际噪声之间的均方误差来实现的:
L
=
E
E
(
x
0
1
:
f
)
,
y
,
ϵ
1
:
f
∼
N
(
0
,
I
)
,
t
[
∥
ϵ
−
ϵ
θ
(
z
t
1
:
f
,
t
,
τ
θ
(
y
)
)
∥
2
2
]
\mathcal{L} = \mathbb{E}_{\mathcal{E}(x_0^{1:f}), y, \epsilon^{1:f} \sim \mathcal{N}(0, \mathit{I}), t} \left[ \| \epsilon - \epsilon_\theta(z_t^{1:f}, t, \tau_\theta(y)) \|_2^2 \right]
L=EE(x01:f),y,ϵ1:f∼N(0,I),t[∥ϵ−ϵθ(zt1:f,t,τθ(y))∥22]值得注意的是,在训练damain adapter、运动模块和 MotionLoRA 时,可训练部分之外的参数保持冻结状态。
inference
模型膨胀(Inflation):个性化T2I模型首先进行膨胀,以适应视频数据的维度。这通常涉及调整模型以处理多帧视频数据而不是单张图片。 注入运动模块:膨胀后的模型接着被注入运动模块,这个模块负责生成通用动画。它使得模型能够产生一系列动态帧,而不仅仅是静态图像。 可选的MotionLoRA注入:用户还可以选择注入MotionLoRA,这是一个微调步骤,允许模型适应特定的运动风格或模式,从而生成具有个性化运动的动画。 领域适配器的调整:领域适配器在训练阶段用于桥接预训练数据和视频训练数据之间的视觉质量差异。在推理阶段,领域适配器不是被丢弃,而是可以继续保留在模型中,并通过调整α值来控制其对最终输出的影响。这种调整允许模型在生成动画时更好地适应视频数据的特性。 α值的消融研究:通过实验进行消融研究,以确定α值的最佳设置。消融研究有助于理解领域适配器对动画生成质量的具体影响,以及如何平衡其贡献以避免潜在的负面影响。 反向扩散和解码:最终,通过执行反向扩散过程,模型可以逐步去除注入到潜在代码中的噪声,恢复出清晰的动画帧。这一步骤是前向扩散过程的逆操作,通常涉及迭代地预测并去除噪声,直到获得满意的动画帧。实验结果
实验设置(Experimental Setup): 实验在Stable Diffusion V1.5模型上实现AnimateDiff,并使用WebVid10M数据集训练运动模块。从Civitai等模型共享平台收集了一系列多样化的个性化T2I模型,用于评估。
总结