赞
踩
Wav2Lip 是第一个通用说话者的模型,可生成与真实同步视频相匹配的口型同步精度的视频,它的核心架构概括为“通过向训练有素的口型同步专家学习,生成准确的口型同步”。基于此理念,Wav2lip包括一个生成器和两个判别器。
专家口型同步判别器由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进行了三个方面的改进。
# 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%
有了更精确的口型同步判别器后,可以在训练过程中利用它来对生成器进行优化,提高生成器生成口型的准确性。
生成器 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, 3\right)
(N,H,W,3), 现在沿批量维度堆叠时间步长,输入形状为
(
N
⋅
T
u
,
H
,
W
,
3
)
\left(N \cdot T_{u}, H,W, 3\right)
(N⋅Tu,H,W,3)。但是在将生成的帧馈送给专家口型同步判别器时,时间步长沿着通道维度连接,就像在专家判别器训练期间所做的那样,输入形状为
(
N
,
H
/
2
,
W
,
3
⋅
T
u
)
\left(N, H / 2,W, 3 \cdot T_{u} \right)
(N,H/2,W,3⋅Tu)。因为只有下半部分的生成人脸被用于专家判别器,所以高度为
H
/
2
H/2
H/2。
生成器通过最小化来自专家判别器的同步损失来提高生成的帧的口型同步质量,同步损失函数为上述的余弦相似度二元交叉熵损失。
专家判别器在生成器训练期间不参与训练。基于从真实视频中学到的唇形同步概念的强烈辨别力迫使生成器也实现逼真的唇形同步,以最大限度地减少唇形同步损失。
通过这种生成器和专家判别器的联合设计,能够生成具有良好口型与语音同步性的人脸对象。然而,由于LRS2数据集的图像清晰度较低,导致生成的图像脸部较为模糊,特别是牙齿部分的还原度有待提高。为了改善这一情况,可以考虑采用具有更高清晰度的数据集,或者增大输入图像的大小wav2lip288x288,或者利用超分模型来提升脸部图像的清晰度。此外,当参考人脸图片为侧脸时,可能会引发脸部的不协调问题。
使用强大的唇形同步鉴别器会使得生成器生成准确的唇形。然而,它有时会导致变形区域稍微模糊或包含轻微的伪影。为了减轻这种轻微的质量损失,在 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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。