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

如下图所示,人脸视觉配音(Face visually dubbing)旨在根据输入的驱动音频同步源视频中的嘴型,同时保持身份和头部姿势与源视频帧一致。然而在少样本条件下,实现高分辨率视频下的高质量人脸视觉配音仍然是一项挑战。一个主要原因是,在少数样本的条件下,嘴部纹理细节与驱动音频的相关性很小,因此直接生成高频纹理细节是比较困难的。为了解决这个问题,形变修复网路DINet通过对参考人脸图像进行空间形变来保留更多的嘴部纹理细节。具体地,首先对参考人脸图像的特征图做空间形变,形变后的特征包含与语音同步和头部姿态对齐的口型特征;然后使用空间形变后的特征修补嘴部区域,空间形变是将像素移动,而不是重新生成,因此能够保存足够多的纹理信息。
在这里插入图片描述

方法

DINet网络架构由两部分组成,形变网络 P D P^{D} PD和修补网路 P I P^{I} PI。形变部分对五张参考图像的特征进行空间形变,创建每帧嘴部形状的变形特征图,以便于对齐输入驱动音频和输入源图像的头部姿态。修复部分则侧重于利用形变结果修复源面部的嘴部区域。
DINet模型架构

形变

自适应仿射变换算子(Adaptive Affine Transformation, AdaAT)解决人脸驱动前后空间不对齐的问题。AdaAT使用仿射变换来模拟和约束空间形变,它直接在特征通道空间中进行仿射变换。

给定一个源图像 I s ∈ R 3 × H × W I_{s} \in R^{3 \times H \times W} IsR3×H×W,一个驱动音频 A d ∈ R T × 29 A_{d} \in R^{T \times 29} AdRT×29和五个参考图像 I r e f ∈ R 15 × H × W I_{ref} \in R^{15 \times H \times W} IrefR15×H×W,形变网络 P D P^{D} PD的任务就是输出与 A d A_{d} Ad同步的嘴型且与 I s I_{s} Is头部姿态对齐的形变特征 F d ∈ R 256 × H 4 × W 4 F_{d} \in R^{256 \times \frac{H}{4} \times \frac{W}{4}} FdR256×4H×4W

  1. 首先, A d A_{d} Ad被喂入到一个语音编码器中,提取语音特征 F a u d i o ∈ R 128 F_{audio} \in R^{128} FaudioR128
  2. 然后, I s I_{s} Is I r e f I_{ref} Iref分别作为两个不同的特征提取的输入,提取256维的源图像特征 F s ∈ R 256 × H × W F_{s} \in R^{256 \times H \times W} FsR256×H×W和256维的参考图像特征 F r e f ∈ R 256 × H × W F_{ref} \in R^{256 \times H \times W} FrefR256×H×W
  3. 接下来,合并 F s F_{s} Fs F r e f F_{ref} Fref,将其喂入到一个对齐编码器中计算得到对齐特征 F a l i g n ∈ R 128 F_{align} \in R^{128} FalignR128
  4. 最后,合并语音特征 F a u d i o F_{audio} Faudio和对齐特征 F a l i g n F_{align} Falign,喂入一个全连接层后输出 [ R , T , S ] [R,T,S] [R,T,S]系数,然后传递给AdaAT算子,将特征 F r e f F_{ref} Fref形变为 F d F_{d} Fd

注: 第四步的全连接网络被用于计算rotation R = { θ c } c = 1 256 R=\{\theta^{c}\}_{c=1}^{256} R={θc}c=1256、translation T x = { t x c } c = 1 256 / T y = { t y c } c = 1 256 T_{x} = \{t_{x}^{c}\}_{c=1}^{256} / T_{y} = \{t_{y}^{c}\}_{c=1}^{256} Tx={txc}c=1256/Ty={tyc}c=1256和Scale S = { s c } c = 1 256 S=\{s^{c}\}_{c=1}^{256} S={sc}c=1256的系数。然后这些仿射系数与 F r e f F_{ref} Fref做仿射变换。

( x c , y c ) \left(x_{c}, y_{c}\right) (xc,yc) ( x ^ c , y ^ c ) \left(\hat{x}_{c}, \hat{y}_{c}\right) (x^c,y^c)分别为仿射变换前后的像素坐标, c ∈ [ 1 , 256 ] c \in [1,256] c[1,256] F r e f F_{ref} Fref c t h c_{th} cth的通道。
在这里插入图片描述
这也是为什么能选择AdaAT算子的原因,AdaAT算子在不同的特征通道中计算不同的仿射系数。

修补

修补网路 P I P^{I} PI相比于形变网络 P D P^{D} PD而言就简单很多,只包含一个由卷积层组成的特征解码器网络。将源图像特征 F s F_{s} Fs和形变特征 F d F_{d} Fd按通道合并后,送入到特征编码器后输出配音图像 I o ∈ R 3 × H × W I_{o} \in R^{3 \times H \times W} IoR3×H×W

损失函数

在训练阶段,DINet的损失函数由三张不同的损失函数加权组成。
在这里插入图片描述

perception loss

感知损失(perception loss)是一种基于深度学习的图像风格迁移方法中常用的损失函数。感知损失是通过预训练的神经网络(常见是VGG网络)来计算两张图片之间的差异。感知损失的目标是最小化输入图像和目标图像在特征空间的距离。

