【AI数字人-论文】Wav2lip论文解读

news2025/1/24 10:45:19

文章目录

  • Wav2lip
    • 前言
    • Lip-sync Expert Discriminator
    • Generator
      • visual quality discriminator
      • 生成器总损失函数
    • 论文

Wav2lip

前言

Wav2Lip 是第一个通用说话者的模型,可生成与真实同步视频相匹配的口型同步精度的视频,它的核心架构概括为“通过向训练有素的口型同步专家学习,生成准确的口型同步”。基于此理念,Wav2lip包括一个生成器和两个判别器。

  • 一个可以准确判别真实视频中声音和嘴型同步的专家唇同步鉴别器(expert lip-sync discriminator);
  • 一个负责生成包含目标口型人脸图像的生成器(generator);
  • 一个视觉质量判别器(visual quality discriminator),用于提升图片质量。wav2lip中的两个判别器,一个为了准确的lip-sync,一个为了更好的视觉质量。

Lip-sync Expert Discriminator

专家口型同步判别器由SyncNet改进而来。

SyncNet包括一个人脸编码器和音频编码器,这两个编码器均是由一系列2D卷积层组成。人脸编码器的输入是一个由连续 T u T_{u} Tu个下半部分人脸帧组成的窗口 V V V;音频编码器的输入是一个大小为 T a × D T_{a} \times D Ta×D的语音片段 S S S。其中 T u T_{u} Tu T a T_{a} Ta分别是视频和音频时间步长。通过随机采样 T a × D T_{a} \times D Ta×D大小的音频窗口【此窗口要么与视频对齐(in-sync),要么来自不同的时间步(out-of-sync)】,进行训练,从而来区分音频和视频之间的同步。损失函数选择的是L2距离,最小化两个编码器输出的嵌入特征之间的L2距离。

SyncNet的网络架构代码如下所示:

class SyncNet_color(nn.Module):
    def __init__(self):
        super(SyncNet_color, self).__init__()
        self.face_encoder = nn.Sequential(*)
        self.audio_encoder = nn.Sequential(*)

    def forward(self, audio_sequences, face_sequences):
        # print(f'audio_sequences: {audio_sequences.size()}') # audio_sequences := (B, dim, T)
        face_embedding = self.face_encoder(face_sequences)
        audio_embedding = self.audio_encoder(audio_sequences)

        audio_embedding = audio_embedding.view(audio_embedding.size(0), -1)
        face_embedding = face_embedding.view(face_embedding.size(0), -1)
        
        audio_embedding = F.normalize(audio_embedding, p=2, dim=1)
        face_embedding = F.normalize(face_embedding, p=2, dim=1)
        
        return audio_embedding, face_embedding

wav2lip为了能够训练得到更精确的口型同步判别器,对SyncNet进行了三个方面的改进。

  1. 人脸编码器以RGB图像替换灰度图作为输入
  2. 增加模型的深度
  3. 损失函数更改为:余弦相似度二元交叉熵损失
# wav2lip损失函数
logloss = nn.BCELoss()
def cosine_loss(a, v, y):
    d = nn.functional.cosine_similarity(a, v)
    loss = logloss(d.unsqueeze(1), y)
    return loss

训练细节如下所示:
数据集:约29个小时的LRS2训练集
batch size: 64
T u T_{u} Tu : 5
优化器:Adam
初始学习率:0.001
准确率:91%

有了更精确的口型同步判别器后,可以在训练过程中利用它来对生成器进行优化,提高生成器生成口型的准确性。

Generator

生成器 G G G负责生成目标口型的人脸图像,由三部分组成:身份编码器(Identity Encoder)、语音编码器(Speech Encoder)和人脸解码器(Face Decoder),这三部分均是由堆叠的2D卷积层组成。概括来说,生成器是一个2D卷积的编码器-解码器结构。

  • 身份编码器的把随机参考帧 R R R与先验姿势 P P P(下半部分被mask的目标脸)按通道维度拼接作为输入,编码身份特征。先验姿势帧的下半部分被mask,但是提供了目标人脸的姿态信息;参考帧则包含目标人脸的完整外观,用于唇部形状和运动的合成。
  • 语音编码器用于编码输入的语音片段
  • 人脸解码器以编码后的音频特征与身份特征的拼接为输入,通过反卷积进行上采样,重建人脸图像。

