Wav2lip

前言

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

Lipsync 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大小的音频窗口【此窗口要么与视频对齐insync),要么来自不同的时间步(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卷积的编码器-解码器结构

生成器通过最小化生成帧

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, 3right)

(N,H,W,3), 现在沿批量维度堆叠时间步长,输入形状为

(

N

T

u

,

H

,

W

,

3

)

left(N cdot T_{u}, H,W, 3right)

(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

论文

原文地址:https://blog.csdn.net/weixin_42111770/article/details/134691558

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_7267.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注