UniAnimate: 驯服统一视频扩散模型实现一致的人物图像动画
Xiang Wang1, Shiwei Zhang2, Changxin Gao1, Jiayu Wang2, Xiaoqiang Zhou3, Yingya Zhang2 , Luxin Yan1 , Nong Sang1
1华中科技大学 2阿里巴巴集团 3中国科学技术大学
UniAnimate生成的演示案例
🔥 新闻
- [2024/07/19] 🔥 我们在代码中添加了**噪声先验**(参考
tools/inferences/inference_unianimate_long_entrance.py
中第381行:noise = diffusion.q_sample(random_ref_frame.clone(), getattr(cfg, "noise_prior_value", 939), noise=noise)
),这可以帮助实现更好的外观保持(如背景),尤其是在长视频生成中。此外,如果我们从公司获得开源许可,我们考虑发布UniAnimate的升级版本。 - [2024/06/26] 对于具有大GPU内存的显卡,如A100 GPU,我们支持多段并行去噪以加速长视频推理。您可以在
configs/UniAnimate_infer_long.yaml
中将context_batch_size: 1
更改为大于1的其他值,如context_batch_size: 4
。推理速度将在一定程度上得到提高。 - [2024/06/15] 🔥🔥🔥 通过卸载CLIP和VAE并显式添加torch.float16(即在
configs/UniAnimate_infer.yaml
中设置CPU_CLIP_VAE: True
),GPU内存可以大大减少。现在生成32x768x512的视频片段只需要~12G GPU内存。更多详情请参考这个issue。感谢@blackight的贡献! - [2024/06/13] 🔥🔥🔥 我们发布了人物图像动画的代码和模型,尽情享受吧!
- [2024/06/13] 我们已将代码提交给公司审批,预计今天或明天发布代码。
- [2024/06/03] 我们初始化了这个github仓库,并计划发布论文。
待办事项
- 发布模型和推理代码,以及姿态对齐代码。
- 支持生成短视频和长视频。
- 发布用于一次性生成更长视频的模型。
- 发布基于VideoLCM的模型,以实现更快的视频合成。
- 在更高分辨率的视频上训练模型。
简介
UniAnimate的整体框架
最近基于扩散的人物图像动画技术在合成忠实跟随给定参考身份和一系列所需运动姿势的视频方面取得了令人印象深刻的成功。尽管如此,仍然存在两个限制:i) 需要额外的参考模型来将身份图像与主视频分支对齐,这显著增加了优化负担和模型参数;ii) 生成的视频通常时间较短(例如24帧),阻碍了实际应用。为了解决这些缺点,我们提出了UniAnimate框架,以实现高效和长期的人物视频生成。首先,为了减少优化难度并确保时间连贯性,我们通过结合统一的视频扩散模型,将参考图像与姿势指导和噪声视频映射到一个共同的特征空间。其次,我们提出了一个统一的噪声输入,支持随机噪声输入以及首帧条件输入,这增强了生成长期视频的能力。最后,为了进一步高效处理长序列,我们探索了基于状态空间模型的替代时间建模架构,以替代原来计算密集的时间Transformer。大量实验结果表明,UniAnimate在定量和定性评估中都实现了优于现有最先进对手的合成结果。值得注意的是,UniAnimate甚至可以通过迭代使用首帧条件策略生成高度一致的一分钟视频。
UniAnimate入门指南
(1) 安装
安装Python依赖:
git clone https://github.com/ali-vilab/UniAnimate.git
cd UniAnimate
conda create -n UniAnimate python=3.9
conda activate UniAnimate
conda install pytorch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 pytorch-cuda=11.8 -c pytorch -c nvidia
pip install -r requirements.txt
我们还在environment.yaml
中提供了所有依赖项。
注意:对于Windows操作系统,您可以参考这个issue来安装依赖项。感谢@zephirusgit的贡献。如果您遇到The shape of the 2D attn_mask is torch.Size([77, 77]), but should be (1, 1).
的问题,请参考这个issue来解决,感谢@Isi-dev的贡献。
(2) 下载预训练检查点
下载模型:
!pip install modelscope
from modelscope.hub.snapshot_download import snapshot_download
model_dir = snapshot_download('iic/unianimate', cache_dir='checkpoints/')
然后您可能需要以下命令将检查点移动到"checkpoints/"目录:
mv ./checkpoints/iic/unianimate/* ./checkpoints/
最后,模型权重将在./checkpoints/
中组织如下:
./checkpoints/
|---- dw-ll_ucoco_384.onnx
|---- open_clip_pytorch_model.bin
|---- unianimate_16f_32f_non_ema_223000.pth
|---- v2-1_512-ema-pruned.ckpt
└---- yolox_l.onnx
(3) 姿态对齐 (重要)
将目标姿态序列重新缩放以匹配参考图像的姿态:
# 参考图像 1
python run_align_pose.py --ref_name data/images/WOMEN-Blouses_Shirts-id_00004955-01_4_full.jpg --source_video_paths data/videos/source_video.mp4 --saved_pose_dir data/saved_pose/WOMEN-Blouses_Shirts-id_00004955-01_4_full
# 参考图像 2
python run_align_pose.py --ref_name data/images/musk.jpg --source_video_paths data/videos/source_video.mp4 --saved_pose_dir data/saved_pose/musk
# 参考图像 3
python run_align_pose.py --ref_name data/images/WOMEN-Blouses_Shirts-id_00005125-03_4_full.jpg --source_video_paths data/videos/source_video.mp4 --saved_pose_dir data/saved_pose/WOMEN-Blouses_Shirts-id_00005125-03_4_full
# 参考图像 4
python run_align_pose.py --ref_name data/images/IMG_20240514_104337.jpg --source_video_paths data/videos/source_video.mp4 --saved_pose_dir data/saved_pose/IMG_20240514_104337
我们已经在data/saved_pose
中提供了演示视频的处理后目标姿态,如果您运行我们的演示视频示例,可以跳过这一步。此外,您需要安装onnxruntime-gpu(pip install onnxruntime-gpu==1.13.1
)以在GPU上运行姿态对齐。
✔ 一些提示:
-
在姿态对齐中,目标姿态序列的第一帧用于计算对齐的比例系数。因此,如果目标姿态序列的第一帧包含完整的面部和姿态(手和脚),可以帮助获得更准确的估计和更好的视频生成结果。
(4) 运行UniAnimate模型生成视频
(4.1) 生成视频片段(32帧,768x512分辨率)
执行以下命令生成视频片段:
python inference.py --cfg configs/UniAnimate_infer.yaml
完成后,将生成32帧、768x512分辨率的视频片段:
✔ 一些提示:
-
运行模型时,将使用~12G
26GGPU内存。如果您的GPU内存小于这个数值,可以在configs/UniAnimate_infer.yaml
中将max_frames: 32
更改为其他值,例如24、16和8。我们的模型与所有这些值兼容。
(4.2) 生成视频片段(32帧,分辨率为1216x768)
如果您想合成更高分辨率的结果,可以在configs/UniAnimate_infer.yaml
中将resolution: [512, 768]
更改为resolution: [768, 1216]
。然后执行以下命令生成视频片段:
python inference.py --cfg configs/UniAnimate_infer.yaml
完成后,将生成32帧、分辨率为1216x768的视频片段:
✔ 一些提示:
-
运行模型时,将使用~21G
36GGPU内存。尽管我们的模型是在512x768分辨率上训练的,但我们观察到直接在768x1216分辨率上进行推理通常是可行的,并能产生令人满意的结果。如果出现外观不一致的情况,您可以尝试使用不同的种子或将分辨率调整为512x768。 -
虽然我们的模型没有在48或64帧上训练,但我们发现模型在合成这些长度的视频时表现良好。
在configs/UniAnimate_infer.yaml
配置文件中,您可以指定数据,使用max_frames
调整视频长度,并通过不同的Diffusion设置验证您的想法,等等。
(4.3) 生成长视频
如果您想合成与目标姿势序列一样长的视频,可以执行以下命令生成长视频:
python inference.py --cfg configs/UniAnimate_infer_long.yaml
完成后,将生成分辨率为1216x768的长视频:
在configs/UniAnimate_infer_long.yaml
配置文件中,test_list_path
应该采用[帧间隔, 参考图像, 驱动姿势序列]
的格式,其中frame_interval=1
表示目标姿势序列中的所有帧都将用于生成视频,而frame_interval=2
表示每两帧采样一帧。reference image
是保存参考图像的位置,driving pose sequence
是保存驱动姿势序列的位置。
✔ 一些提示:
-
如果发现外观不一致,可以将分辨率从768x1216改为512x768,或将
context_overlap
从8改为16。 -
在
configs/UniAnimate_infer_long.yaml
的默认设置中,使用了带有时间重叠的滑动窗口策略。您也可以先生成一个满意的视频片段,然后将该片段的最后一帧输入模型,以生成下一个片段来继续视频。
引用
如果您发现这个代码库对您的研究有用,请引用以下论文:
@article{wang2024unianimate,
title={UniAnimate: Taming Unified Video Diffusion Models for Consistent Human Image Animation},
author={Wang, Xiang and Zhang, Shiwei and Gao, Changxin and Wang, Jiayu and Zhou, Xiaoqiang and Zhang, Yingya and Yan, Luxin and Sang, Nong},
journal={arXiv preprint arXiv:2406.01188},
year={2024}
}
免责声明
这个开源模型仅供研究/非商业用途。 我们明确声明不对用户生成的内容承担任何责任。用户在使用生成模型时应对自己的行为完全负责。项目贡献者与用户的行为没有任何法律关联,也不承担任何责任。使用生成模型时必须遵守道德和法律标准,并负责任地使用。