VideoReTalking 是一个新颖的系统,用于根据输入音频编辑真实世界中的说话头部视频,生成具有不同情感的高质量和唇部同步的输出视频。
该系统将此目标分解为三个顺序任务:
- 具有规范表情的人脸视频生成;
- 音频驱动的唇部同步;
- 用于提高照片真实感的人脸增强。
wav2lip和VideoReTalking超分后效果对比
文章目录
- 基本原理
- 准备工作
- 创建虚拟环境
- 激活虚拟环境
- pip安装匹配版本
- 模型预测对口型
- 必要的数据准备
- 命令行预测
- 参数解释
- 其他使用方法
- WebUI预测
基本原理
- 人脸视频生成:使用表情编辑网络修改每一帧的表情,使其与相同的表情模板相匹配,从而生成具有规范表情的视频。
- 音频驱动的唇部同步:将该视频与给定的音频一起输入唇部同步网络,生成唇部同步视频。
- 人脸增强:通过身份感知的人脸增强网络和后处理来提高合成人脸的照片真实感。
所有这些步骤都使用基于ML和DL学习的方法,并且可以在没有任何用户干预的情况下按顺序进行。
准备工作
从github上下载源码,下载完毕之后下载模型 pre-trained models。
模型分这么多种类,将全部模型复制到 checkpoints 中。
创建虚拟环境
切记这个里面有编译的环境在里面,不要移动创建好的虚拟环境,除非你能自己修改源码修改对应的路径文件。
conda create -n VideoReTalking python=3.8
激活虚拟环境
在GIT环境目录下激活,这里是我的路径,修改成你自己的。
conda activate VideoReTalking
pip安装匹配版本
确保安装了所有必要的依赖项,可以通过requirements.txt文件进行安装。
这里会有个问题要根据显卡选择torch版本,我的显卡是RTX4090,我选择这个安装命令。
pip install torch==2.0.0+cu118 torchvision==0.15.1+cu118 torchaudio==2.0.1 --index-url https://download.pytorch.org/whl/cu118 pip install -r requirements.txt
其他显卡根据情况自行安装。
pip install torch==1.9.0+cu111 torchvision==0.10.0+cu111 -f https://download.pytorch.org/whl/torch_stable.html pip install -r requirements.txt
模型预测对口型
必要的数据准备
事先还要准备好素材视频和音频文件,这里分别放置原始的图片,音频以及视频文件。
其中音频和视频文件放在项目目录下的./examples/audio和 ./examples/face中即可。
命令行预测
使用预训练模型进行快速推理,可以测试任何说话的人脸视频,无需手动对齐。
\VideoReTalking\python.exe inference.py --face examples/face/1.mp4 --audio examples/audio/1.wav --outfile results/1_1.mp4 python inference.py --face examples/face/1.mp4 --audio examples/audio/1.wav --outfile results/1_1.mp4
推理总共分6步,依次执行后会在result文件夹下生成对应的视频文件。
参数解释
基础参数设置base_options.py
参数 类型 默认值 解释 –name str ‘face_recon’ 实验名称,决定样本和模型存储的位置 –gpu_ids str ‘0’ GPU的ID,例如:0、0,1,2、0,2。使用-1表示CPU –checkpoints_dir str ‘./checkpoints’ 模型存储的目录 –vis_batch_nums float 1 用于可视化的图像批次数 –eval_batch_nums float inf 用于评估的图像批次数,设置为inf表示所有图像都参与评估 –use_ddp bool True 是否使用分布式数据并行 –ddp_port str ‘12355’ DDP端口 –display_per_batch bool True 是否使用批次显示损失 –add_image bool True 是否将图像添加到Tensorboard中 –world_size int 1 分布式数据并行的总批次数 –model str ‘facerecon’ 选择要使用的模型 –epoch str ‘latest’ 要加载的模型的训练轮数,设置为’latest’表示使用最新的缓存模型 –verbose bool 如果指定,则打印更多调试信息 –suffix str ‘’ 自定义后缀,将添加到opt.name中,例如:{model}_{netG}_size{load_size} 推理工具参数设置inference_utils.py
参数名 类型 默认值 描述 DNet_path str ‘checkpoints/DNet.pt’ DNet模型的路径 LNet_path str ‘checkpoints/LNet.pth’ LNet模型的路径 ENet_path str ‘checkpoints/ENet.pth’ ENet模型的路径 face3d_net_path str ‘checkpoints/face3d_pretrain_epoch_20.pth’ face3d模型的路径 face str None 包含要使用的人脸的视频/图像的文件路径,此参数必填 audio str None 要用作原始音频源的视频/音频文件的文件路径,此参数必填 exp_img str ‘neutral’ 表情模板。可以是’neutral’,‘smile’或图像路径。默认为’neutral’ outfile str None 要保存结果视频的路径 fps float 25.0 只有当输入为静态图像时可以指定的帧率,默认为25.0 pads list [0, 20, 0, 0] 填充(上、下、左、右)。请确保至少包含下巴区域 face_det_batch_size int 4 人脸检测的批处理大小 LNet_batch_size int 16 LNet的批处理大小 img_size int 384 图像的大小(宽度和高度相等) crop list [0, -1, 0, -1] 将视频裁剪为较小的区域(上、下、左、右)。在resize_factor和rotate参数之后应用。如果有多个人脸,这很有用。 -1表示根据高度、宽度自动推断值 box list [-1, -1, -1, -1] 为人脸指定一个固定的边界框。如果人脸检测失败,请仅在万不得已时使用此选项。仅在人脸几乎不移动时有效。 语法:(上、下、左、右) nosmooth bool False 在短时间窗口内阻止平滑人脸检测 static bool False 指定输入是否为静态图像 up_face str ‘original’ 人脸朝向的方向。可以是’original’或其他用户指定的方向 one_shot bool False 一次处理整个视频而不是逐帧处理 without_rl1 bool False 不使用相对l1损失 tmp_dir str ‘temp’ 保存临时结果的文件夹路径 re_preprocess bool False 重新预处理视频(例如,检测新的人脸) 模型训练参数设置train_options.py,训练模型根据实际情况调整。
训练数据参数 数据类型 默认值 解释说明 data_root str ./ 数据集根目录 flist str datalist/train/masks.txt 训练集掩膜文件名列表 batch_size int 32 批处理大小 dataset_mode str flist 选择数据集加载方式。[None serial_batches bool 如果为True,按顺序获取图像以形成批次;否则随机获取图像。 num_threads int 4 加载数据的线程数 max_dataset_size int inf 数据集允许的最大样本数。如果数据集目录包含的样本数超过max_dataset_size,则仅加载子集。 preprocess str shift_scale_rot_flip 加载时图像的缩放和裁剪方式。[shift_scale_rot_flip use_aug bool True 是否使用数据增强 验证参数 数据类型 默认值 解释说明 flist_val str datalist/val/masks.txt 验证集掩膜文件名列表 batch_size_val int 32 验证集的批处理大小 可视化参数 数据类型 默认值 解释说明 display_freq int 1000 在屏幕上显示训练结果的频率 print_freq int 100 在控制台上显示训练结果的频率 网络保存和加载参数 数据类型 默认值 解释说明 save_latest_freq int 5000 保存最新结果的频率 save_epoch_freq int 1 在每个epoch结束时保存检查点的频率 evaluation_freq int 5000 评估的频率 save_by_iter bool 是否按迭代保存模型 continue_train bool 继续训练:加载最新模型 epoch_count int 1 起始epoch计数,我们按,+,…保存模型 phase str train 训练、验证、测试等 pretrained_name str None 从其他检查点继续训练 训练参数 数据类型 默认值 解释说明 n_epochs int 20 初始学习率的epoch数 lr float 0.0001 Adam的初始学习率 lr_policy str step 学习率策略。[linear lr_decay_epochs int 10 每lr_decay_epochs个epoch乘以一个gamma 脸部对焦参数配置facerecon_model.py,这些参数默认即可。
网络结构参数 数据类型 默认值 解释说明 net_recon str ‘resnet50’ 网络结构 init_path str ‘checkpoints/init_model/resnet50-0676ba61.pth’ 初始化路径 use_last_fc bool False 是否对最后一个全连接层进行零初始化 bfm_folder str ‘BFM’ BFM文件夹路径 bfm_model str ‘BFM_model_front.mat’ BFM模型 渲染器参数参数 数据类型 默认值 解释说明 focal float 1015. 焦距 center float 112. 中心点 camera_d float 10. 相机参数d z_near float 5. 近截面 z_far float 15. 远截面 训练参数 数据类型 默认值 解释说明 net_recog str ‘r50’ 人脸识别网络结构 net_recog_path str ‘checkpoints/recog_model/ms1mv3_arcface_r50_fp16/backbone.pth’ 人脸识别网络的权重文件路径 use_crop_face bool False 是否使用裁剪掩码来计算照片损失 use_predef_M bool False 是否使用预定义的M矩阵来处理预测的人脸特征 (M矩阵用于三维形状预测) 数据增强参数参数 数据类型 默认值 解释说明 shift_pixs float 10.0 像素平移大小 scale_delta float 0.1 尺度缩放因子的变化范围 rot_angle float 10.0 旋转角度的变化范围 (单位:度) 损失权重参数 数据类型 默认值 解释说明 w_feat float 0.2 特征损失权重 w_color float 1.92 颜色损失权重 w_reg float 3.0e-4 形状正则化损失权重 w_id float 1.0 身份正则化损失权重 w_exp float 0.8 表情正则化损失权重 w_tex float 1.7e-2 纹理正则化损失权重 w_gamma float 10.0 Gamma矫正损失权重 w_lm float 1.6e-3 关键点坐标损失权重 w_reflc float 5.0 反照率损失权重 其他使用方法
表情控制参数操作,可以通过添加以下参数来控制表情:
参数 解释 –exp_img 预定义的表情模板。默认为"neutral"(中性表情)。可以选择"smile"(微笑)或提供一个图片路径。 –up_face 可以选择"surprise"(惊讶)或"angry"(愤怒)来使用 GANimation 修改上半部分脸部的表情。 WebUI预测
项目中自带WebUI启动文件,是基于gradio开发的页面。
由于代码中素材文件是写死的如果想更换素材并且在页面中显示必须进行一些修改。
添加音频和视频文件的路径目录。
audio_list = os.listdir("./examples/audio") video_list = os.listdir("./examples/face")
添加路径并遍历文件到对应的文件位置。
with gradio.Row(): gradio.Examples( label="Face Examples", examples=[ os.path.join(os.path.dirname(__file__), "examples/face/" + str(i)) for i in video_list ], inputs=[v], fn=convert, ) with gradio.Row(): gradio.Examples( label="Audio Examples", examples=[ os.path.join(os.path.dirname(__file__), "examples/audio/" + str(i)) for i in audio_list ], inputs=[a], fn=convert, )
然后启动webUI.py文件,然后在浏览器中就可以看到自己添加好的对应文件啦。
最终出来的结果是这样的,视频效果呢个人感觉比wav2lip强一些,如果视频分辨率不大的话无所谓,如果原始分辨率大的话需要进行超分操作。
来看一下和wav2lip的对比吧。虽然处理效率慢了一点淡出出来的效果更佳清楚。