当前位置:   article > 正文

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

er-nerf训练

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

下载源码

  1. cd D:\Projects\
  2. git clone https://github.com/Fictionarry/ER-NeRF
  3. 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 模型

  1. 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
  2. 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
  3. 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
  4. 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

  1. cd data_utils/face_tracking
  2. 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
安装依赖环境
  1. apt-get update -yq --fix-missing \
  2.  && DEBIAN_FRONTEND=noninteractive apt-get install -yq --no-install-recommends \
  3.     pkg-config \
  4.     wget \
  5.     cmake \
  6.     curl \
  7.     git \
  8.     vim
  9. # 对于Ubuntu,pyaudio需要portaudio的支持才能正常工作。
  10. apt install portaudio19-dev
安装Miniconda3
  1. wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
  2. sh Miniconda3-latest-Linux-x86_64.sh -b -u -p ~/miniconda3
  3. ~/miniconda3/bin/conda init
  4. source ~/.bashrc
创建Conda环境
  1. conda create -n ernerf python=3.10
  2. conda activate ernerf
安装依赖库
  1. pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
  2. pip install -r requirements.txt
  3. conda install pytorch==1.12.1 torchvision==0.13.1 cudatoolkit=11.3 -c pytorch
  4. conda install -c fvcore -c iopath -c conda-forge fvcore iopath
  5. conda install pytorch3d==0.7.4 -c pytorch3d -c pytorch -c conda-forge
  6. conda install ffmpeg
  7. pip install tensorflow-gpu==2.8.0
  8. pip install numpy==1.22.4
  9. pip install opencv-python-headless
  10. pip install protobuf==3.20.0

Windows部署

 创建Conda环境
  1. conda create -n ernerf python=3.10
  2. 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。

安装依赖库
  1. conda install pytorch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 pytorch-cuda=11.8 -c pytorch -c nvidia
  2. pip install -r requirements.txt
  3. pip install tensorflow-gpu==2.8.0
  4. 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解压后执行安装命令

  1. cd pytorch3d
  2. python setup.py install
安装子模块
  1. pip install ./raymarching
  2. pip install ./gridencoder
  3. pip install ./freqencoder
  4. 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

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

Wav2Vec

  1. python data_utils/wav2vec.py --wav data/<name>.wav --save_feats
  2. # 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 扩展。

  1. # 头部训练
  2. python main.py data/obama/ --workspace trial_obama/ -O --iters 100000
  3. # 微调嘴型动作
  4. python main.py data/obama/ --workspace trial_obama/ -O --iters 125000 --finetune_lips --patch_size 32
  5. # 身体训练
  6. # 导入上一步生成的头部模型,模型路径和名称按自己环境生成的结果
  7. python main.py data/obama/ --workspace trial_obama_torso/ -O --torso --head_ckpt <head>.pth --iters 200000

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

  1. # 头部训练
  2. python main.py data/obama/ --workspace trial_obama/ -O --iters 100000 --asr_model cpierse/wav2vec2-large-xlsr-53-esperanto
  3. # 微调嘴型动作
  4. python main.py data/obama/ --workspace trial_obama/ -O --iters 125000 --finetune_lips --patch_size 32 --asr_model cpierse/wav2vec2-large-xlsr-53-esperanto
  5. # 身体训练
  6. # 导入上一步生成的头部模型,模型路径和名称按自己环境生成的结果
  7. 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中,生成完毕后,即可进行推理:

  1. # 使用特定音频和姿势序列进行测试
  2. # --test_train:使用训练集进行测试
  3. # --data_range:使用此范围的姿势和眼睛序列(如果比音频短,会自动镜像和重复)
  4. 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

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

报错:

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

解决方案:

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/412861
推荐阅读
相关标签
  

闽ICP备14008679号