IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> Wav2Lip模型------《A Lip Sync Expert Is All You Need for Speech to Lip Generation In The Wild》论文解读及代码解析 -> 正文阅读

[人工智能]Wav2Lip模型------《A Lip Sync Expert Is All You Need for Speech to Lip Generation In The Wild》论文解读及代码解析

ABSTRACT:

在这篇文档中,我们将研究任意人物的人脸视频与目标音频的口型匹配问题。当前领域能做到对特定训练过的人物进行精准的口型匹配,但在其他未训练的人物上效果不好。我们找到了导致这种问题的主要原因,并学习了一个强大的口型匹配模型。接着,我们提出新的口型评估标准,从而精准评估任意视频的口型匹配的准确度。结果表明,我们的模型wav2lip跟真实视频的准确率相当。

1. INTRODUCTION:

随着视频内容消费的爆炸增长,从而需要快速的视频创作。同时,让这些视频以不同的语言进行呈现也是一种挑战。

一开始的工作是使用深度学习学习一个单一的演讲者几个小时的视频,从语音特征到嘴唇关键点的映射。在这个方向上,最近开始学习直接从语音特征生成图片并且具有较高的生成质量。然而,这些并不通用。于是,通过学习上千个演讲者的视频,研究了与演讲者无关的模型。然而,要应用于翻译讲座/电视剧等应用且并不理想,例如,这些模型需要能够变形这些动态的、无约束的视频中,呈现的广泛多样的唇形,而不仅仅是静态图像。

我们的模型也是演讲者无关的模型,希望能适用于任意演讲者及视频。我们发现,这些模型在静态图像中工作得很好,但无法在无约束的视频内容中精确地改变大量唇形,导致生成的视频的很大一部分与新的目标音频不同步。一个观看者可以识别0.05~0.1秒的音视频不同步,因此这对我们工作是个挑战。而且,现实视频中演讲者的姿势,周围光照环境,要完美合成也是一个挑战。

我们首先回顾当前演讲者无关的模型,我们发现,这些模型不能充分惩罚错误的唇形,无论是仅使用重建损失或弱同步鉴别器。我们采用一个有效的同步判别器,能够强制指导生成准确的,逼真的唇形。接下来,我们重新检查当前的评估基准,并从三个标准测试集中设计出新的、严格的评估基准。我们还使用SyncNet的可靠的评估指标,以精确评估无约束视频中的口型同步。并且收集了数据集ReSyncED,用于作为评估基准测试模型在现实中的表现。我们的关键贡献如下:

  • 我们提出了新的口型匹配模型wav2lip,在无约束的演讲中,优于先前的模型。
  • 我们提出了一个新的评估框架,包括新的基准和指标,在无约束的视频中公平的判断口型同步。
  • 我们收集和发布ReSyncED,一个真实世界的口型同步评估数据集。
  • Wav2Lip是第一个可以生成与真实同步视频相匹配的嘴唇同步精度的视频,且无关说话人的模型。

2 RELATED WORK

2.1 Constrained Talking Face Generation from Speech

我们首先回顾了关于说话的面部生成的工作,这些工作要么是受限于可以生成的身份或者词汇的范围。最近的一些作品在奥巴马的视频中实现了说话面部视频的现实生成,他们的学习音频到嘴唇特征点的映射,但他们只对特定人进行训练,并且需要几个小时视频数据进行学习。最近工作,有人尝试通过两阶段学习,从而减少学习特定演讲者所需的数据量。当前工作另一个局限就是词汇量,大多数工作实在GRID(56个词汇)数据集,上和TIMIT和LRW(1000个词汇)上进行训练,只极大的限制真实视频的音素到口型的映射。

2.2 Unconstrained Talking Face Generation from Speech

尽管关于语音驱动面部生成的作品越来越多,但很少有被设计成对任意身份、声音和语言的视频进行口型同步。?其中,LipGAN模型还输入下半掩模的目标人脸作为姿态先验,这是至关重要的,因为它允许生成的人脸裁剪无缝地粘贴回原始视频,而无需进一步的后期处理。它还训练一个鉴别器与生成器一起鉴别生成音视同步。但是,有一个重大的限制,它们在任意身份的静态图像上工作得很好,但当试图在无约束的视频进行唇同步时,会产生不准确的唇生成。与在LipGAN中使用的GAN设置相反,我们使用了一个预先训练的、准确的唇同步鉴别器,该鉴别器没有在生成器中进一步训练。这是一个重要的设计选择,以实现更好的对口型结果。

