AnimateDiff
要点准备
视频生成依赖的技术点:Stable Diffusion,Latent Diffusion Model,DreamBooth, LoRA。此处不进行相关知识点介绍,如需请查阅相关资料
个性化动画生成
目标
生成个性化动画的图像模型,一般要求用对应的视频训练集进行额外的微调。而这将使事情变得困难。本文目标就是构建一个生成个性化的动画模型。更具体来说就是,给定一个已有的个性化T2I模型,比如一个DreamBooth或者LoRA模型参数检查点文件,将其转化为动画生成器。这个转化过程不进行训练或者进行很小的训练,但仍能保留模型原有的域知识和生成质量。比如T2I模型是针对某种类型2D动画风格进行优化训练,那么相应的动画生成器也能够生成具有适当运动的刚才风格的动画片段。
思路
一种实现路径,扩展T2I模型,通过添加时间感知的结构和从大规模的视频片段中学习合理的运动先验。然而对于特定的个性化场景,收集大量充足的视频是昂贵的,而有限的数据则无法学习到特定域知识。因此,才选择拆分为两部分:通用运动建模 + 个性化T2I生成。 这样就可以避免收集大量个性化的视频数据,而且不用修改个性T2I模型权重。而且通用运动建模完成,可以应用到任何个性化T2I模型。
运动建模模块
模块设计
原始SD模型仅处理批图片,尺寸为\(b \times c \times h \times w\),现在要处理视频即图片序列即多出一个维度,要处理批图片序列,尺寸为\(b \times c \times f \times h \times w\)。为了SD模型可以兼容这种数据,而且运动模块能够有效地进行视频帧之间的信息交互。运动模块采用普通的Temporal Transformer结构可以实现。输入特征\(z \in \mathbb R^{b \times c \times f \times h \times w}\),通过tensor reshape操作将特征\(z\)的\(h,w\)轴合并到\(b\)轴,得到\(z \in \mathbb R^{(b \times h \times w) \times f \times c}\)。这个类似\(b \times h \times w\)个token序列,每个token序列的长度是\(f\),token的特征维度是\(c\)。这样调整后的特征\(z\)就可以应用attention操作了。
这种操作可以在相同的空间位置处,沿着时间轴抓住不同视频帧之间的依赖关系。另一方面,为了扩大运动模块的感受野,在扩散模型U-Net模块中的每一个分辨率层级,都加入该运动模块。此外,还为视频帧添加了正余弦位置编码,从而使得动画片段每帧可以感知其在整个片段中的位置。
整体流程图如图Fig.1所示
Fig. 1损失函数
损失函数设计本质上与LDM是一致的,唯一区别是后者输入单张图片对应隐变量\(z_0\),前者输入是输入图片序列对应的隐变量序列\(z_0^{1:N}\)。详细理解可以参考[2]或者扩散模型 Diffusion Model
注解
注解1
SD模型训练输入的图片批次,其形状为\(b \times c \times h \times w\),进行attention建模是对同一张图片的不同空间位置关系进行的;而当前运动模块输入的批序列图片,其形状是\(b \times c \times f \times h \times w\) 而实际参与Temporal Transformer运算前,进行的reshape操作,变形为\({(b \times h \times w) \times f \times c}\),建模关系变成了相同空间位置不同视频帧之间的关系。这两种attention建模关系是完全不同的。为了融合这两种Transformer,对进入Temporal Transformer模块时进行上述reshape操作,输出时再进行相反的reshape操作,这样就可以解决这个问题了。可以从运动建模模块示意图Fig.2看出其中包含多次reshape操作。
Fig. 2参考
[1]. AnimateDiff: Animate Your Personalized Text-to-Image Diffusion Models without Specific Tuning.
[2]. Understanding Diffusion Models: A Unified Perspective.