文章目录
- 引言
- 项目背景
- 概述
- 重要性分析
- 结论
- 环境准备
- 1. 安装CUDA
- 2. 安装Python依赖
- 3. 准备3DMM模型(BFM2009)及其他数据
- 运行官方 Demo
- 训练自己的视频
- 数据准备
- 训练
- 推理测试
- 遇到的问题与解决方案
- 问题一:cuda 安装完发现版本不对
- 问题二:Data Preprocessing Error | bg.jpg not found
- 问题三:运行较长语音时,程序被 kill
- 问题四:视频人物的眼睛没睁开
- 问题五:RuntimeError: Error(s) in loading state_dict for RADNeRFTorsowithSR
- 知识点
- 知识点一:HuBERT
- 基本概念
- 技术细节
- 应用领域
- 优势
- 研究进展
- 知识点二:Mel 频谱 和 F0 基频
- Mel 频谱(Mel-spectrogram)
- F0(基频)
- 应用
- 知识点三:2D landmarks
- 知识点四:Fit 3DMM
- 关键步骤
- 应用
引言
在这个数字化时代,虚拟与现实的界限逐渐模糊,数字人技术以其独特的魅力和广泛应用前景,成为创新与探索的前沿领域。我有幸在个人兴趣与职业发展的双重驱动下,深入这一领域,探索其无限可能。
个人与职业的交汇点:
我的数字人之旅始于对人工智能和计算机图形学的深厚兴趣。而公司对这一新兴技术的战略布局,为我提供了一个实践和研究的绝佳平台。公司期望我能够深入探讨数字人技术,以期在未来的市场竞争中占据有利地位。
选择GeneFace++:
在众多数字人项目中,GeneFace++以其卓越的嘴型同步技术、逼真的视频生成效果和高效的系统性能脱颖而出。它不仅满足了我对技术深度的追求,也符合公司对创新应用的期待。
博客:知识的沉淀与分享:
撰写这篇博客的初衷,是希望将我在部署GeneFace++项目过程中的所学所感,沉淀成文,为自我成长留下印记。同时,我更希望能够将这份知识的力量传递给每一位对此领域抱有热情的网友。
共同成长的愿景:
我相信,通过分享我的经验和见解,可以激发更多人对数字人技术的兴趣,促进知识的交流与思想的碰撞。我期待与志同道合的朋友们一起,在这个充满挑战与机遇的领域中共同成长,探索未知。
结语:
让我们一起启程,穿梭于虚拟与现实之间,用代码编织梦想,用技术点亮未来。我诚邀您加入这场数字人的探索之旅,共同见证和创造这一领域的辉煌。
项目背景
概述
名称: GeneFace++
技术基础: 基于PyTorch的深度学习框架
核心功能: 实现实时音频驱动的3D面部动画合成
github地址: https://github.com/yerfor/GeneFacePlusPlus/tree/main
GeneFace++项目通过先进的人工智能技术,实现了一种高效、逼真的虚拟人视频合成方法。它能够根据输入的音频信号,自动生成与语音同步的嘴型和面部表情,为虚拟角色赋予更加自然和生动的表现力。
重要性分析
- 技术先进性: GeneFace++采用了最新的深度学习算法,能够处理复杂的面部动作和表情,提供高质量的视频合成结果。
- 开源社区支持: 作为一个开源项目,GeneFace++得到了广泛的社区支持,不断有新的功能和改进被添加到项目中。
- 应用广泛性: 它在电影制作、游戏开发、虚拟现实、社交媒体、教育培训等多个领域都有潜在的应用价值。
- 创新推动力: GeneFace++推动了虚拟人技术的创新,为数字娱乐和人机交互开辟了新的可能性。
- 教育和研究价值: 该项目为学术界和教育界提供了一个实践深度学习和计算机视觉技术的平台。
- 个性化定制: 用户可以根据自己的需求对GeneFace++进行定制和扩展,创造出独特的虚拟角色。
结论
GeneFace++项目在虚拟人视频合成领域的重要性不言而喻。它不仅提供了一种高效、逼真的视频合成解决方案,还促进了相关技术的普及和创新。随着技术的不断发展和社区的积极参与,GeneFace++有望在未来的虚拟人技术领域发挥更大的作用,为用户带来更加丰富和多样化的交互体验。
环境准备
文档链接:GeneFace++ 安装指南
部署的主机信息:
- 火山引擎云主机:GPU计算型g1vc |ecs.g1vc.xlarge |6vCPU |26GiB|V100,ubuntu22.04
1. 安装CUDA
- CUDA版本:推荐安装CUDA 11.7,项目已在A100/V100 GPU上进行验证。
- CUDA路径:确保CUDA路径指向正确版本,例如
/usr/local/cuda-11.7
。 - 兼容性:不支持CUDA 12或更高版本。
# cuda 版本可以在这里查看 https://developer.nvidia.com/cuda-toolkit-archive
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.0-1_all.deb
sudo dpkg -i cuda-keyring*.deb
sudo apt-get update
sudo apt-get -y install cuda=11.7.1-1
# 查看安装是否成功
ls /usr/local | grep cuda
2. 安装Python依赖
- 安装conda
- 创建 Python3.9 环境:conda create -n geneface python=3.9
- 环境激活:使用Conda创建名为
geneface
的新环境,并激活该环境。 - FFmpeg安装:安装带有libx264编解码器的FFmpeg,用于将图像转换为视频。
- PyTorch安装:推荐安装PyTorch 2.0.1与CUDA 11.7,避免使用2.1以上版本以防止torch-ngp错误。
- PyTorch3D安装:从源代码安装PyTorch3D,可能需要较长时间。
- MMCV安装:安装Cython和OpenMIM,然后使用mim安装MMCV。
- 其他依赖:安装音频相关的库和项目所需的其他Python包。
# 安装 conda
wget https://repo.anaconda.com/archive/Anaconda3-2024.02-1-Linux-x86_64.sh
chmod +x Anaconda3-2024.02-1-Linux-x86_64.sh
./Anaconda3-2024.02-1-Linux-x86_64.sh
# 拉取项目 apt install git
git clone https://github.com/yerfor/GeneFacePlusPlus.git
# 进入 Python3.9 的环境
cd <GeneFaceRoot>
source <CondaRoot>/bin/activate
conda create -n geneface python=3.9
conda activate geneface
# FFmpeg安装
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 apt-get install libasound2-dev portaudio19-dev
pip install -r docs/prepare_env/requirements.txt -v# 构建torch-ngp
bash docs/prepare_env/install_ext.sh
3. 准备3DMM模型(BFM2009)及其他数据
你可以从这里下载或 。 解压缩后, BFM 文件夹中将包含8个文件。 移动这些文件到 /deep_3drecon/BFM/。该文件夹结构应该如下:
- 模型下载:从提供的 Google Drive 或BaiduYun Disk (密码 r8ux)下载BFM2009模型。
- 文件放置:将下载并解压的文件移动到
<GeneFaceRoot>/deep_3drecon/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
以上是结合自身部署过程和官方教程进行整理的,如出现问题请先查阅 github 的教程
运行官方 Demo
GeneFace++ github 教程
- 步骤1:下载预处理好的May的数据集 trainval_dataset.npy (Google Drive 或 BaiduYun Disk 提取码: 98n4), 放置在data/binary/videos/May/trainval_dataset.npy路径下。
- 步骤2:下载预训练好的通用的audio-to-motino模型 audio2motion_vae.zip (Google Drive 或 BaiduYun Disk 提取码: 98n4) 和专用于May的motion-to-video模型 motion2video_nerf.zip (Google Drive 或 BaiduYun Disk 提取码: 98n4), 解压到./checkpoints/目录下。
- 步骤3:激活geneface的Python环境
cd <GeneFaceRoot>
conda activate geneface
export PYTHONPATH=./
- 步骤4: 然后执行:
python inference/genefacepp_infer.py --a2m_ckpt=checkpoints/audio2motion_vae --head_ckpt= --torso_ckpt=checkpoints/motion2video_nerf/may_torso --drv_aud=data/raw/val_wavs/MacronSpeech.wav --out_name=may_demo.mp4
- 或者可以使用我们提供的Gradio WebUI:
python inference/app_genefacepp.py --a2m_ckpt=checkpoints/audio2motion_vae --head_ckpt= --torso_ckpt=checkpoints/motion2video_nerf/may_torso
使用官方自带的音频文件生成的视频
[视频待审核]
使用自己上传的音频文件生成的视频
[视频待审核]
训练自己的视频
数据准备
准备一个视频(头部无遮挡、晃动不要过大),视频分辨率不要小于 512X512,将视频放置到 /data/raw/videos/ 目录下
步骤 0 将视频Crop到512x512分辨率,25FPS,确保每一帧都有目标人脸
cd <GeneFaceRoot>
# VIDIO_ID 为视频的名称,最好是英文且简单明了
export VIDEO_ID=
# crop=512:512:284:224, 284,224 为视频 Crop 开始裁剪的起始位置,具体需要根据视频中人脸的位置进行调整
ffmpeg -i data/raw/videos/${VIDEO_ID}.mp4 -filter:v "fps=25,crop=512:512:284:224" -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: 提取音频特征, 如mel, f0, hubuert
export CUDA_VISIBLE_DEVICES=0
export PYTHONPATH=./
export VIDEO_ID=
# 新建视频处理文件存放位置
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
# 生成 aud_hubert.np 文件
python data_gen/utils/process_audio/extract_hubert.py --video_id=${VIDEO_ID}
# 生成 aud_mel_f0.npy 文件
python data_gen/utils/process_audio/extract_mel_f0.py --video_id=${VIDEO_ID}
步骤2. 提取图片
export PYTHONPATH=./
export VIDEO_ID=
export CUDA_VISIBLE_DEVICES=0
# 创建图片提取目录
mkdir -p data/processed/videos/${VIDEO_ID}/gt_imgs
# 提取图片并保存至 ${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
# 提取图片中的元素,生成 bg_imgs com_imgs inpaint_torso_imgs person_imgs torso_imgs bg.jpg head_imgs segmaps 文件
# 若运行是出现卡主了,就使用单线程执行,再命令后面加 --force_single_process 参数
python data_gen/utils/process_video/extract_segment_imgs.py --ds_name=nerf --vid_dir=data/raw/videos/${VIDEO_ID}.mp4
步骤3. 提取lm2d_mediapipe, Fit 3DMM
export PYTHONPATH=./
export VIDEO_ID=
# 生成 lms_2d.npy 文件, data/processed/videos/${VIDEO_ID}/lms_2d.npy
python data_gen/utils/process_video/extract_lm2d.py --ds_name=nerf --vid_dir=data/raw/videos/${VIDEO_ID}.mp4
# 生成 debug_fit_3dmm.mp4 文件, data/processed/videos/${VIDEO_ID}/debug_fit_3dmm.mp4
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
步骤4. Binarize(将数据打包)
export PYTHONPATH=./
export VIDEO_ID=
python data_gen/runs/binarizer_nerf.py --video_id=${VIDEO_ID}
训练
步骤1. 获取Audio2Motion模型
你可以从Google Drive 或 BaiduYun Disk (密码 9cqp) 下载预训练的Audio2Motion模型,并将模型放在 checkpoints/audio2motion_vae里。
理论在在运行 Demo 时就已经下载了
步骤2. 复制训练配置
cp -r egs/datasets/May egs/datasets/${VIDEO_ID}
# 检查配置文件,并将配置文件中的 video_id 替换成 ${VIDEO_ID},配置文件的中出现的目录路径也替换成 ${VIDEO_ID} 的目录
步骤3. Train Motion2Video Renderer
# 数据主备完成后会产生数据集: data/binary/videos/${VIDEO_ID}/trainval_dataset.npy
# 训练 Head NeRF 模型
# 模型与tensorboard会被保存在 `checkpoints/<exp_name>`
CUDA_VISIBLE_DEVICES=0 python tasks/run.py --config=egs/datasets/${VIDEO_ID}/lm3d_radnerf_sr.yaml --exp_name=motion2video_nerf/${VIDEO_ID}_head --reset# 训练 Torso NeRF 模型
CUDA_VISIBLE_DEVICES=0 python tasks/run.py --config=egs/datasets/${VIDEO_ID}/lm3d_radnerf_torso_sr.yaml --exp_name=motion2video_nerf/${VIDEO_ID}_torso --hparams=head_model_dir=checkpoints/motion2video_nerf/${VIDEO_ID}_head --reset
推理测试
CUDA_VISIBLE_DEVICES=0 python inference/app_genefacepp.py --a2m_ckpt=checkpoints/audio2motion_vae --head_ckpt= --torso_ckpt=motion2video_nerf/${VIDEO_ID}_torso
遇到的问题与解决方案
问题一:cuda 安装完发现版本不对
原因:若不指定 cuda 安装版本默认会安装最新版本,此时需要卸载 cuda 后,指定版本重新安装
apt-get --purge remove cuda
apt-get -y install cuda=11.7.1-1
问题二:Data Preprocessing Error | bg.jpg not found
https://github.com/yerfor/GeneFacePlusPlus/issues/189
大概率是提取图片步骤没有执行成功(程序卡住或者报错了)
# 重跑
python data_gen/utils/process_video/extract_segment_imgs.py --ds_name=nerf --vid_dir=data/raw/videos/${VIDEO_ID}.mp4 --force_single_process
问题三:运行较长语音时,程序被 kill
大概率是内存爆了,试试勾选低内存模式
问题四:视频人物的眼睛没睁开
https://github.com/yerfor/GeneFacePlusPlus/issues/47
修改配置文件中的 eye_blink_dim 为 4
- /egs/datasets/${VEDIO_ID}/lm3d_radnerf_torso.yaml
- /egs/datasets/${VEDIO_ID}/lm3d_radnerf_sr.yaml
问题五:RuntimeError: Error(s) in loading state_dict for RADNeRFTorsowithSR
https://github.com/yerfor/GeneFacePlusPlus/issues/129
raise RuntimeError('Error(s) in loading state_dict for {}:\n\t{}'.format(
RuntimeError: Error(s) in loading state_dict for RADNeRFTorsowithSR:
size mismatch for blink_encoder.1.weight: copying a param with shape torch.Size([8, 32]) from checkpoint, the shape in current model is torch.Size([2, 32]).
size mismatch for blink_encoder.1.bias: copying a param with shape torch.Size([8]) from checkpoint, the shape in current model is torch.Size([2]).
Done
检查配置文件,参数是否一致,比如 eye_blink_dim 参数
- /egs/datasets/${VEDIO_ID}/lm3d_radnerf_torso.yaml
- /egs/datasets/${VEDIO_ID}/lm3d_radnerf_sr.yaml
知识点
知识点一:HuBERT
HuBERT(Hidden Unit BERT)是一种用于语音信号处理的预训练算法,它是由Facebook AI Research(FAIR)团队开发的一种自监督学习模型。HuBERT基于BERT(Bidirectional Encoder Representations from Transformers)模型,但针对音频数据进行了优化。以下是HuBERT的一些关键特点和优势:
基本概念
- 自监督学习:HuBERT不需要标注数据,而是通过预测音频中的隐藏单元来学习语音表示。
- 基于Transformer:HuBERT使用Transformer架构,这是NLP领域中非常成功的模型架构,通过自注意力机制来处理序列数据。
技术细节
- 波形编码:HuBERT将原始音频波形编码成一系列特征表示,这些特征随后被送入Transformer模型。
- 上下文预测:模型通过预测给定上下文中的隐藏单元来学习音频的表示,这有助于捕捉语音的语义信息。
- 双向表示:与BERT类似,HuBERT生成的是上下文相关的双向表示,这有助于更好地理解语音信号。
应用领域
- 语音识别:HuBERT可以用于自动语音识别(ASR),提供高质量的语音到文本的转换。
- 说话人识别:HuBERT的表示可以用于区分不同的说话人,适用于安全认证和个性化服务。
- 情感分析:通过分析语音信号的情感内容,HuBERT可以用于情感识别和分析。
- 语音合成:HuBERT的语音表示可以用于生成逼真的合成语音。
优势
- 高效率:HuBERT能够快速学习语音的复杂特征,提供高效的训练和推理速度。
- 泛化能力:由于自监督学习的特性,HuBERT具有良好的泛化能力,可以适应不同的语音数据和任务。
- 端到端学习:HuBERT可以端到端地学习语音表示,无需复杂的特征工程。
研究进展
HuBERT自推出以来,已经在多个语音处理任务中取得了显著的成果,成为语音研究和工业应用中的一个有前景的方向。随着技术的不断发展,HuBERT及其变体可能会在未来的语音技术中扮演更加重要的角色。
HuBERT算法的提出,为语音信号处理领域带来了新的视角和强大的工具,推动了语音识别和相关技术的进步。
知识点二:Mel 频谱 和 F0 基频
在语音处理领域,"mel"和"F0"是两个重要的概念,它们通常用于语音分析和语音合成。
Mel 频谱(Mel-spectrogram)
Mel 频谱图是一种对声音信号进行频谱分析的方法,它基于人耳对不同频率声音的感知敏感度。Mel 频谱图的频率轴是按照 mel 刻度来划分的,这种刻度更接近人类对声音的感知。
- Mel 刻度:Mel 刻度是一种非线性频率刻度,它将低频部分划分得更细,高频部分划分得更粗,以匹配人类听觉系统的特性。
- Mel-spectrogram:Mel 频谱图通过将傅里叶变换后的频谱(通常是幅度谱)映射到 mel 刻度上,然后进行对数变换,最后取对数幅度的对数来生成。这样处理后,Mel 频谱图能够更有效地表示语音信号中的语义信息。
F0(基频)
F0 代表基频,它是声音信号中周期性波形的频率,可以理解为声音的音高。在语音中,F0的变化可以表达不同的语调、情感和语句的抑扬顿挫。
- 测量 F0:可以通过测量声带振动的周期来确定 F0 的值。在语音信号处理中,F0 的检测是一个关键步骤,因为它对于语音合成和语音识别都非常重要。
- F0 轮廓:在一段语音中,F0 随时间变化的曲线称为 F0 轮廓。通过分析 F0 轮廓,可以提取语句的语调信息和情感表达。
应用
- 语音识别:Mel 频谱图和 F0 都可以用来改善自动语音识别系统的性能。Mel 频谱图提供了声音的频率信息,而 F0 有助于理解语句的语调。
- 语音合成:在语音合成中,Mel 频谱图可以用来生成声音的频谱特征,而 F0 轮廓则用于控制合成语音的音高变化,使合成语音听起来更自然。
- 音乐信息检索:在音乐领域,Mel 频谱图也用于分析音乐信号,而 F0 检测用于识别旋律线。
Mel 频谱图和 F0 是语音信号处理中的两个互补的工具,它们共同帮助我们更好地理解和生成人类语音。
知识点三:2D landmarks
2D 面部标记点(landmarks),也称为2D面部关键点,是面部特征的几何表示,通常用于计算机视觉和机器学习中的面部分析任务。以下是2D面部标记点的一些主要用途:
-
面部检测与定位:2D面部标记点可以用于在图像或视频中检测和定位面部的位置。
-
面部特征提取:通过识别面部的关键特征点,如眼角、鼻尖、嘴角等,可以提取面部的形态特征。
-
人脸对齐:在进行面部识别或面部分析之前,通常需要将面部图像对齐到一个标准姿态,2D面部标记点有助于实现这一点。
-
表情识别:面部标记点的变化可以用来识别和分析面部表情,从而推断情绪状态。
-
头部姿态估计:通过分析面部标记点的位置变化,可以估计头部的旋转角度和倾斜角度。
-
人脸识别:2D面部标记点有助于从图像中提取独特的面部特征,用于人脸识别系统。
-
人脸动画:在动画和娱乐行业,2D面部标记点可以用来驱动虚拟角色的面部动画。
-
增强现实(AR):在AR应用中,2D面部标记点可以用于实时追踪面部动作,增强用户的交互体验。
-
医疗应用:在某些医疗领域,2D面部标记点可以用于分析面部肌肉的运动,辅助诊断面部神经疾病。
-
社交媒体:在社交媒体平台,2D面部标记点技术可以用于创建有趣的面部滤镜和效果。
-
辅助技术:对于视觉障碍人士,2D面部标记点可以帮助开发辅助技术,如导航或识别面部表情。
2D 面部标记点的检测和分析是面部图像处理领域的基础技术之一,它们在多个领域都有广泛的应用。随着技术的发展,这些应用变得更加精细和复杂,为用户带来了更加丰富和个性化的体验。
知识点四:Fit 3DMM
"Fit 3DMM"通常指的是将一个3D形态模型(3D Morphable Model,简称3DMM)拟合到2D图像或者3D数据上的过程。3DMM是一种用于描述面部形状和外观变化的统计模型,它可以生成逼真的3D面部动画和表情。以下是拟合3DMM的一些关键步骤和应用:
关键步骤
-
面部检测:首先在2D图像中检测到面部的位置和大小。
-
2D关键点检测:在面部图像上检测出2D关键点,如眼睛、鼻子、嘴巴等特征点。
-
人脸对齐:使用2D关键点来对齐面部图像,确保面部特征与模型的标准姿态对齐。
-
3D关键点估计:根据2D关键点估计相应的3D关键点,这可能涉及到深度估计和一些先验知识。
-
模型拟合:将3DMM中的参数调整,以最小化模型预测的3D关键点与估计的3D关键点之间的误差。
-
纹理映射:将3DMM的纹理映射到拟合后的3D面部模型上,以生成逼真的外观。
-
优化:通过迭代优化过程,调整模型参数直到达到最佳的拟合效果。
应用
-
面部识别:通过拟合3DMM,可以提取出用于面部识别的特征。
-
面部动画:拟合后的3DMM可以用于生成动态的面部表情和嘴型动画。
-
虚拟现实(VR):在VR环境中,3DMM拟合可以用于创建用户的真实感虚拟形象。
-
增强现实(AR):在AR应用中,拟合3DMM可以用于实时面部追踪和面部效果的应用。
-
电影和游戏制作:在影视制作和电子游戏中,3DMM拟合可以用于生成逼真的3D角色面部。
-
面部重建:从单张2D图像重建3D面部模型,用于法律取证、历史人物重建等。
-
医疗应用:在整形外科和面部修复领域,3DMM拟合可以帮助医生进行手术规划和效果预测。
-
社交机器人:在社交机器人领域,3DMM拟合可以用于生成更加自然和逼真的面部表情。
拟合3DMM是一个复杂的过程,涉及到计算机视觉、机器学习、图形学等多个领域的技术。随着技术的进步,这一过程变得更加自动化和精确,为各种应用提供了强大的支持。