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
勾选选项并填写资料,提交之后一封会发一封邮件到邮箱,包含下载地址及账号密码,输入正确后即可下载到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.https://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-archivehttps://developer.nvidia.com/cuda-toolkit-archive注意版本对应关系,选择下载11.8。
安装完成,使用下面命令查看:
nvcc -V
安装cuDNN
下载地址:
https://developer.nvidia.com/rdp/cudnn-downloadhttps://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/https://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版本
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-Installationhttps://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 这个文件夹下的图片有没有空白的,如果有需要重新裁剪视频。