一、项目地址:
二、项目详述
(一)模型简介
GeneFace++提出了一种通过利用音频生成具有任意语音的说话人头像。它不仅泛化音频唇同步,而且具有良好的视频质量和高效的系统性能,达到了解决数字人类和元宇宙领域中的重要问题的目的。
(二)模型改进点
1)利用音高轮廓作为辅助特征,在面部运动预测过程中引入时间损失,实现唇语的高时空一致性和准确性;
2)提出一种地标局部线性嵌入方法,以调节预测运动序列中的异常值,避免鲁棒性问题;
3)设计了一种计算效率高的基于NeRF的运动到视频渲染器,实现快速训练和实时推理。
(三)原理详述
1、音高感知音频到动作模型
这部分使用前面提取的音频特征来预测面部关键点的动作,关键点是面部的重要部位,如眼睛、嘴巴等
2、Landmark局部线性嵌入
它是一种基于流形投影的后处理方法。它可以帮助模型理解不同面部关键点之间的关系,可确保每个预测的标志成功映射到
3、即时动作到视频模型
它是把预测的关键点动作转换成连续的视频帧,形成一个可以播放的视频。
4、pitch encoder(音高编码)
捕捉语音中的音高变化,因音高对理解说话者的意图比较重要
5、HuBERT(基于transformer的自监督学习模型)
它是一个用于语音信号处理的预训练算法,能从语音中提取出复杂的语音特征
6、Volume Renderer
渲染三维数据增强视频的真实性
7、Super-Resolution(超分辨率处理)
为了保证生成视频的质量,通过超分辨率处理来提升图像质量
(四)模型评估指标
在数字图像处理中峰值信噪比是一个重要的评价参数,用于衡量图像的质量和噪声水平。FID是计算真实图像和生成图像的特征向量之间距离的一种度量。LMD是用于评估面部图像生成质量的指标,它用于度量生成的面部图像与真实面部图像之间的面部特征点的距离,以衡量生成的面部图像与真实面部图像之间的相似性。
1). PSNR值越高 图像质量越好 噪声水平越低
2). FID值越高 两组图像相似度越高
3). LMD得分越低 面部图像生成质量越好
三、项目部署
(一)安装CUDA
建议手动从官方渠道安装CUDA。
我们推荐安装CUDA 11.7,其他CUDA版本也可能有效。
需要注意的是,此项目目前不支持CUDA 12或者更高版本
(二)安装依赖
cd <GeneFace的目录下>
conda create -n geneface python=3.9
conda activate geneface
conda install conda-forge::ffmpeg # ffmpeg with libx264 codec to turn images to video
# 我们推荐安装torch2.0.1+cuda11.7. 已经发现 torch=2.1+cuda12.1 会导致 torch-ngp 错误
conda install pytorch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 pytorch-cuda=11.7 -c pytorch -c nvidia
# 从源代码安装,需要比较长的时间 (如果遇到各种time-out问题,建议使用代理)
pip install "git+https://github.com/facebookresearch/pytorch3d.git@stable"
# MMCV安装
pip install cython
pip install openmim==0.3.9
mim install mmcv==2.1.0 # 使用mim来加速mmcv安装
# 其他依赖项
sudo yum install libasound2-dev portaudio19-dev
pip install -r docs/prepare_env/requirements.txt -v
# 构建torch-ngp
bash docs/prepare_env/install_ext.sh
(三)3DMM下载
按照 中的 docs/prepare_env/install_guide.md
步骤,已经创建了运行的虚拟环境,然后将 3DMM 文件下载到 deep_3drecib/BFM
中。下载完的目录结构为:
deep_3drecon/BFM/
├── 01_MorphableModel.mat
├── BFM_exp_idx.mat
├── BFM_front_idx.mat
├── BFM_model_front.mat
├── Exp_Pca.bin
├── facemodel_info.mat
├── index_mp468_from_mesh35709.npy
├── mediapipe_in_bfm53201.npy
└── std_exp.txt
(四)训练目标视频预处理
将视频Crop到512x512分辨率,25FPS,确保每一帧都有目标人脸。然后放置到 data/raw/videos/{Video_ID}.mp4
复制egs/datasets/May
的config文件到 egs/datasets/{Video_ID}
,并修改config里的video: May
为 video: {Video_ID}
ffmpeg -i data/raw/videos/${VIDEO_ID}.mp4 -vf fps=25,scale=w=512:h=512 -qmin 1 -q:v 1 data/raw/videos/${VIDEO_ID}_512.mp4
mv data/raw/videos/${VIDEO_ID}.mp4 data/raw/videos/${VIDEO_ID}_to_rm.mp4
mv data/raw/videos/${VIDEO_ID}_512.mp4 data/raw/videos/${VIDEO_ID}.mp4
(五)提取音频特征
1、f0 处理
2、hubert 处理
3、mel 处理
export CUDA_VISIBLE_DEVICES=0
export PYTHONPATH=./
export VIDEO_ID=May
mkdir -p data/processed/videos/${VIDEO_ID}
ffmpeg -i data/raw/videos/${VIDEO_ID}.mp4 -f wav -ar 16000 data/processed/videos/${VIDEO_ID}/aud.wav
python data_gen/utils/process_audio/extract_hubert.py --video_id=${VIDEO_ID}
python data_gen/utils/process_audio/extract_mel_f0.py --video_id=${VIDEO_ID}
(六)提取图片
export PYTHONPATH=./
export VIDEO_ID=May
export CUDA_VISIBLE_DEVICES=0
mkdir -p data/processed/videos/${VIDEO_ID}/gt_imgs
ffmpeg -i data/raw/videos/${VIDEO_ID}.mp4 -vf fps=25,scale=w=512:h=512 -qmin 1 -q:v 1 -start_number 0 data/processed/videos/${VIDEO_ID}/gt_imgs/%08d.jpg
python data_gen/utils/process_video/extract_segment_imgs.py --ds_name=nerf --vid_dir=data/raw/videos/${VIDEO_ID}.mp4 # extract image, segmap, and background
(七)提取2D landmark
此步骤的为Fit 3DMM做准备
export PYTHONPATH=./
export VIDEO_ID=May
python data_gen/utils/process_video/extract_lm2d.py --ds_name=nerf --vid_dir=data/raw/videos/${VIDEO_ID}.mp4
# num_workers是本机上的CPU worker数量;total_process是使用的机器数;process_id是本机的编号
(八)Fit 3DMM
export PYTHONPATH=./
export VIDEO_ID=May
export CUDA_VISIBLE_DEVICES=0
python data_gen/utils/process_video/fit_3dmm_landmark.py --ds_name=nerf --vid_dir=data/raw/videos/${VIDEO_ID}.mp4 --reset --debug --id_mode=global
(九) 数据打包
打包后,可以看到在data/binary/videos/May
目录下得到了数据集
export PYTHONPATH=./
export VIDEO_ID=May
python data_gen/runs/binarizer_nerf.py --video_id=${VIDEO_ID}
(十)训练 Motion2Video Renderer
先遵循 docs/process_data/guide.md
的步骤来获得预处理后的数据集,并且可以找到一个二进制化的 .npy
文件 data/binary/videos/{Video_ID}/trainval_dataset.npy
(Video_ID 是目标的人物名字, eg.:May
)
# 训练 Head NeRF 模型
# 模型与tensorboard会被保存在 `checkpoints/<exp_name>`
CUDA_VISIBLE_DEVICES=0 python tasks/run.py --config=egs/datasets/May/lm3d_radnerf_sr.yaml --exp_name=motion2video_nerf/may_head --reset
# 训练 Torso NeRF 模型
CUDA_VISIBLE_DEVICES=0 python tasks/run.py --config=egs/datasets/May/lm3d_radnerf_torso_sr.yaml --exp_name=motion2video_nerf/may_torso --hparams=head_model_dir=checkpoints/motion2video_nerf/may_head --reset
(十一)推理
运行下述命令即可推理
# 使用我们提供的推理脚本.
CUDA_VISIBLE_DEVICES=0 python inference/genefacepp_infer.py --head_ckpt= --torso_ckpt=motion2video_nerf/may_torso --drv_aud=data/raw/val_wavs/MacronSpeech.wav
# --debug 选项可以可视化一些中间过程与特征
CUDA_VISIBLE_DEVICES=0 python inference/genefacepp_infer.py --head_ckpt= --torso_ckpt=motion2video_nerf/may_torso --drv_aud=data/raw/val_wavs/MacronSpeech.wav --debug
四、演示结果
视频地址: