Animate Anyone 非官方实现
如果您觉得这个仓库有帮助,请考虑给我们一个星标⭐!
我们仅在小规模数据集(如TikTok、UBC)上进行训练,在数据规模和质量不足的情况下很难达到官方的结果。出于时间和成本的考虑,我们不打算收集和筛选大量高质量数据。如果有人拥有在大量高质量数据上训练的稳健模型并愿意分享,请提交拉取请求。
概述
作者
姓名 | 电子邮箱 | GitHub用户名 |
---|---|---|
郭钦 | guoqin@stu.pku.edu.cn | guoqincode |
这个仓库包含了Animate Anyone的一个简单非官方实现。本项目基于magic-animate和AnimateDiff构建。这个实现最初由郭钦开发,然后由王振智协助(用于训练)。
训练指南
虽然我们无法使用大规模数据来训练模型,但我们可以提供几个训练建议:
- 在我们的实验中,AnimateAnyone原论文中的poseguider很难控制姿势,无论我们使用什么激活函数(如ReLU、SiLU),但将输出通道扩大到320并在conv_in之后添加(如model.hack_poseguider)非常有效,同时与controlnet相比,这个解决方案更加轻量级(<1M参数 vs 400M参数)。但我们仍然认为Controlnet是一个不错的选择。Poseguider依赖于同时微调的unet,无法立即使用。即插即用。
- 在小规模数据集(少于2000个视频)中,第一阶段可以表现得很好(包括泛化),但第二阶段对数据量要求很高。当数据量较低时,容易出现伪影和闪烁。因为我们在第一阶段重新训练了unet,原始animatediff的检查点失去了效果,所以在这个阶段需要大量高质量数据集来重新训练animatediff的运动模块。
- 冻结unet不是一个好选择,因为它会丢失参考图像的纹理信息。
- 这是一个对数据要求很高的任务。我们认为扩大数据质量和规模通常比修改模型的微小结构更有价值。数据数量和质量非常重要!
- 高分辨率训练非常重要,它影响细节的学习和重建。训练分辨率不应大于推理分辨率。
UBC-fashion数据集上的结果示例
第一阶段
当前版本的面部仍有一些伪影。这个模型是在UBC数据集上训练的,而不是大规模数据集。 [图片省略]
第二阶段
由于背景中的伪影,第二阶段的训练具有挑战性。我们在此选择了我们最好的结果之一,并且仍在继续改进。一个重要的点是确保训练和推理分辨率一致。 [图片省略]
待办事项
- 发布训练代码。
- 发布推理代码。
- 发布非官方预训练权重。
- 发布Gradio演示。
环境要求
bash fast_env.sh
🎬Gradio演示
python3 -m demo.gradio_animate
对于13秒的姿势视频,在256分辨率下处理需要11G显存,在512分辨率下需要23.5G显存。
训练
原始AnimateAnyone架构(在小数据集上训练时很难控制姿势。)
第一阶段
torchrun --nnodes=8 --nproc_per_node=8 train.py --config configs/training/train_stage_1.yaml
第二阶段
torchrun --nnodes=8 --nproc_per_node=8 train.py --config configs/training/train_stage_2.yaml
我们的方法(更密集的姿势控制方案,参数数量仍然很小。)(强烈推荐)
torchrun --nnodes=8 --nproc_per_node=8 train_hack.py --config configs/training/train_stage_1.yaml
第二阶段
torchrun --nnodes=8 --nproc_per_node=8 train_hack.py --config configs/training/train_stage_2.yaml
致谢
特别感谢Animate Anyone项目的原作者以及magic-animate和AnimateDiff仓库的贡献者,他们的开放研究和基础工作启发了这个非官方实现。
电子邮箱
仅用于学术或商业合作:guoqin@stu.pku.edu.cn