Wav2Lip原理以及训练

news2024/9/29 5:23:30

原理

1: 音视频同步判别器

常规SyncNet:
功能:音频和嘴唇同步
实质:判断音频和唇形在某个共同参数空间下的相似性。
网络结构:
一种伪孪生网络结构,分别提取嘴形特征和音频特征,然后通过对比损失计算两者之间的距离。
face_encoder ,audio_encoder,

(如果想要自己训练一个syncnet模型的话, 简单的从网上拉一些看似音视频已经对齐的资源是不够的, 有可能仍存在<100 ms的非同步, 所以需要干净的经过检查的数据. 作者的做法是先拿未筛选的数据训练一版模型, 然后通过卡阈值把训练集中一部分false positive (即假对齐)给抛弃掉, 从而达到非人工筛选的目的)

目前公开的训练SyncNet的数据集LRS2,处理过后:
1)裁剪人脸图片
是否可以只裁剪嘴部区域,训练SyncNet,这样网络理论收敛快一些。
2)比较模糊
是否可以用codeformer把输入图增强一下

1,expert lip-sync discriminator:

在传统SyncNet上做一下修改:
1)使用彩色图代替之前的灰度图
2)使用残差连接,把网络做的更深
3)使用不同loss函数:二进制互熵损失余弦相似性loss
论文中给出的数据:数据集LRS2,训练大约29小时,batchsize:64, 时间窗口Tv:5,优化器:Adam,初始化学习率:1e−3。。。在LRS2test上,准确率91%

在lrs2验证集上的得分情况:
论文中的表现:
在这里插入图片描述
实际测试的表现:
在这里插入图片描述
Lip-Sync Error-Distance:平均嘴唇和音频之间的误差距离,越小越好
Lip-Sync Error-Confidence:平均置信度得分,越大越好

2:视觉质量判别器

visual quality discriminator:由卷积块的堆叠组成。每个块由卷积层和Leaky ReLU激活组成。用来提升生成图片的质量(可加可不加)

3:wav2lip

网络分3个模块:1)Identity Encoder:身份编码器是对随机参考帧R进行编码的残差卷积层的堆叠,将其沿着通道轴与姿态先验P(下半部分被掩蔽的目标face)级联。
2)Speech Encoder:语音编码器是2D卷积的堆叠,以编码输入语音段S,然后将其与face representation级联
3)Face Decoder:face解码器也是卷积层的堆叠,沿着转置卷积上采样。
Loss :

损失有3部分:重建损失+同步损失+gan损失
重建损失:L1范
在这里插入图片描述

推理

推理过程:

在这里插入图片描述
1)对输入语音提取Mel特征,得到语音特征块
2)对全脸+去掉下半张脸(6* 96* 96)两组人脸提取图片特征
3)将上面两种特征输入到wav2lip网络,生成带口型的人脸
4)将带口型的人脸贴回原图,逐帧写成纯图像视频
5)用ffmpeg合成带语音的视频

在使用原工程run Inference,需要注意的地方:

1:如果嘴超出检测出的脸部框,需要调–pads,比如–pads 0 20 0 0
2:如果您看到口腔位置脱臼或一些怪异的伪影,例如两个嘴,可能是因为过度平滑的面部检测。使用-nosmooth参数,然后再尝试。
3:尝试 - resize_factor参数,以获取较低的分辨率视频。因为这些模型是在分辨率较低的面孔上训练的。与1080p视频相比,您可能会获得720p视频的更好。
4:没有GAN的WAV2LIP模型通常需要对以上两个进行更多实验,以获得最理想的结果,有时也可以为您带来更好的结果。

训练

训练之前,需要注意的几个地方:
1:可能无法通过在单个人的几分钟视频训练/微调来获得良好的结果。
2:在训练wav2lip之前,需要用你自己的数据集训练expert discriminator
3:如果是您自己从Web下载的数据集,则在大多数情况下需要sync-corrected同步校正。
4:FPS的更改将需要重大的代码更改。
5:expert discriminator的评估损失应降至约0.25,wav2lip评估同步损失应降至〜0.2,以获得良好的结果。

expert lip-sync discriminator英文训练

数据处理:
syncnet_mel_step_size=16。#mel图谱的长度
syncnet_T = 5。 #窗口步长,5帧
在一段短视频中,抽取随机参考帧,然后,基于这帧随机参考帧,向后步长为5,获取连续5帧视频图片,作为图像输入,基于这帧随机参考帧,向后步长16,获取视频图片对应的mel图谱。
使用官方的filelists(train.txt,val.txt,test.txt)索引文件:
在这里插入图片描述
训练集上的平均loss=0.19
Val上情况:
从头重训的syncnet,未加预训练模型:
均值:0.3478966458918365
test上情况:
从头重训的syncnet,未加预训练模型:
平均loss=0.35438132368961206

训练中文syncnet:

1)从头使用中文数据集训,不加载预训练模型
训练集loss和验证集loss都在0.69,没有一点要降的趋势。
在这里插入图片描述
2)加载英文预训练模型
在这里插入图片描述
迭代104次epoch后,在验证集上达到最小Loss=0.371,此时在训练集上的loss=0.3左右。继续训,模型开始过拟合。

