ER-NeRF实时对话数字人模型训练与部署

ER-NeRF是基于NeRF用于生成数字人的方法,可以达到实时生成的效果。

下载源码

cd D:\Projects\
git clone https://github.com/Fictionarry/ER-NeRF
cd D:\Projects\ER-NeRF

下载模型

准备面部解析模型

wget https://github.com/YudongGuo/AD-NeRF/blob/master/data_util/face_parsing/79999_iter.pth?raw=true -O data_utils/face_parsing/79999_iter.pth

准备用于头部姿态估计的 3DMM 模型

wget https://github.com/YudongGuo/AD-NeRF/blob/master/data_util/face_tracking/3DMM/exp_info.npy?raw=true -O data_utils/face_tracking/3DMM/exp_info.npy
wget https://github.com/YudongGuo/AD-NeRF/blob/master/data_util/face_tracking/3DMM/keys_info.npy?raw=true -O data_utils/face_tracking/3DMM/keys_info.npy
wget https://github.com/YudongGuo/AD-NeRF/blob/master/data_util/face_tracking/3DMM/sub_mesh.obj?raw=true -O data_utils/face_tracking/3DMM/sub_mesh.obj
wget https://github.com/YudongGuo/AD-NeRF/blob/master/data_util/face_tracking/3DMM/topology_info.npy?raw=true -O data_utils/face_tracking/3DMM/topology_info.npy

准备basel面部模型

在data_utils/face_tracking文件夹中新建文件夹3DMM

下载01_MorphableModel.mat

https://faces.dmi.unibas.ch/bfm/main.php?nav=1-2&id=downloadsicon-default.png?t=N7T8https://faces.dmi.unibas.ch/bfm/main.php?nav=1-2&id=downloads

勾选选项并填写资料,提交之后一封会发一封邮件到邮箱,包含下载地址及账号密码,输入正确后即可下载到tar的压缩文件,解压后将01_MorphableModel.mat放入项目中的 data_utils/face_tracking/3DMM 文件夹中

运行 convert_BFM.py

cd data_utils/face_tracking
python convert_BFM.py

准备语音特征提取模型

下载deepspeech-0_1_0-b90017e8.pb.zip,并将里面的deepspeech-0_1_0-b90017e8.pb解压出来,放入/root/.tensorflow/models下
Releases · osmr/deepspeech_features · GitHubRoutines for DeepSpeech features processing. Contribute to osmr/deepspeech_features development by creating an account on GitHub.icon-default.png?t=N7T8https://github.com/osmr/deepspeech_features/releases

cp deepspeech-0_1_0-b90017e8.pb /root/.tensorflow/models

部署项目

Docker部署

拉取cuda116镜像
docker pull nvcr.io/nvidia/cuda:11.6.1-cudnn8-devel-ubuntu20.04
创建容器
docker run --gpus all  -it --name ernerf -v D:\Projects\ER-NeRF:/ernerf nvcr.io/nvidia/cuda:11.6.1-cudnn8-devel-ubuntu20.04
安装依赖环境
apt-get update -yq --fix-missing \
 && DEBIAN_FRONTEND=noninteractive apt-get install -yq --no-install-recommends \
    pkg-config \
    wget \
    cmake \
    curl \
    git \
    vim

# 对于Ubuntu,pyaudio需要portaudio的支持才能正常工作。
apt install portaudio19-dev
安装Miniconda3
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
sh Miniconda3-latest-Linux-x86_64.sh -b -u -p ~/miniconda3
~/miniconda3/bin/conda init
source ~/.bashrc
创建Conda环境
conda create -n ernerf python=3.10
conda activate ernerf
安装依赖库
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
pip install -r requirements.txt

conda install pytorch==1.12.1 torchvision==0.13.1 cudatoolkit=11.3 -c pytorch
conda install -c fvcore -c iopath -c conda-forge fvcore iopath
conda install pytorch3d==0.7.4 -c pytorch3d -c pytorch -c conda-forge
conda install ffmpeg
pip install tensorflow-gpu==2.8.0
pip install numpy==1.22.4
pip install opencv-python-headless
pip install protobuf==3.20.0

Windows部署

 创建Conda环境
conda create -n ernerf python=3.10
conda activate ernerf
安装cudatoolkit

下载地址:
https://developer.nvidia.com/cuda-toolkit-archiveicon-default.png?t=N7T8https://developer.nvidia.com/cuda-toolkit-archive注意版本对应关系,选择下载11.8。

安装完成,使用下面命令查看:

nvcc -V
安装cuDNN

下载地址:

https://developer.nvidia.com/rdp/cudnn-downloadicon-default.png?t=N7T8https://developer.nvidia.com/rdp/cudnn-download

选择“Download cuDNN v8.9.7 (December 5th, 2023), for CUDA 11.x”->“Local Installer for Windows (Zip)”。

然后将解压后的文件放入cuda路径下

  • lib里的文件放到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\lib
  • bin里的文件放到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\bin
  • include 里的文件放到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\include
安装gcc

下载地址:
https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/icon-default.png?t=N7T8https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/选择“MinGW-W64 GCC-8.1.0”->“x86_64-posix-seh”。

解压后把bin配置到环境变量path。

安装依赖库
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
pip install tensorflow-gpu==2.8.0
pip install protobuf==3.20.0
安装pytorch3d

下载0.7.4版本

https://github.com/facebookresearch/pytorch3d/releases/tag/v0.7.4icon-default.png?t=N7T8https://github.com/facebookresearch/pytorch3d/releases/tag/v0.7.4解压后执行安装命令

