基于DINet的虚拟数字人
这个可以是一个简单的用自己脸型进行训练的虚拟数字人项目,机器需求配置有点高需要24G显存,如果没有的话看看就行了,跑不起来,当然效果和之前介绍的wav2lip相似,生成速度稍微会快一些,根据自己实际情况进行取舍。
准备工作
代码地址:
- https://github.com/MRzzm/DINet
在你的项目目录下克隆该项目。
git clone https://github.com/MRzzm/DINet.git
该项目还需要openface作为辅助工具,训练模型和预测需要使用。
项目地址:
- https://github.com/TadasBaltrusaitis/OpenFace
这里在win10系统需要一个 OpenFaceOffline.exe 工具。
环境配置
首先要自己配置好 GPU 的 Pytorch 环境。如果不会的话看这里。
Win10+Python3.9+GPU版pytorch环境搭建最简流程
配置环境之后需要基于 Anaconda 环境,环境不会安装看这里。
环境搭建
创建虚拟环境并激活,python版本和三方依赖比较紧密,不要随机更换。
conda create -n py36 python=3.6
conda activate py36
安装三方依赖,需要在虚拟环境中安装。
pip install opencv_python == 4.6.0.66
pip install numpy == 1.16.6
pip install python_speech_features == 0.6
pip install resampy == 0.2.2
pip install scipy == 1.5.4
pip install tensorflow == 1.15.2
pip install torch==1.7.1+cu110 torchvision==0.8.1+cu110 torchaudio==0.10.0+cu111 -f https://download.pytorch.org/whl/torch_stable.html
配置openface,项目根目录下power shell执行download_models.ps1,执行完毕之后确保你的model文件夹是443MB后继续后面。

模型训练
这个DINet数字人需要通过openface的数据点进行训练否则无法生成。
数据准备
打开OpenFaceOffline.exe,点击File,点击open(videos),全选你要训练的人脸视频。每个视频都会跑进度图,显示置信度,基本超过95%即可用。
这里要注意文件名不能有中文或者符号,否则后面没办法处理。
这里要注意文件名不能有中文或者符号,否则后面没办法处理。
这里要注意文件名不能有中文或者符号,否则后面没办法处理。

这里配置需要注意,否则后面也会很麻烦。
这里配置需要注意,否则后面也会很麻烦。
这里配置需要注意,否则后面也会很麻烦。

每跑完一个视频片段都会在 processed 文件夹下生成对应的数据文件。

将所有分割视频重新采样为25fps并将视频放入 /asserts/split_video_25fps。
这里不要拿原视频。
这里不要拿原视频。
这里不要拿原视频。

使用openface检测所有视频的平滑面部标志。将所有 .csv 结果放入./asserts/split_video_25fps_landmark_openface。

数据预处理
从所有视频中提取帧并将帧保存在 ./asserts/split_video_25fps_frame 中。
.\py36\python.exe data_processing.py --extract_video_frame

从所有视频中提取音频并将音频保存在 ./asserts/split_video_25fps_audio 中。
.\py36\python.exe data_processing.py --extract_audio

从所有音频中提取深度语音特征并将特征保存在 ./asserts/split_video_25fps_deepspeech 中。
.\py36\python.exe data_processing.py --extract_deep_speech

从所有视频中裁剪面部并将图像保存在 ./asserts/split_video_25fps_crop_face 中。
.\py36\python.exe data_processing.py --crop_face

生成训练 json 文件 ./asserts/training_json.json 。
.\py36\python.exe data_processing.py --generate_training_json

模型训练
我的机器是4090,24G显存,这里设置的batch_size参数不要动,是已经调试好的4090最大配置。
嘴部区域
(64x64)分辨率训练 DINet
.\py36\python.exe train_DINet_frame.py --augment_num=32 --mouth_region_size=64 --batch_size=24 --result_path=./asserts/training_model_weight/frame_training_64

加载预训练模型
(面部:104x80 和嘴部:64x64)并以更高分辨率(面部:208x160 和嘴部:128x128)训练 DINet。
.\py36\python.exe train_DINet_frame.py --augment_num=100 --mouth_region_size=128 --batch_size=30 --coarse2fine --coarse_model_path=./asserts/training_model_weight/frame_training_64/netG_model_epoch_400.pth --result_path=./asserts/training_model_weight/frame_training_128

加载预训练模型
(面部:208x160 和嘴部:128x128)并以更高分辨率(面部:416x320 和嘴部:256x256)训练 DINet。
.\py36\python.exe train_DINet_frame.py --augment_num=20 --mouth_region_size=256 --batch_size=8 --coarse2fine --coarse_model_path=./asserts/training_model_weight/frame_training_128/netG_model_epoch_390.pth --result_path=./asserts/training_model_weight/frame_training_256

在剪辑训练阶段
使用感知损失、帧/剪辑 GAN 损失和同步损失。加载预训练框架模型(面部:416x320 & 嘴巴:256x256)、预训练同步网络模型(嘴巴:256x256)并在剪辑设置中训练 DINet。
.\py36\python.exe train_DINet_clip.py --augment_num=3 --mouth_region_size=256 --batch_size=1 --pretrained_syncnet_path=./asserts/syncnet_256mouth.pth --pretrained_frame_DINet_path=./asserts/training_model_weight/frame_training_256/netG_model_epoch_400.pth --result_path=./asserts/training_model_weight/clip_training_256

模型预测
需要对预测的数据进行整理才能进行预测,先看一下文件目录。

文件配置好之后执行下面的命令即可。
.\py36\python.exe inference.py --mouth_region_size=256 --source_video_path=./asserts/MrDataYang/4k_25.mp4 --source_openface_landmark_path=./asserts/MrDataYang/4k_25.csv --driving_audio_path=./asserts/MrDataYang/audio_.wav --pretrained_clip_DINet_path=./asserts/training_model_weight/clip_training_256/netG_model_epoch_182.pth