生成器通过最小化生成帧 L g L_{g} Lg与真实帧 L G L_{G} LG之间的L1重构损失来进行训练。
在这里插入图片描述
wav2lip生成器独立地生成每一帧,然后将连续生成的帧序列输入到专家口型同步判别器。因为专家口型同步判别器一次处理 T u = 5 T_{u}=5 Tu=5个连续帧,因此训练过程中,需要生成器也生成 T u = 5 T_{u}=5 Tu=5个连续帧。原先生成器独立处理每一帧,输入形状为 ( N , H , W , 3 ) \left(N, H,W, 3\right) (N,H,W,3), 现在沿批量维度堆叠时间步长,输入形状为 ( N ⋅ T u , H , W , 3 ) \left(N \cdot T_{u}, H,W, 3\right) (NTu,H,W,3)。但是在将生成的帧馈送给专家口型同步判别器时,时间步长沿着通道维度连接,就像在专家判别器训练期间所做的那样,输入形状为 ( N , H / 2 , W , 3 ⋅ T u ) \left(N, H / 2,W, 3 \cdot T_{u} \right) (N,H/2,W,3Tu)。因为只有下半部分的生成人脸被用于专家判别器,所以高度为 H / 2 H/2 H/2

生成器通过最小化来自专家判别器的同步损失来提高生成的帧的口型同步质量,同步损失函数为上述的余弦相似度二元交叉熵损失。
在这里插入图片描述在这里插入图片描述

专家判别器在生成器训练期间不参与训练。基于从真实视频中学到的唇形同步概念的强烈辨别力迫使生成器也实现逼真的唇形同步,以最大限度地减少唇形同步损失。

在这里插入图片描述
通过这种生成器和专家判别器的联合设计,能够生成具有良好口型与语音同步性的人脸对象。然而,由于LRS2数据集的图像清晰度较低,导致生成的图像脸部较为模糊,特别是牙齿部分的还原度有待提高。为了改善这一情况,可以考虑采用具有更高清晰度的数据集,或者增大输入图像的大小wav2lip288x288,或者利用超分模型来提升脸部图像的清晰度。此外,当参考人脸图片为侧脸时,可能会引发脸部的不协调问题。

visual quality discriminator

使用强大的唇形同步鉴别器会使得生成器生成准确的唇形。然而,它有时会导致变形区域稍微模糊或包含轻微的伪影。为了减轻这种轻微的质量损失,在 GAN 设置中与生成器一起训练一个简单的视觉质量鉴别器。视觉质量鉴别器不对口型同步执行任何检查,并且仅惩罚不切实际的面部生成,因此它是在生成的面部上进行训练的。

此判别器也是由堆叠的卷积块组成,它通过最大化目标函数 L d i s c L_{disc} Ldisc进行训练。其中 L G L_{G} LG为真实图像, L g L_{g} Lg则为生成器生成的图像。
在这里插入图片描述

生成器总损失函数

生成器的最终优化目标由重建损失、同步损失和对抗损失三部分组成,用公式表示如下:
在这里插入图片描述
s w s_{w} sw 是同步惩罚权重, s g s_{g} sg 是对抗损失,在所有的实验中,根据经验分别设置为 0.03 和 0.07。

训练细节:
数据集:LRS2训练集
batch size: 80
优化器:Adam
初始学习率:0.0001
β 1 = 0.5 , β 2 = 0.999 \beta_{1} = 0.5, \beta_{2}=0.999 β1=0.5,β2=0.999

论文

  • A Lip Sync Expert Is All You Need for Speech to Lip Generation
    In The Wild
  • Wav2Lip

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

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

相关文章

服务器之间的conda环境迁移

有的时候python环境中可能包含了我们编译好的很多库文件,如果在别的服务器想直接使用环境就会比较困难些。最好的办法就是直接迁移环境。而传统的迁移方法导出“*.yaml”环境配置的这种方法,实际是需要重新安装环境,对于这种安装好的环境是不…

龙芯loongarch64服务器编译安装maturin

前言 maturin 是一个构建和发布基于 Rust 的 Python 包的工具,但是在安装maturin的时候,会出现如下报错:error: cant find Rust compiler 这里记录问题解决过程中遇到的问题: 1、根据错误的提示需要安装Rust Compiler,首先去其官网按照官网给的解决办法提供进行安装 curl…

flink源码分析之功能组件(四)-slotpool组件II

简介 本系列是flink源码分析的第二个系列,上一个《flink源码分析之集群与资源》分析集群与资源,本系列分析功能组件,kubeclient,rpc,心跳,高可用,slotpool,rest,metrics&…

联想Lenovo购入一套DTX-1800线缆分析仪作为自检

福禄克经典6a线缆认证分析仪历经20年,依旧活跃在各个重要场合。线缆厂、布线商、网络工程师的利器,依旧经久不衰。 提供的最新原厂校准过的设备,精度和质量尤为重要。得到了充分的保证。使用起来,放心,可以送第三方计量…

数据结构-二叉树(2)