2:Train the Wav2Lip model(s).

训练流程:

  1. 前向:使用语音特征块+图片特征送到wav2lip网络,生成带口型的人脸g;
    初期:syncnet_wt=0,sync_loss=0。(同步损失=0)
    l1loss = recon_loss(g, gt)。#gt是有口型的标签图 ,(重建loss)
    总 loss:
    loss = hparams.syncnet_wt * sync_loss + (1 - hparams.syncnet_wt) * l1loss
    (如果是训练高清Wav2Lip ,还有一个gan loss
    loss = hparams.syncnet_wt * sync_loss + hparams.disc_wt * perceptual_loss +
    (1. - hparams.syncnet_wt - hparams.disc_wt) * l1loss
    这里的gan loss(perceptual_loss),是指使用视觉质量判别器对g进行一次重建,然后用重建的结果与g计算二元交叉熵,比较两者之间的分布差异,
    false_pred_loss = F.binary_cross_entropy(self.binary_pred(false_feats).view(len(false_feats), -1),
    torch.ones((len(false_feats), 1)).cuda())
    用来增强唇形生成的质量。)
    2)loss.backward()
    optimizer.step()
    3)测试:
    跑测试集测试本次训练的wav2lip模型效果,就是用syncnet测试。sync_loss = get_sync_loss(mel, g),mel:原音频,g:wav2lip模型生成的人脸图,送到syncnet模型中,输出对应特征向量,然后计算两者之间的cosine_similarity。
    4)一直迭代训练,当测试集的cos相似度小于 .75时,syncnet_wt置0.01,启动syncnet loss,指导训练。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/687925.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VS2017+OpenCV4.5.1 安装与配置,扩展模块opencv_contrib的安装与配置

文章目录 VS2017OpenCV4.5.1 安装与配置&#xff0c;扩展模块opencv_contrib的安装与配置1、OpenCV下载&#xff1a;&#xff08;1&#xff09;下载地址&#xff1a;https://opencv.org/releases/page&#xff08;2&#xff09;解压到指定文件夹&#xff1a; 2、配置环境&#…

如何进行可视化的数据过滤?Sugar BI 的过滤组件教你快速实现

Sugar BI 中支持了 10种过滤组件&#xff0c;这些过滤组件都是让用户在浏览报表或大屏的时候&#xff0c;能够交互式的对页面上的图表进行数据的过滤。所有过滤组件对图表的数据过滤设置都是一样的&#xff0c;如下&#xff1a; 例如页面中已有两个图表&#xff08;这两个图表…

人脑髓鞘化

髓鞘化 大纲&#xff1a;髓鞘化定义&#xff1b;髓鞘化能用来干嘛&#xff1b;髓鞘化现阶段存在的痛点&#xff1b;现有方法如何解决问题&#xff1b;我们方法的优势。 定义 髓鞘化是指髓鞘发展的过程&#xff0c;它使神经兴奋在沿神经纤维传导时速度加快&#xff0c;并保证…

开窗函数分享

开窗函数定义 开窗函数&#xff1a;用于为行定义一个窗口&#xff0c;它一组值进行操作&#xff0c;不需要使用group by子句对数据进行分组&#xff0c;能够在同一行中同时返回基础行的列和聚合列。 划重点!!! 开窗函数返回&#xff1a;基础行列、聚合列 下面通过例子看一下…

OJ# 376 机器翻译

题目描述 ​ 小李的电脑上安装了一个机器翻译软件&#xff0c;他经常用这个软件来翻译英语文章。 ​这个翻译软件的原理很简单&#xff0c;它只是从头到尾&#xff0c;依次将每个英文单词用对应的中文含义来替换。对于每个英文单词&#xff0c;软件会先在内存中查找这个单词的…

简单易用多git服务器ssh密钥配置管理

文章目录 前言一、什么是ssh-key二、配置步骤添加ssh-key配置多ssh-key 总结 前言 快速理解如何配置管理多个git服务器的ssh&#xff0c;当我们有多个git帐号时会涉及如何管理不同的remote使用不同的git账户登陆推送 当前repo的origin remote是github&#xff0c;我们在推送时…

EMMC基础知识总结

1、说明 1.0 整体架构 ‘ EMMC最简单的可理解为带有控制器的FLASH&#xff0c;具体结构如下&#xff1a; EMMC&#xff1a; Embedded multiMediaCard EMMC. EMMC内部&#xff1a; host interface 、 flash controller 、 flash memory 1.1 flash memory 结构 EMMC 中一般…

学习Vue3——watchEffect(高级侦听器)

立即运行一个函数&#xff0c;同时响应式地追踪其依赖&#xff0c;并在依赖更改时重新执行。 watchEffect有两个参数 第一个参数就是要运行的副作用函数 第二个参数是一个可选的选项&#xff0c;可以用来调整副作用的刷新时机或调试副作用的依赖 API—watchEffect 基本用法 …