3 ACCURATE SPEECH-DRIVEN LIP-SYNCING FOR VIDEOS IN THE WILD

我们的核心架构可以概括为“通过向训练有素的对口型专家学习来生成准确的对口型”。首先,我们指出两个关键点,关于2.2提到的对于无约束的视频准确率不高的问题,我们认为问题在于损失函数,L1重构损失跟LipGan中的判别器,不充分惩罚生成的口型不匹配。

3.1 Pixel-level Reconstruction loss is a Weak Judge of Lip-sync

人脸重建损失,是计算整张图片,去确保生成正确的姿态,身份,以及背景。嘴唇部分只占了了整个人脸的4%不到,因此,在训练开始,会先进行图像周围的大部分重构,再对嘴唇区域进行优化,大约在训练的一半,第11个epoch才开始改变嘴唇形状去匹配音频。因此,有一个额外的鉴别器来判断对口型是至关重要的,正如LipGan中所作的一样。

3.2 A Weak Lip-sync Discriminator

我们发现,在LRS2测试集上,LipGAN的口型同步判别器在检测不同步的声音唇对时,准确率仅为56%。相反,我们的判别器达到91%。我们猜想主要有以下两个原因,首先,LipGan判别器使用单一帧进行输入,table3中表示,小的时间窗口对于口型同步判断是很有有用的。第二,生成的图片存在伪影,如果使用这些图片进行训练,判别器会把一部分注意力集中在判断是否存在伪影的工作上。这也会导致很大的同步判别性能下降。我们认为,使用真实的视频进行训练,能得到准确判别嘴型同步的判别器。

3.3 A Lip-sync Expert Is All You Need

我们提出使用预训练的嘴型同步判别器,我们提出改进版的SyncNet。

3.3.1 Overview of SyncNet

同步判别器SyncNet输入一个时间窗口V,具有连续的几帧Tv,以及时间片段S,大小为Ta×D,Tv和Ta分别代表视频和音频的时间步长。训练SyncNet时,通过随机采样同步和不同步的音频窗口,生成数据对从而进行训练。SyncNet包含一个音频编码器和人脸编码器,都是2D卷积的叠加。计算编码器生成的特征向量之间的L2距离。计算margin损失指导模型SyncNet训练。

3.3.2 Our expert lip-sync discriminator

我们对SyncNet进行了以下修改,以训练一个适合我们生成任务的口型同步判别器。首先,我们替代灰色图片,采用彩色的版输入。第二,我们使用res级联连接。第三,我们使用不同的损失函数,二元交叉熵的余弦相似损失。我们计算经过Relu激活之后的图像,音频编码特征v,s的点乘,表示视频音频同步的概率:

我们使用LRS2数据集进行训练,batch size为64,Tv=5,使用adam优化器进行训练,最终,准确率达到91%。

3.4 Generating Accurate Lip-sync by learning from a Lip-sync Expert

我们现在有一个精准的口型同步判别器,可以用于指导我们的口型生成,我们的架构如Figure2。

3.4.1 Generator Architecture Details

我们使用与LipGan相似的生成结构,我们主要贡献在于生成预训练好的专家级别的同步判别器。生成器由三部分组成,身份编码,音频编码,和人脸解码。身份编码是res卷积的叠加,输入为任意一帧R,并且与正确的目标人脸的下半部分进行蒙面的mask在通道上进行拼接。音频编码也是2d卷积的堆积,之后与身份编码出来的特征进行拼接。人脸解码也是反卷积的堆积,从而实现上采样。使用L1重构损失计算生成帧Lg和真实帧LG的距离,来指导生成器的训练。

因此,生成器类似lipGan的工作,但我们要如何使用预训练好,输入为连续帧Tv=5的口型同步判别器。

3.4.2 Penalizing Inaccurate Lip Generation

在3.3中训练的判别器,需要输入Tv = 5连续的帧,我们也需要生成器生成连续的5帧。我们生成器训练时,数据集随机采样也是随机采样一个窗口,Tv=5的连续帧,但因为我们生成器的输入是独立的图片,我们将时间维度在批次维度上进行叠加,构成数据集(H×Tv,H,W,3),其中N,H,W分别为批次,高,宽。在生成器的输出,输入口型判别器时,将数据重构为(N,H/2,W,3×Tv)的数据。只有生成的人脸的下半部分输入判别器进行计算损失,公式如下。

?