3.4堆的应用 3.4.1 堆排序 堆排序即利用堆的思想来进行排序,总共分为两个步骤: 1. 建堆 1.升序:建大堆; 2.降序:建小堆。 2. 利用堆删除思想来进行排序 这种写法有两个缺点: 1、先有一个堆的数据结构 …

详解Python中httptools模块的使用

httptools 是一个 HTTP 解析器,它首先提供了一个 parse_url 函数,用来解析 URL。这篇文章就来和大家聊聊它的用法吧,感兴趣的可以了解一下 如果你用过 FastAPI 的话,那么你一定知道 uvicorn,它是一个基于 uvloop 和 h…

Python (十五) 面向对象之多继承问题

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》&…

电子学会C/C++编程等级考试2022年09月(三级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:课程冲突 小 A 修了 n 门课程, 第 i 门课程是从第 ai 天一直上到第 bi 天。 定义两门课程的冲突程度为 : 有几天是这两门课程都要上的。 例如 a1=1,b1=3,a2=2,b2=4 时, 这两门课的冲突程度为 2。 现在你需要求的是这 n 门课…

Verilog 入门(一)(Verilog 简介)

文章目录 什么是 Verilog HDL?Verilog 主要能力模块时延数据流描述方式 什么是 Verilog HDL? Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和…

Windows 11的新功能不适用于所有人,但对将要使用的人来说非常酷

正如一个新的预览版本所示,Windows 11即将为那些使用手写笔的人添加一些智能功能,以及其他改进。 这是预览版22635.2776(也称为KB5032292),已推出Beta频道,这是发布预览版之前的最后一个测试方法&#xff…

Oracle E-Business Suite软件 任意文件上传漏洞(CVE-2022-21587)

0x01 产品简介 Oracle E-Business Suite(电子商务套件)是美国甲骨文(Oracle)公司的一套全面集成式的全球业务管理软件。该软件提供了客户关系管理、服务管理、财务管理等功能。 0x02 漏洞概述 Oracle E-Business Suite 的 Oracle…

创建Asp.net MVC项目Ajax实现视图页面数据与后端Json传值显示

简述回顾 继上篇文章创建的mvc传值这里说明一下Json传值。在mvc框架中,不可避免地会遇到前台传值到后台,前台接收后台的值的情况(前台指view,后台指controller),有时只需要从控制器中返回一个处理的结果&a…

Lombok工具包的安装和使用

目录 一.常用的注解 二.引入依赖的两种方式 1.在maven仓库中引入 2.安装插件EditStarter 三.使用举例 四.原理 Lombok是一个java库,它可以自动插入到编辑器和构建工具中,增强java的性能。不需要再写getter、setter或equals方法,只要有一…

使用MAT分析内存泄漏(mac)

前言 今天主要简单分享下Eclipse的Memory Analyzer在mac下的使用。 一、Mat(简称)干什么的? 就是分析java内存泄漏的工具。 二、使用步骤 1.下载 mac版的现在也分芯片,别下错了。我这里是M2芯片的,下载的Arch64的。 …

软件测试面试时问你的项目经验,你知道该怎么说吗?

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

【中间件】DAL中间件intro

中间件middleware 内容管理 intro数据访问层why use DAL中间件主流DAL中间件方案DAL浅析 本文从理论上介绍一下服务化背景下的DAL中间件的理论并浅析相关中间件 cfeng之前work的时候产品发展到分离服务不分库的阶段,所以根本不需要DAL中间件,也没有分布式…

Linux(11):Linux 账号管理与 ACL 权限设定

Linux 的账号与群组 每个登入的使用者至少都会取得两个 ID,一个是使用者 ID(User ID ,简称UID)、一个是群组ID (Group ID ,简称GID)。 Linux系统上面的用户如果需要登入主机以取得 shell 的环境来工作时,他需要如何进行呢? 首先…

网络通信与TCP.IP协议

网络通信与TCP.IP协议 URI 用字符串标识某一互联网资源,而 URL 表示资源的地点(互联网上所处的位置)。可见 URL 是 URI 的子集 URL (Uniform Resource Locator),统一资源定位符 ,用于描述一个网络上的资源 DNS: &#…

TCP 连接建立

1:TCP 三次握手过程是怎样的? 客户端和服务端都处于 CLOSE 状态,服务端主动监听某个端口,处于 LISTEN 状态 第一次握手:客户端带着序号和SYN为1,把第一个 SYN 报文发送给服务端,客户端处于 SYN-…

沈阳师范大学期末考试复习pta循环数组函数指针经典编程题汇总+代码分析

前言:临近期末,接下来给大家分享一些经典的编程题,方便大家复习。不一定难,但都是入门的好题,尽可能的吃透彻。因为据说期末考试的题很多来自pta上面的原题。 对于一些语言我是用c来写的,不妨碍理解&#…