基于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初学者在不同系统上安装Python的保姆级指引

环境搭建

创建虚拟环境并激活,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  

【分享】DINet

百度网盘
夸克网盘 提取码:JQtQ