cd pytorch3d
python setup.py install
安装子模块
pip install ./raymarching
pip install ./gridencoder
pip install ./freqencoder
pip install ./shencoder

数据预处理

视频预处理

将视频放在 data/<ID>/<ID>.mp4 路径下

视频必须为 25FPS,所有帧都包含说话的人。 分辨率应约为 512x512,持续时间约为 1-5 分钟。

运行脚本以处理视频

python data_utils/process.py data/<ID>/<ID>.mp4

分布处理视频

python data_utils/process.py data/<ID>/<ID>.mp4 --task x
  • --task 1  #分离音频
  • --task 2  #生成aud_eo.npy
  • --task 3  #把视频拆分成图像
  • --task 4  #分割人像
  • --task 5  #提取背景图像
  • --task 6 #分割出身体部分
  • --task 7 #获取人脸landmarks lms文件 
  • --task 8 #获取人脸跟踪数据,这步要训练一个追踪模型,会很慢
  • --task 9 #保存所有数据

音频预处理

在训练和测试时可以指定音频功能的类型。

  • --asr <deepspeech, wav2vec>,默认值为deepspeech
python data_utils/process.py data/<ID>/<ID>.mp4 --asr wav2vec

相当于单独调用了下面的指令进行处理

DeepSpeech

python data_utils/deepspeech_features/extract_ds_features.py --input data/<name>.wav
# save to data/<name>.npy

Wav2Vec

python data_utils/wav2vec.py --wav data/<name>.wav --save_feats
# save to data/<name>_eo.npy

准备眨眼数据

下载OpenFace

https://github.com/TadasBaltrusaitis/OpenFace/wiki/Windows-Installationicon-default.png?t=N7T8https://github.com/TadasBaltrusaitis/OpenFace/wiki/Windows-Installation下载解压后,文件夹里面有个OpenFaceOffline.exe,启动GUI界面。

下载模型

以管理员身份打开PowerShell 输入:

set-executionpolicy remotesigned

选择Y 然后电脑上就可以执行自己编写的脚本文件。 

在OpenFaceOffline.exe的同级文件夹下有一个叫download_models.ps1的文件,选中download_models.ps1文件,右击鼠标选择“使用PowerShell运行”,能够自动下载模型。

生成眨眼数据

勾选OpenFaceOffline->Record->Record AUs,选择视频,最终文件会在processed文件夹。

将文件复制到ernerf/data/obama目录,重新命名成au.csv,把原本的aud.npy重新命名成aud_ds.npy。

模型训练

首次运行需要一些时间来编译 CUDA 扩展。

# 头部训练
python main.py data/obama/ --workspace trial_obama/ -O --iters 100000

# 微调嘴型动作
python main.py data/obama/ --workspace trial_obama/ -O --iters 125000 --finetune_lips --patch_size 32

# 身体训练
# 导入上一步生成的头部模型,模型路径和名称按自己环境生成的结果
python main.py data/obama/ --workspace trial_obama_torso/ -O --torso --head_ckpt <head>.pth --iters 200000

 如果asr使用wav2vec进行模型训练,可以加上--asr_model参数

# 头部训练
python main.py data/obama/ --workspace trial_obama/ -O --iters 100000 --asr_model cpierse/wav2vec2-large-xlsr-53-esperanto

# 微调嘴型动作
python main.py data/obama/ --workspace trial_obama/ -O --iters 125000 --finetune_lips --patch_size 32 --asr_model cpierse/wav2vec2-large-xlsr-53-esperanto

# 身体训练
# 导入上一步生成的头部模型,模型路径和名称按自己环境生成的结果
python main.py data/obama/ --workspace trial_obama_torso/ -O --torso --head_ckpt trial_obama/checkpoints/ngp_ep0078.pth --iters 200000 --asr_model cpierse/wav2vec2-large-xlsr-53-esperanto

模型推理

将所需要音频进行处理,同上预处理一方法相同,假设想要数字人说话的音频为aud.wav。

python nerf/asr.py --wav data/obama/aud.wav --save_feats

生成aud_eo.npy文件于data/obama中,生成完毕后,即可进行推理:

# 使用特定音频和姿势序列进行测试
# --test_train:使用训练集进行测试
# --data_range:使用此范围的姿势和眼睛序列(如果比音频短,会自动镜像和重复)
python main.py data/obama/ --workspace trial_obama_torso/ -O --torso --test --test_train --data_range 0 100 --aud data/obama/aud_eo.npy

推理完毕的视频存于trial_obama_torso/results中。

报错处理

报错:

This caused an overflow, meaning output may be incomplete. To solve, try increasing max_faces_per_bin / max_points_per_bin, decreasing bin_size, or setting bin_size to 0 to use the naive rasterization.Bin size was too small in the coarse rasterization phase.

解决方案:

修改data_utils\face_tracking\render_3dmm.py
在raster_settings中添加bin_size = 0

raster_settings = RasterizationSettings(
    image_size=(self.img_h, self.img_w),
    blur_radius=np.log(1.0 / 1e-4 - 1.0) * sigma / 18.0,
    faces_per_pixel=2,
    perspective_correct=False,
    bin_size = 0,
)

报错:

ValueError: Found array with 0 sample(s) (shape=(0, 2)) while a minimum of 1 is required by NearestNeighbors.

解决方案:

检查data/obama/parsing 这个文件夹下的图片有没有空白的,如果有需要重新裁剪视频。

  • 10
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值