电脑必备,推荐几款好用的程序软件,让你工作更加高效

在当今的信息化时代&#xff0c;电脑已成为我们日常生活中必不可少的工具。而在电脑上安装一些好用的程序软件&#xff0c;能够大大提高我们的工作效率和体验。但是市面上的软件五花八门&#xff0c;要如何选择呢&#xff1f;下面将为大家推荐几款值得使用的程序软件&#xff0…

告别脚本小子系列丨JAVA安全(8)——反序列化利用链(下)

0x01 前言 在前面的文章中介绍了基于CC链的反序列化利用方式&#xff0c;并且通过最终调用Runtime类的exec方法达到命令执行的效果。在CC链中还可以通过xalan来执行命令。 xalan是java操作xml的库&#xff0c;属于java内置的官方库之一&#xff0c;在CC链中主要用到的是com.sun…

论文研读|TNNLS 期刊近三年对话生成工作介绍(2篇)

前言&#xff1a;本篇博客记录TNNLS期刊近三年的对话生成相关工作中本人比较感兴趣的两篇工作。首先给大家分享一下论文精确查找的方式&#xff0c;然后对两篇工作的主要思想进行简要介绍。 目录 1. 论文精确查找方法2. 论文简介2.1 面向用户个性保持与回复多样性的两阶段对话生…

错误:No module named ‘osgeo’

from osgeo import gdal 报错&#xff1a;No module named ‘osgeo’ pip install gdal 会出错&#xff0c;也不知道什么原因。 解决方案&#xff1a; 下载whl,然后pip install .whl即可。 详细步骤如下&#xff1a; whl下载地址&#xff1a;https://www.lfd.uci.edu/~go…

基于java+servlet+mysql-图书商城

基于javaservletmysql-图书商城 一、系统介绍二、功能展示1.项目骨架2.首页3.图书详情4.我的订单5.我的购物车6、注册7、登录8、图书管理9、订单管理 四、其它1.其他系统实现五.获取源码 一、系统介绍 项目类型&#xff1a;Java web项目 项目名称&#xff1a;基于javaservlet…

浅谈企业能源监测管理系统的设计与应用

安科瑞 华楠 摘要: 针对企业目前能源监测现状, 结合企业信息化建设情况和发展需要, 介绍了能源监测管理信息系统, 提出了企业能源监测管理系统建设建议。 关键词:管理系统; 能源监测; 企业信息化 0 引言 节能降耗是缓解中国资源约束的根本出路, 也是提高企业自主创新能力的…

【机器学习】如何选择合适的假设函数

在前面的线性回归中&#xff0c;我们可以使用不同次数的多项式对数据集进行拟合&#xff0c;但是选择次数过低的多项式会导致欠拟合&#xff0c;选用次数过多的多项式会过拟合&#xff0c;那么如何选择合适的多项式呢&#xff1f;这就是本文需要解决的问题。 想要了解自己训练…

什么是α测试β测试和灰度测试?

吃软件测试这碗饭的&#xff0c;如果基础理论都不懂&#xff0c;谈何长久&#xff1f; 欢迎来学习本系列&#xff0c;基础理论比较枯燥&#xff0c;这也是为什么现在很少人掌握的主要原因。热饭尽量用浅显易懂 生动的例子 来帮助大家学习基础理论&#xff0c;所以请耐心看完此系…

纯JavaScript简单实现移动端网页的上拉加载、下拉刷新

公司要在安卓软件中&#xff0c;添加H5网页包&#xff0c;实现订单卡片列表&#xff0c;要求有上拉加载、下拉刷新的功能。 经过搜索资料后&#xff0c;实现如下&#xff1a; 创建一个类PullData class PullData() {/*** 类的构造函数&#xff0c;在new PullData({xx: xxx})时…

尚硅谷甄选--(暂时不更新,实习,后期有时间更)

文章目录 搭建后台管理系统模板项目的资源地址项目初始化2.1.1环境准备2.1.2初始化项目2.2项目配置一、eslint配置1.1vue3环境代码校验插件1.2修改.eslintrc.cjs配置文件1.3.eslintignore忽略文件1.4运行脚本 二、配置**prettier**2.1安装依赖包2.2.prettierrc.json添加规则2.3…

OpenCV——总结《车牌识别》

1.图片中的hsv hsv提取蓝色部分 # hsv提取蓝色部分 def hsv_color_find(img):img_copy img.copy()cv2.imshow(img_copy, img_copy)"""提取图中的蓝色部分 hsv范围可以自行优化cv2.inRange()参数介绍&#xff1a;第一个参数&#xff1a;hsv指的是原图第二个参…

阿里老员工吐槽:部门来了个“卷”王同事,我们都要跟着加班..

随着IT互联网热愈演愈烈&#xff0c;大批应届生选择毕业后进入IT圈&#xff0c;还有另一批打工人冲着高薪福利待遇转行IT行业&#xff0c;越来越多人涌入程序员大军中。加之互联网行业的火爆&#xff0c;催生了大量程序员岗位&#xff0c;门槛也较之前来说越来越低了&#xff0…