视频编码
- 定义: 首先,将视频数据转换为一系列的潜变量代码(latent codes)。这是通过一个预训练的自动编码器(auto-encoder)来完成的。
- 操作: 对于每个视频帧,自动编码器将其转换成一个低维的潜变量代码。这些潜变量代码捕捉了视频帧的主要特征,并且在高维空间中表示视频帧的内容。
噪声添加
- 定义: 按照预定的扩散过程,在潜变量代码上添加噪声。这一过程模拟了图像退化的过程,即从清晰的图像逐渐变为噪声图像。
需要细化的部分:
- 视频编码:这一步是正确的,但值得强调的是,使用的是基础T2I模型(如Stable Diffusion)中预训练的自动编码器,而不是单独训练的编码器。
- 噪声添加:这里可以补充,噪声添加遵循预定义的前向扩散进度表,不同时间步的噪声强度是不同的。
- 预测噪声:运动模块不是独立工作的,而是作为扩展后的T2I模型的一部分。整个模型(包括基础T2I部分和运动模块)共同参与噪声预测过程。
- 固定权重:值得强调的是,在这个阶段,只有运动模块的权重是可训练的,而基础T2I模型和域适配器的权重是固定的。
运动模块 的输入和输出分别是什么?具体如何使用这个运动模块
- 运动模块的输入:
- 形状为 (b×h×w)×c×f 的特征图,其中: b: 批次大小 h, w: 空间维度(高度和宽度) c: 通道数 f: 帧数(时间维度)
- 位置编码:用于表示每一帧在时间序列中的位置
- 运动模块的输出:
- 与输入形状相同的特征图,但经过了时间维度上的信息交换和处理
- 运动模块的内部处理:
- 将输入重塑为 (b×h×w)×f×c 的形状,将空间维度合并到批次维度
- 通过自注意力机制处理时间维度上的信息
- 输出再次重塑回原始形状
- 如何使用运动模块: a. 模型扩展:
- 将原始的2D T2I模型扩展为能处理3D(时间+空间)数据的模型
- 在适当的位置插入运动模块,通常在每个分辨率级别的主要处理块之后
- 输入:文本提示和初始噪声(代表多帧)
- 逐步去噪:
- 在每一步,特征图通过扩展的T2I模型的各层
- 当特征图通过到达运动模块时:
- 运动模块处理时间维度上的信息
- 输出被传递到模型的下一层
- 这个过程重复多次,直到生成最终的无噪声潜在表示
- 最后通过解码器生成实际的视频帧
- 训练过程:
- 类似于推理,但包括反向传播来更新运动模块的权重
- 使用视频数据集,将视频帧编码为潜在表示
- 添加噪声,然后通过模型(包括运动模块)预测噪声
- 计算预测噪声与实际噪声之间的损失,并用于更新运动模块
在AnimateDiff的第三阶段训练中,主要目标是使预训练的motion module能够适应新的运动模式。这一阶段被称为MotionLoRA,它是一种轻量级的微调技术,允许模型快速适应特定的运动效果,如不同的镜头类型等,而不需要大量的参考视频或长时间的训练。
第三阶段训练概述
-
保持第二阶段权重不变:在第三阶段,motion module的权重(即第二阶段训练得到的权重)是固定的,不会被更新。这意味着前两个阶段学到的一般运动先验知识不会丢失。
-
引入MotionLoRA:在motion module的基础上,通过引入LoRA层(一种低秩适配方法)来进行微调。这些LoRA层被添加到motion module的自注意力层中,使得模型能够学习到特定的新运动模式。
-
微调MotionLoRA层:只对这些新增的LoRA层进行训练,而不是整个motion module。这样做的好处是可以高效地学习新运动模式,同时保留原有的通用运动能力。
第三阶段的具体步骤
-
准备少量参考视频:收集20至50个具有特定运动模式的参考视频,例如想要实现缩放效果的视频。
-
数据增强:通过规则性的数据增强技术来生成更多具有所需运动模式的视频。例如,为了获得缩放效果的视频,可以通过逐步缩小(缩放)或放大(缩放)视频帧的裁剪区域来创建这种效果。
-
训练MotionLoRA层:在这些参考视频上训练MotionLoRA层。训练的时间通常较短,大约需要2000次迭代(大约1到2小时)。这使得用户能够在较低的成本下快速调整模型以适应特定的运动模式。
-
存储空间:训练好的MotionLoRA模型额外占用大约30MB的存储空间。这不仅使得模型易于分享,也降低了用户的成本负担。
结论
在第三阶段中,AnimateDiff通过MotionLoRA技术使得预训练的motion module能够高效地适应新的运动模式,同时保持了第二阶段训练得到的motion module权重固定不变。这样既保证了模型能够学习到通用的运动模式,又能够快速地针对特定需求进行调整。