在这篇论文中,首先对真实图像 I r I_{r} Ir和配音图像 I o I_{o} Io进行降采样分别得到 I ^ r ∈ R 3 × H 2 × W 2 \hat{I}_{r} \in R^{3 \times \frac{H}{2} \times \frac{W}{2}} I^rR3×2H×2W I ^ o ∈ R 3 × H 2 × W 2 \hat{I}_{o} \in R^{3 \times \frac{H}{2} \times \frac{W}{2}} I^oR3×2H×2W,然后一起计算 { I o , I r } \{I_{o}, I_{r}\} {Io,Ir} { I ^ o , I ^ r } \{\hat{I}_{o}, \hat{I}_{r}\} {I^o,I^r}的感知损失值。损失感知公式如下所示:
在这里插入图片描述
预训练模型选用VGG-19网路, V ( ⋅ ) V\left( \cdot \right) V() i t h i_{th} ith层, W i H i C i W_{i}H_{i}C_{i} WiHiCi i t h i_{th} ith层的特征尺寸。

GAN loss

GAN loss使用的是least square GAN,公式为 L G A N = L D + L G L_{GAN} = L_{D} + L_{G} LGAN=LD+LG G G G表示的是DINet网络, D D D为判别器。
在这里插入图片描述
论文中缺少判别器的资料。通过代码理解GAN loss。

# GAN 损失
class GANLoss(nn.Module):
    '''
    GAN loss
    '''
    def __init__(self, use_lsgan=True, target_real_label=1.0, target_fake_label=0.0):
        super(GANLoss, self).__init__()
        self.register_buffer('real_label', torch.tensor(target_real_label))
        self.register_buffer('fake_label', torch.tensor(target_fake_label))
        if use_lsgan:
            self.loss = nn.MSELoss()
        else:
            self.loss = nn.BCELoss()

    def get_target_tensor(self, input, target_is_real):
        if target_is_real:
            target_tensor = self.real_label
        else:
            target_tensor = self.fake_label
        return target_tensor.expand_as(input)

    def forward(self, input, target_is_real):
        target_tensor = self.get_target_tensor(input, target_is_real)
        return self.loss(input, target_tensor)
# train
net_dI = Discriminator(*) # 判别器D
net_g = DINet(*) # DINet网络
criterionGAN = GANLoss().cuda()
fake_out = net_g(*)
# (1) Update D network
optimizer_dI.zero_grad()
# compute fake loss
_,pred_fake_dI = net_dI(fake_out)
loss_dI_fake = criterionGAN(pred_fake_dI, False)
# compute real loss
_,pred_real_dI = net_dI(source_image_data)
loss_dI_real = criterionGAN(pred_real_dI, True)
# Combined DI loss
loss_dI = (loss_dI_fake + loss_dI_real) * 0.5
loss_dI.backward(retain_graph=True)
optimizer_dI.step()
Lip-sync loss

lip-sync损失是为了提高配音视频中的嘴唇的同步性。损失公式定义如下。
在这里插入图片描述

实现细节

  1. 所有的视频的帧率是25fps
  2. 根据OpenFace的68个面部关键点裁剪脸部区域
  3. 将所有的脸部区域resize为 416 × 320 416 \times 320 416×320大小,其中嘴部区域的大小为 256 × 256 256 \times 256 256×256
  4. 使用deepspeech模型提取29维的语音特征。语音特征与25fps的视频对齐。
  5. 训练视频分辨率为720P或者1080P
  6. Adam 优化器,学习率是0.0001

参考

  1. DINet code
  2. 论文:DINet: Deformation Inpainting Network for Realistic Face Visually Dubbing on High Resolution Video
  3. AAAI 2023 | DINet:实现高分辨率下的人脸视觉配音
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
基于ER-NeRF自训练AI数字人-马鹤宁的方法主要包括三个步骤:数据收集、模型训练和模型评估。 首先,我们需要收集马鹤宁的相关数据。这些数据可以包括他的文字、音频、视频等各种形式的信息。我们可以从他的历史记录、社交媒体、公开演讲等渠道获取数据。收集到的数据应该尽可能全面和多样化,以便更好地了解马鹤宁的思维方式和个性特点。 接下来,我们使用ER-NeRF(Neural Radiance Fields with Extended Multimodal Inputs)模型对马鹤宁的数据进行训练。ER-NeRF是一种基于神经辐射场的模型,可以处理多模态输入。它能够将不同模态的数据,如文字、音频和视频,统一表示为一个连续的隐变量表达。这样可以更好地捕捉到马鹤宁的多模态特征。 在模型训练过程中,我们需要设计一个恰当的损失函数来指导模型学习。这个损失函数可以包括多个方面的考虑,如文本生成的准确性、语音合成的自然度以及图像重建的真实感等。通过不断迭代训练,使得模型能够逐渐准确地模拟出马鹤宁的行为和语言特点。 最后,我们需要对训练好的模型进行评估。评估的目标是判断生成的数字人是否与真实的马鹤宁表现一致。我们可以通过与真实数据进行对比、与他人对话以及进行用户调研等方式来验证模型的有效性和可信度。同时,还需要对模型进行不断的优化和调整,以提高生成的数字人的质量和逼真度。 以上是基于ER-NeRF自训练AI数字人-马鹤宁的主要步骤。通过数据收集、模型训练和模型评估,我们可以逐渐建立一个可以模拟并与真实马鹤宁类似的数字人。这样的AI数字人可以用于虚拟现实、人机交互等领域,为用户提供更为真实和丰富的体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马鹤宁

谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值