My App

AnimateDiff: Animate Your Personalized Text-to-Image Diffusion Models without Specific Tuning

讲背景: stable diffuison, DreamBooth, LoRA的发展, T2I任务成本降低, 但是将motion dynamics添加到T2I模型做animation并不容易. 提出AnimateDiff, animation personalized通用框架, 可插拔模块.(这个摘要云里雾里的, 什么叫animate personalized, 还是有必要解释一下的. 根据已有知识, 它的贡献应该是为为T2I任务引入了时间层, 支持视频生成, 即原文提到的motion dynamics.)

AnimateDiff-intro

介绍

T2I模型让艺术家可以使用提示词创作视觉内容, LoRA, DreamBooth这样的技术, 可以让个人使用低算力小数据集微调改善视觉质量. 但是技术限制在静态图片, 生成动画在真实世界更有需求, 但是并不容易实现.

AnimateDiff的核心是一个即插即用的通用motion module, 训练分三个阶段, 根据经验这种概括很难理解, 详细在method章节再看.

评估用的hf和civitai上的模型, 发现沿时间轴的Transformer足以捕获运动先验, 可以无缝插入实现视频生成.

相关工作

Text-to-Image diffusion model. GLIDE引入文本条件; DALL-E2使用CLIP改善文本和image的对齐; Imagen结合大语言模型和级联结构达到逼真的效果; Stable Diffusion的VAE大大降低训练成本.

personalizing T2I models. 个性化可以高效运用T2Imodel的创造力, 最直接的方法是微调, 但是当微调数据集很小时会带来catastrophic forgetting. DearmBooth用了一个preservation使在小数据集上微调成为可能, LoRA引入了LoRA Layer, 只优化权重残差. DreamBooth, LoRA方法保持了原始T2I的特征空间, 该论文的采用了这种基于微调的方法.

Animating personalized T2Is. 相关工作不多, 大多数方法都是更新所有参数, 修改原始T2I的特征空间, 没法做个性化. 后面介绍了几篇论文在tuning-based 方法上的研究.

预备知识

关于Stable Diffusion和LoRA的, LoRA就是添加一个秩压缩矩阵, 在attention块中作为一个残差连接, 只优化添加的权重, 原结构参数freeze.

AnimateDiff

AnimateDiff-overview

Domain Adapter

使用Domain Adapter去缓解T2I训练数据和我们的视频训练数据直接的视觉分布gap. 基于这样一个观点, 视频质量要普遍比图片质量差, 这个gap会限制animation generation的质量.

他们的应对思路是"将领域信息适配到一个独立的网络中", 称作Domain Adapter.

用LoRA实现, 并把它插入T2I的self/cross attn层中, 如上图的图一. 在训练时, adapter起作用, 感知视频域的特征, 推理是把α\alpha设置为0, 看起来像一种防止过拟合的方法.

Q=WQz+AdapterLayer(z)=WQz+αABTzQ = W^Q z + \text{AdapterLayer}(z) = W^Q z + \alpha \cdot A B^{\mathrm{T}} z

Motion Module

为了在预训练T2I之上model motion动态信息, 需要解决两个问题: 1) 膨胀2D diffusion处理三维视频数据; 2) 在时间维度进行高效的信息交换.

Network Inflation. 对视频 xRb×c×f×h×wx \in \mathbb{R}^{b \times c \times f \times h \times w}, 相比图片多了一个维度f表示帧数, 我们的方法是reshape到b. 在做时间注意力时, 把h和wreshape到b. 他这里x的表示方式有点奇怪, 但是问题不大.

Module Design. 文中是这样表述的, x被reshape为长度为f的向量序列, {z1,z2,...,zf;ziR(b×h×w)×c}\{z_1, z_2, ..., z_f; z_i \in \mathbb{R}^{(b \times h \times w) \times c}\}, 这样做自注意力的时候就可以促进帧间的交互, 同时指出使用sinusoidal position encoding是必要的, 不然模型没法感知帧间顺序. 尾部加了个映射层, 使用零初始化.

Motion LoRA

这个是为其他人后续微调准备的, 像适应摄像机变焦、摇摄和平移等等. 直接看上面method的图吧, 没有什么其他信息.

AnimateDiff in Practice

训练. 他的核心思想还是在训练过程中, 将视频表示xRb×c×f×h×wx \in \mathbb{R}^{b \times c \times f \times h \times w} reshape为z1:f={z1,z2,...,zf;ziR(b×h×w)×c}z^{1:f}=\{z_1, z_2, ..., z_f; z_i \in \mathbb{R}^{(b \times h \times w) \times c}\}

推理. 没啥好讲的, Domain Adapter并没有直接删掉, 他们通过一个消融实验找到了一个更好的α\alpha值.

实验

我们先来回顾一下他的工作, 1) motion module, 本质是一个时间层, 捕获motion动态信息, T2I到T2V; 2)motionLoRA, 用户后续微调. 对于第一个工作, 他们在社区找了很多模型, 加上motion module后定性的查看效果, 还和其他相似论文的方法进行了比较, 但主要也是从定性的角度, 有一个定量的方法叫CLIP metric. 对于第二个工作, 他们尝试了zoom-in, rolling, zoom-out + rolling等不同的风格, 也是定性的一个方法.

实验用的数据集是WebVid10M, 消融实验比较了Domain Adapter(调整α\alpha的值), Motion Module(transformer/convolution), MotionLoRA(改变rank和训练数据N)

补充

后面是在可控生成方便的应用, 结论, 道德声明和可重复性声明跳过.

感受

高引论文, Moore Animate Anyone就是根据这篇论文作为codebase改的, 实验要着手做视频生成了, 想着无论如何要看一看.

在算力不是很充足, 用视频数据直接训练一个T2V很困难的背景下, 想到从预训练T2I微调达到animation generation的目的, 很赞, 文中提出的一些思想在后续CongVideoX这类视频生成模型中依然可以找到一些影子.

很有启发性的一篇文章, 很经典的"技术风格", 相信它提到的任务都做了, 也都写下来了, 代码也都开源了, 还很注重实践(乐, 本科毕设答辩评委对我说的原话), hf和civitai都在关注, 不讨厌只是感慨一下在当前评价体系下没有优势.

btw, 这是我第一次见到做微调是在channel dimension拼接的.

On this page