2D数字人,唇形驱动,DINet项目的模型训练和推理
DINet + OpenFace 实现唇形驱动,比 wav2lip 效果好而且不用修改神经网络,不用额外训练同步判别器
简单的模型训练和推理,不涉及源码等的修改,超级简单!!!!
数据集准备
几段录好的人物说话的视频,要求:
- 人物口型清晰
- 视频帧数统一调整为
25 fps
- 视频录得多一点
- 找不到的可以使用
AVSpeech
数据集,自行百度
需要下载的文件和工具
-
OpenFace
x64_github
x86_github
用于人脸关键点的检测,训练和推理的时候都需要 -
asserts.zip
将该文件放在项目的根目录,并解压到asserts
文件夹
本来想分享阿里云盘的,但是不让分享,下载的网络问题各位自行解决吧
数据集预处理
打开 OpenFaceOffline.exe
(下载的我提供的网盘文件,不然要先运行 download_models.ps1
下载模型文件,下载不动的自行解决网络问题)’=
!!!!必须先进行如下设置再进行接下来的操作!!!!
设置完成后,点击 File
===> Open Video(s)
,采集自己的视频,完成后会在 processed 文件夹下生成如下三个文件
我们只需要 .csv
文件,将其放在
./DINet/asserts/training_data/split_video_25fps_landmark_openface/
将你的数据集视频(不是这里的 .avi
文件)放在
./DINet/asserts/training_data/split_video_25fps/
依次运行以下代码进行数据处理
从所有视频中提取帧并将帧保存在“./asserts/training_data/split_video_25fps_frame”中
python data_processing.py --extract_video_frame
从所有视频中提取音频并将音频保存在“./asserts/training_data/split_video_25fps_audio”中
python data_processing.py --extract_audio
从所有音频中提取深度语音特征并将特征保存在“./asserts/training_data/split_video_25fps_deepspeech”中
python data_processing.py --extract_deep_speech
从所有视频中裁剪面部并将图像保存在“./asserts/training_data/split_video_25fps_crop_face”中
python data_processing.py --crop_face
生成训练 json 文件“./asserts/training_data/training_json.json”
python data_processing.py --generate_training_json
处理完成后目录
模型训练
分为 Frame training
和 Clip training
两步。
首先,以 104x80(嘴部区域为 64x64)分辨率训练 DINet。
python train_DINet_frame.py --augment_num=32 \
--mouth_region_size=64 --batch_size=24 \
--result_path=./asserts/training_model_weight/frame_training_64
当损失收敛时,您可以停止训练(我在 274 epoch 时停止)。
注:关于收敛判断,可以观察输出日志中的学习率参数 lr_g
当它到原来的 50%
就差不多了,下同
加载预训练模型(面部:104x80 和嘴巴:64x64)并以更高分辨率训练 DINet(面部:208x160 和嘴巴:128x128)
python train_DINet_frame.py --augment_num=100 \
--mouth_region_size=128 --batch_size=80 --coarse2fine \
--coarse_model_path=./asserts/training_model_weight/frame_training_64/xxxxxx.pth \
--result_path=./asserts/training_model_weight/frame_training_128
当损失收敛时,您可以停止训练(我在 266 epoch 时停止)
加载预训练模型(面部:208x160 和嘴巴:128x128)并以更高分辨率训练 DINet(面部:416x320 和嘴巴:256x256)
python train_DINet_frame.py --augment_num=20 \
--mouth_region_size=256 --batch_size=12 --coarse2fine \
--coarse_model_path=./asserts/training_model_weight/frame_training_128/xxxxxx.pth \
--result_path=./asserts/training_model_weight/frame_training_256
当损失收敛时,您可以停止训练(我在 396 epoch 时停止)。
加载上面预训练的
256x256
的模型、预训练的syncnet
模型(嘴巴:256x256),执行以下代码进行最终训练 DINet 模型。
python train_DINet_clip.py --augment_num=3 --mouth_region_size=256 \
--batch_size=3 --pretrained_syncnet_path=./asserts/syncnet_256mouth.pth \
--pretrained_frame_DINet_path=./asserts/training_model_weight/frame_training_256/xxxxx.pth \
--result_path=./asserts/training_model_weight/clip_training_256
当损失收敛时,您可以停止训练(我在 276 epoch 时停止)
最终训练完成,目录结构如下,其中 clip_training_256
中我们推理要使用的模型。
推理
上传自己视频
、音频
和 .csv
文件
执行以下代码
python inference.py \
--mouth_region_size=256 \
--source_video_path=./DINet/inputs/video/test.mp4 \
--source_openface_landmark_path=./DINet/inputs/csv/test.csv \
--driving_audio_path=./DINet/inputs/audio/007537.wav \
--pretrained_clip_DINet_path=./asserts/training_model_weight/clip_training_256/netG_model_epoch_276.pth
更多推荐
所有评论(0)