本文目标:在Ubuntu系统上部署Hallo,实现训练和推理
背景介绍
由语音音频输入驱动的肖像图像动画领域在生成逼真的动态肖像方面取得了重大进展。
项目地址为:
https://github.com/fudan-generative-vision/hallohttps://github.com/fudan-generative-vision/hallo
本方法所提议的流程概览如下:
音频驱动的层次视觉合成的可视化及原始全方法与我们提出的层次音频-视觉交叉注意力之间的比较分析。
训练与推理
训练
训练过程包括两个不同的阶段:
此外,引入运动模块来改善模型的时间连贯性和平滑性,该模块使用来自AnimateDiff 的预设权重进行初始化。在这个阶段,从视频剪辑中随机选择一个帧作为参考图像。
与现有的肖像图像动画方法在HDTF数据集上的定量比较。本框架提出的方法在生成高质量、时间上连贯的说话头像动画以及优越的嘴唇同步性能方面表现出色。
上图为:在HDTF数据集上与现有方法的定性比较。
推理
在推理阶段,网络以一张参考图像和驾驶音频作为输入,根据相应的音频生成一个动画化的视频序列。为了产生视觉上一致的长视频,我们利用上一个视频片段的最后2帧作为下一个片段的初始k帧,实现逐步递增的视频片段生成。
开始部署
1. 把项目源码下载到本地
git clone git@github.com:fudan-generative-vision/hallo.git
2. 创建 conda 环境
conda create -n hallo python=3.10
conda activate hallo
3. 使用 pip 安装软件包
(此外,还需要 ffmpeg:sudo apt-get install ffmpeg, 如果没有安装的话可以在系统中安装一下)
4. 下载预训练模型
您可以从该项目的 HuggingFace 软件仓库轻松获取推理所需的所有预训练模型。
通过下面的 cmd 将预训练模型克隆到 ${PROJECT_ROOT}/pretrained_models 目录中:
git lfs install
git clone https://huggingface.co/fudan-generative-ai/hallo pretrained_models
最后,这些预训练模型的组织结构如下:
./pretrained_models/
|-- audio_separator/
| |-- download_checks.json
| |-- mdx_model_data.json
| |-- vr_model_data.json
| `-- Kim_Vocal_2.onnx
|-- face_analysis/
| `-- models/
| |-- face_landmarker_v2_with_blendshapes.task # face landmarker model from mediapipe
| |-- 1k3d68.onnx
| |-- 2d106det.onnx
| |-- genderage.onnx
| |-- glintr100.onnx
| `-- scrfd_10g_bnkps.onnx
|-- motion_module/
| `-- mm_sd_v15_v2.ckpt
|-- sd-vae-ft-mse/
| |-- config.json
| `-- diffusion_pytorch_model.safetensors
|-- stable-diffusion-v1-5/
| `-- unet/
| |-- config.json
| `-- diffusion_pytorch_model.safetensors
`-- wav2vec/
`-- wav2vec2-base-960h/
|-- config.json
|-- feature_extractor_config.json
|-- model.safetensors
|-- preprocessor_config.json
|-- special_tokens_map.json
|-- tokenizer_config.json
`-- vocab.json
5. 准备推理数据
Hallo 对输入数据有几个简单的要求:
源图像:
驱动音频:
项目提供了一些样本供您参考(文件在项目源码中,小伙伴们自行获取 -- 政安晨)。
6. 运行推理
只需运行 scripts/inference.py,并将 source_image 和 driving_audio 作为输入即可:
python scripts/inference.py --source_image examples/reference_images/1.jpg --driving_audio examples/driving_audios/1.wav
动画结果默认保存为 ${PROJECT_ROOT}/.cache/output.mp4。 你可以通过 --output 来指定输出文件名。 您可以在 examples 文件夹中找到更多推理示例。
在使用推理的过程中,您可能会遇到问题,比如提示xformers不可用,重新安装xformers等。
按照提示地址打开xformers官网重新安装:
conda install xformers -c xformers
之后,再重新按照上述方式在miniconda虚拟环境中重装依赖。
接下来,就可以正常操作了,我的示例如下:
python scripts/inference.py --source_image examples/YDBaba/2.jpg --driving_audio examples/YDBaba/1.wav
更多操作说明如下:
usage: inference.py [-h] [-c CONFIG] [--source_image SOURCE_IMAGE] [--driving_audio DRIVING_AUDIO] [--output OUTPUT] [--pose_weight POSE_WEIGHT]
[--face_weight FACE_WEIGHT] [--lip_weight LIP_WEIGHT] [--face_expand_ratio FACE_EXPAND_RATIO]
options:
-h, --help show this help message and exit
-c CONFIG, --config CONFIG
--source_image SOURCE_IMAGE
source image
--driving_audio DRIVING_AUDIO
driving audio
--output OUTPUT output video file name
--pose_weight POSE_WEIGHT
weight of pose
--face_weight FACE_WEIGHT
weight of face
--lip_weight LIP_WEIGHT
weight of lip
--face_expand_ratio FACE_EXPAND_RATIO
face region
关于训练
为训练准备数据
训练数据使用了一些与推理所用源图像类似的会说话的人脸视频,也需要满足以下要求:
将原始视频整理到以下目录结构中:
您可以使用任何数据集名称,但要确保视频目录的名称如上所示。
接下来,使用以下命令处理视频:
使用以下命令生成元数据 JSON 文件:
将 path/to/dataset 替换为视频父目录的路径,例如上例中的 dataset_name。 这将在 ./data 目录中生成 dataset_name_stage1.json 和 dataset_name_stage2.json。
训练
更新配置 YAML 文件 configs/train/stage1.yaml 和 configs/train/stage2.yaml 中的数据元路径设置:
使用以下命令开始训练:
加速使用说明
加速启动命令用于以分布式设置启动训练过程。
accelerate launch [arguments] {training_script} --{training_script-argument-1} --{training_script-argument-2} ...
支持加速的理由
训练论据
对于多节点训练,需要在每个节点上分别手动运行不同机器等级的命令。
训练细节后续会继续为大家展示。—— 政安晨