3.5 Generating Photo-realistic Faces

使用同步判别器指导生成器生成嘴唇的时候,在嘴唇区域会出现模糊。为了减轻这个损失,我们训练一个质量判别器。因此我们有两个鉴别器,一个是用于同步判别,一个是用于质量判别。

判别器由卷积块堆积而成,判别器优化公式如下:

Lg相对应生成的图片,而LG对应的是真实的图片。

生成器的总的损失函数如下:

我们只在LRS2数据集上进行训练,batch size为80,使用adam优化器,在推断过程中,我们单帧进行推断,将当前人脸与遮挡住下半部分的人脸进行拼接作为输入。

4 QUANTITATIVE EVALUATION

提出了当前评估基准的缺陷,并且提出了“LSE-D”(“Lip Sync Error - Distance").跟“LSE-C” (Lip Sync Error- Confidence).评估基准,因为不是模型重点,所以不细讲。

代码解析:

############# 训练核心代码 ################
#其中x为输入图片,indiv_mels,mel为对应的音频,gt为目标图像
for step, (x, indiv_mels, mel, gt) in prog_bar:
    disc.train()
    model.train()

    x = x.to(device)
    mel = mel.to(device)
    indiv_mels = indiv_mels.to(device)
    gt = gt.to(device)

    ######### 生成器训练更新 ##################
    optimizer.zero_grad()
    disc_optimizer.zero_grad()

    g = model(indiv_mels, x)

    if hparams.syncnet_wt > 0.:
    #计算口型同步损失
        sync_loss = get_sync_loss(mel, g)
    else:
        sync_loss = 0.

    if hparams.disc_wt > 0.:
    #计算图片质量判别器损失
        perceptual_loss = disc.perceptual_forward(g)
    else:
        perceptual_loss = 0.

    #计算图片与原图的L1损失
    l1loss = recon_loss(g, gt)

    loss = hparams.syncnet_wt * sync_loss + hparams.disc_wt * perceptual_loss + (1. - hparams.syncnet_wt - hparams.disc_wt) * l1loss

    loss.backward()
    optimizer.step()

    ######### 判别器训练更新 ##############
    disc_optimizer.zero_grad()

    pred = disc(gt)
    disc_real_loss = F.binary_cross_entropy(pred, torch.ones((len(pred), 1)).to(device))
    disc_real_loss.backward()

    pred = disc(g.detach())
    disc_fake_loss = F.binary_cross_entropy(pred, torch.zeros((len(pred), 1)).to(device))
    disc_fake_loss.backward()

    disc_optimizer.step()
############ 口型同步损失 ############
logloss = nn.BCELoss()
def cosine_loss(a, v, y):
    #### 计算余弦距离 
    d = nn.functional.cosine_similarity(a, v)
    #### 再计算信息熵损失
    loss = logloss(d.unsqueeze(1), y)

    return loss

def get_sync_loss(mel, g):
    #### 这里只取人脸的下半部分
    g = g[:, :, :, g.size(3)//2:]
    #### 将数据集的时间维度T,在通道维度C进行拼接成B, 3 * T, H//2, W
    g = torch.cat([g[:, :, i] for i in range(syncnet_T)], dim=1)
 
    #### 编码音频特征向量及视频特征向量   
    a, v = syncnet(mel, g)
    y = torch.ones(g.size(0), 1).float().to(device)
    return cosine_loss(a, v, y)
    
########## L1图像重建损失 ############
recon_loss = nn.L1Loss()

其他注意点:

  • 常规使用的是不使用Gan判别器进行生成图像质量的损失计算,这会导致口型同步效果下降,虽然会提高图片质量
  • 音频的特征提取是使用梅尔频谱
  • 生成器的输入是单帧数据,所以推断时,可输入单帧数据进行单张图片生成,而在训练中,为了能使用到Vt=5的口型判别器,训练集的取样是以window的连续5帧的数据进行取样,然后输入生成器生成图片,再将结果进行reshape成(B,3*T,H//2,W)输入SyncNet进行同步损失计算。
  • 在使用SyncNet口型同步判别器时,输入的为人脸的下半部分
  • 再训练生成器Wav2Lip时,数据采样是,随机提取一个窗口的音频,以及对应的一定窗口的视频图像,将其人脸的下半部分进行遮掩mask,然后再随机采样不同步的视频图像,与mask在通道上进行拼接。
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-03-16 22:21:38  更:2022-03-16 22:22:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 14:42:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码