FACIAL: Synthesizing Dynamic Talking Face with Implicit Attribute Learning 论文解读

链接

视频:
https://www.youtube.com/watch?reload=9&app=desktop&v=hl9ek3bUV1E

arvxiv:
https://arxiv.org/abs/2108.07938

中文翻译:
https://blog.csdn.net/weixin_41967328/article/details/120798208

任务定义

论文中说的是synthesis dynamic talking faces driven by input audio, 实际上与audio driven face reenactment 差不多。都是“音频+源人脸 ->说话视频”, 不同之处在于这篇工作使用的是源人脸信息是一小段参考视频。如下图c所示。
在这里插入图片描述

创新点

本文引入了一个概念,在一个动态的说话视频中,分为以下两类属性。

显式属性(explicit attribute):比如唇部运动等与音频强相关的属性。
隐式属性(implicit attribute):头部运动、说话方式、眨眼信息等与音频若相关的属性。
整体而言,创新点如下:

  1. 使用了一个统一的框架来同时表征显示和隐式属性。
  2. 在经历完整的训练后,面对2-3分钟的新视频,提取语音、上下文、个性化信息。
  3. 可以预测眼部眨眼的AU值,来实现说话视频的眨眼。

总体概况

在这里插入图片描述

1. Audio----> expression,pose, eyes blink

在这里插入图片描述

Audio—>Audio feature 用的是deep speech 得到29 x T帧的特征向量。
维度:表情系数(64 维度), 头部姿态系数(6 维), 眨眼系数(1维)
总共使用到了两个生成器:局部语音生成器 G l o c G_{loc} Gloc,时间相关性生成器 G t e m G _{tem} Gtem


1.1 Audio–>expression

Audio---->expression使用的是一个局部语音生成器 G l o c G_{loc} Gloc

以第t帧为例, G l o c G_{l o c} Gloc 接收音频特征 a t = a [ t − 8 : t + 8 ] a_{t}=a[t-8: t+8] at=a[t8:t+8] 作为输入,并输出局部特征 c t t c_{t_{t}} ctt

1.2 Audio—>pose, eyes blink

这里建模用的是一个时间相关性生成器 G t e m G _{tem} Gtem

时间相关性生成器: 为了提取整个输入序列的时间相关性, 我们的关键思想是将 T T T 帧的音频序列 A \mathcal{A} A 馈送到上下文编码器, 该编码器生成 潜在的全局特征 z z z将音频序列作为一个整体, 当前特征z的每个单元能够合并来自其他帧的信息。因此, 可以通过分割编码特征 z z z 来提 取第 t t t 帧的对应特征 z t ∘ z_{t} \circ zt 给定输入音频 A \mathcal{A} A 的DeepSpeech 特征 a [ 0 : T − 1 ] a[0: T-1] a[0:T1] 及其初始状态 s = { f 0 , p 0 , e 0 } ∈ R 71 \mathbf{s}=\left\{f_{0}, p_{0}, e_{0}\right\} \in \mathbb{R}^{71} s={f0,p0,e0}R71, 我们生成预测的 时间属性序列 z t , t ∈ [ 0 , T − 1 ] z_{t}, t \in[0, T-1] zt,t[0,T1] G t e m G_{t e m} Gtem 。引入初始状态 s s s 是为了确保生成序列之间的时间连续性。

这个生成器接收开头的T帧音频特征和初始的condition(expression, pose, eyes blink)

其实用到的只有初始的Audio feature信息,其大致的意思是这样提取的特征代表了全局的特征。

1.3 拼接

将全局特征 z t z_{t} zt 和局部特征 c t c_t ct 拼接后再接入一个全连接层-----> Y (expression, pose, eyes blink)

总流程:

z t = S ( G t e m ( E ( A ) ∣ s ) , t ) c t = G l o c ( S ( E ( A ) , t ) ) [ f ^ t , p ^ t , e ^ t ] = F C ( z t ⊕ c t ) \begin{aligned} &z_{t}=\mathcal{S}\left(\mathbf{G}^{t e m}(\mathbf{E}(\mathcal{A}) \mid \mathbf{s}), t\right) \\ &c_{t}=\mathbf{G}^{l o c}(\mathcal{S}(\mathbf{E}(\mathcal{A}), t)) \\ &{\left[\hat{f}_{t}, \hat{p}_{t}, \hat{e}_{t}\right]=\mathbf{F C}\left(z_{t} \oplus c_{t}\right)} \end{aligned} zt=S(Gtem(E(A)s),t)ct=Gloc(S(E(A),t))[f^t,p^t,e^t]=FC(ztct)

损失函数:

L R e g = ω 1 L exp ⁡ + ω 2 L pose  + ω 3 L eye  + ω 4 L s \mathcal{L}_{\mathrm{Reg}}=\omega_{1} \mathcal{L}_{\exp }+\omega_{2} \mathcal{L}_{\text {pose }}+\omega_{3} \mathcal{L}_{\text {eye }}+\omega_{4} \mathcal{L}_{s} LReg=ω1Lexp+ω2Lpose +ω3Leye +ω4Ls

(1).

其中 ω 1 , ω 2 , ω 3 \omega_{1}, \omega_{2}, \omega_{3} ω1,ω2,ω3, 和 ω 4 \omega_{4} ω4 是平衡权重, L s L_s Ls 是初始状态值的 L 1 L_1 L1 范数损失,这保证了生成的滑动窗口序列之间的连续性:
L s = ∥ f 0 − f ^ 0 ∥ 1 + ∥ p 0 − p ^ 0 ∥ 1 + ∥ e 0 − e ^ 0 ∥ 1 \mathcal{L}_{s}=\left\|f_{0}-\hat{f}_{0}\right\|_{1}+\left\|p_{0}-\hat{p}_{0}\right\|_{1}+\left\|e_{0}-\hat{e}_{0}\right\|_{1} Ls=f0f^01+p0p^01+e0e^01

这个就相当于仅仅为了开始状态时能够平稳过度。



(2)
然后用的是 L 2 L_2 L2 loss,引入了运动损耗 U \mathcal{U} U 来保证帧间的连续性。

L exp  , L pose  \mathcal{L}_{\text {exp }}, \mathcal{L}_{\text {pose }} Lexp ,Lpose , 和 L eye  \mathcal{L}_{\text {eye }} Leye  分别是面部表情、头部姿势和眨眼的 L 2 L_2 L2 标准损失。我们还引入了运动损耗 U \mathcal{U} U 来保证帧间的连续性。
L e x p = ∑ t = 0 T − 1 V ( f t , f ^ t ) + ω 5 ∑ t = 1 T − 1 U ( f t − 1 , f t , f ^ t − 1 , f ^ t ) L pose  = ∑ t = 0 T − 1 V ( p t , p ^ t ) + ω 5 ∑ t = 1 T − 1 U ( p t − 1 , p t , p ^ t − 1 , p ^ t ) L eye  = ∑ t = 0 T − 1 V ( e t , e ^ t ) + ω 5 ∑ t = 1 T − 1 U ( e t − 1 , e t , e ^ t − 1 , e ^ t ) \begin{aligned} \mathcal{L}_{e x p} &=\sum_{t=0}^{T-1} \mathcal{V}\left(f_{t}, \hat{f}_{t}\right)+\omega_{5} \sum_{t=1}^{T-1} \mathcal{U}\left(f_{t-1}, f_{t}, \hat{f}_{t-1}, \hat{f}_{t}\right) \\ \mathcal{L}_{\text {pose }} &=\sum_{t=0}^{T-1} \mathcal{V}\left(p_{t}, \hat{p}_{t}\right)+\omega_{5} \sum_{t=1}^{T-1} \mathcal{U}\left(p_{t-1}, p_{t}, \hat{p}_{t-1}, \hat{p}_{t}\right) \\ \mathcal{L}_{\text {eye }} &=\sum_{t=0}^{T-1} \mathcal{V}\left(e_{t}, \hat{e}_{t}\right)+\omega_{5} \sum_{t=1}^{T-1} \mathcal{U}\left(e_{t-1}, e_{t}, \hat{e}_{t-1}, \hat{e}_{t}\right) \end{aligned} LexpLpose Leye =t=0T1V(ft,f^t)+ω5t=1T1U(ft1,ft,f^t1,f^t)=t=0T1V(pt,p^t)+ω5t=1T1U(pt1,pt,p^t1,p^t)=t=0T1V(et,e^t)+ω5t=1T1U(et1,et,e^t1,e^t)
其中 V ( x t , x ^ t ) = ∥ x t − x ^ t ∥ 2 2 , U ( x t − 1 , x t , x ^ t − 1 , x ^ t ) = ∥ x t − x t − 1 − ( x ^ t − x ^ t − 1 ) ∥ 2 2 \mathcal{V}\left(x_{t}, \hat{x}_{t}\right)=\left\|x_{t}-\hat{x}_{t}\right\|_{2}^{2}, \mathcal{U}\left(x_{t-1}, x_{t}, \hat{x}_{t-1}, \hat{x}_{t}\right)=\left\|x_{t}-x_{t-1}-\left(\hat{x}_{t}-\hat{x}_{t-1}\right)\right\|_{2}^{2} V(xt,x^t)=xtx^t22,U(xt1,xt,x^t1,x^t)=xtxt1(x^tx^t1)22 是为了保证相邻帧之间的时间一致性。 ω 5 \omega_{5} ω5 平 衡这两项的权重. 这里我们用 x x x 来表示预测值 x ^ \hat{x} x^ 的真值。

第一项就是普通的 L 2 L_2 L2 损失,第二项是运动损失 U ( x t − 1 , x t , x ^ t − 1 , x ^ t ) = ∥ x t − x t − 1 − ( x ^ t − x ^ t − 1 ) ∥ 2 2 \mathcal{U}\left(x_{t-1}, x_{t}, \hat{x}_{t-1}, \hat{x}_{t}\right)=\left\|x_{t}-x_{t-1}-\left(\hat{x}_{t}-\hat{x}_{t-1}\right)\right\|_{2}^{2} U(xt1,xt,x^t1,x^t)=xtxt1(x^tx^t1)22。这里可以理解为让相邻间的差值尽可能小。

(3) 判别器损失

面部判别器 D f \mathbf{D}^{f} Df 的损失定义为:

L F-GAN  = arg ⁡ min ⁡ G f max ⁡ D f E f , p , e [ log ⁡ D f ( f , p , e ) ] + E a , s [ log ⁡ ( 1 − D f ( G f ( a , s ) ) ] \begin{array}{r} \mathcal{L}_{\text {F-GAN }}=\arg \min _{\mathbf{G}^{f}} \max _{\mathbf{D}^{f}} \mathbb{E}_{\mathbf{f}, \mathbf{p}, \mathbf{e}}\left[\log \mathbf{D}^{f}(\mathbf{f}, \mathbf{p}, \mathbf{e})\right]+ \mathbb{E}_{\mathbf{a}, \mathbf{s}}\left[\log \left(1-\mathbf{D}^{f}\left(\mathbf{G}^{f}(\mathbf{a}, \mathbf{s})\right)\right]\right. \end{array} LF-GAN =argminGfmaxDfEf,p,e[logDf(f,p,e)]+Ea,s[log(1Df(Gf(a,s))]
其中生成器 G f \mathbf{G}^{f} Gf包括两个子生成器 G tem  \mathbf{G}^{\text {tem }} Gtem  G loc ⁡ \mathbf{G}^{\operatorname{loc}} Gloc, 最小化该目标函数,同时对判别器 D f \mathbf{D}^{f} Df 进行最大化优化。最终损失定义为:
L facial  = ω 6 L F − G A N + L R e g \mathcal{L}_{\text {facial }}=\omega_{6} \mathcal{L}_{\mathrm{F}-\mathrm{GAN}}+\mathcal{L}_{\mathrm{Reg}} Lfacial =ω6LFGAN+LReg

就是普通的GAN 对抗最大最小损失。

2. 眼睛部位编码处理

将音频转换为expression, pose和eyes blink后,就可以使用3D重建模型重建3D人脸。作者提到通过旋转和平移头部,3D模型比2D方法更好地描述头部姿势。但是3D重建对眨眼的捕捉效果较差,因此利用2D动作单元(眨眼程度检测)与3D模型相结合。
在这里插入图片描述

简单来说:
(1) 根据3D模型中标记眼睛区域的顶点, 绘制眼睛区域的mask图
(2) 根据估计的两次眨眼频率(Blink Au),填充mask图
(3) 在视频渲染时将mask图和3D人脸图沿通道方向进行拼接


3. 视频渲染

这里就是实现从3D人脸----> 真实人脸的转换。
作者将渲染图像与眼睛注意力图相结合,生成大小为 W × H × 4 W \times H \times 4 W×H×4的训练输入数据 I ^ \hat{I} I^(渲染图像有3个通道,注意力图有1个通道)。为确保时间相干性,使用大小为 2 N w 2N_w 2Nw的窗口,当前帧位于窗口的中心。

我们采用视频网络渲染技术将渲染图像转化为最终的真实感图像。受Kim等人[20]的启发,我们首先将渲染图像与眼睛注意力图相结合,生成大小为 W × H × 4 W \times H \times 4 W×H×4的训练输入数据 I ^ \hat{I} I^(渲染图像有3个通道,注意力图有1个通道)。为确保时间相干性,我们使用大小为 2 N w 2N_w 2Nw的窗口,当前帧位于窗口的中心。


通过遵循Chan等人的方法[6],我们将渲染训练为视频网络,该网络由生成器 G r G_r Gr和多尺度判别器 D r = ( D r 1 , D r 2 , D r 3 D_r=(D_{r1}, D_{r2}, D_{r3} Dr=(Dr1,Dr2,Dr3) 组成,它们以对抗性方式交替优化。生成器 G r G^r Gr 采用叠加张量 X t = { I ^ t } t − N w t + N w X_{t}=\left\{\hat{I}_{t}\right\}_{t-N_{w}}^{t+N_{w}} Xt={I^t}tNwt+Nw 大小为 W × H × 8 N w W \times H \times 8 N_{w} W×H×8Nw 作为输入,并输出目标人物的真实照片图像 G r ( X t ) \mathbf{G}^{r}\left(X_{t}\right) Gr(Xt) 。条件判别器 D r D_r Dr 将叠加张量 X t X_{t} Xt 和检查帧(真实图像 I I I 或生成的图像 G r ( X t ) \mathbf{G}^{r}\left(X_{t}\right) Gr(Xt))作为输入,并判别检查帧是否为实。损失函数可以表示为:
L render  = ∑ D i r ∈ D r ( L R − G A N ( G r , D i r ) + λ 1 L F M ( G r , D i r ) ) + λ 2 L V G G ( G r ( X t ) , I ) + λ 3 L 1 ( G r ( X t ) , I ) \begin{aligned} \mathcal{L}_{\text {render }}=& \sum_{\mathbf{D}_{i}^{r} \in \mathbf{D}^{r}}\left(\mathcal{L}_{R-G A N}\left(\mathbf{G}^{r}, \mathbf{D}_{i}^{r}\right)+\lambda_{1} \mathcal{L}_{F M}\left(\mathbf{G}^{r}, \mathbf{D}_{i}^{r}\right)\right) &+\lambda_{2} \mathcal{L}_{V G G}\left(\mathbf{G}^{r}\left(X_{t}\right), I\right)+\lambda_{3} \mathcal{L}_{1}\left(\mathbf{G}^{r}\left(X_{t}\right), I\right) \end{aligned} Lrender =DirDr(LRGAN(Gr,Dir)+λ1LFM(Gr,Dir))+λ2LVGG(Gr(Xt),I)+λ3L1(Gr(Xt),I)

这里 L R − G A N ( G r , D r ) \mathcal{L}_{R-G A N}\left(\mathbf{G}^{r}, \mathbf{D}^{r}\right) LRGAN(Gr,Dr) 是对抗性损失, L F M ( G r , D r ) \mathcal{L}_{F M}\left(\mathbf{G}^{r}, \mathbf{D}^{r}\right) LFM(Gr,Dr) 表示[33]提出的鉴别器特征匹配损失, L V G G ( G r , I ) \mathcal{L}_{V G G}\left(\mathbf{G}^{r}, I\right) LVGG(Gr,I) 是语义层面相似性的VGG感知损失[18], L 1 ( G r , I ) \mathcal{L}_{1}\left(\mathbf{G}^{r}, I\right) L1(Gr,I) 是绝对像素误差损失。


通过求解典型的最小-最大优化,可获得最佳网络参数:

G r ∗ = arg ⁡ min ⁡ G r max ⁡ D r L render  ( G r , D r ) . \mathbf{G}^{r *}=\arg \min _{\mathbf{G}^{r}} \max _{\mathbf{D}^{r}} \mathcal{L}_{\text {render }}\left(\mathbf{G}^{r}, \mathbf{D}^{r}\right) . Gr=argGrminDrmaxLrender (Gr,Dr).

然后生成器就接收 W × H × 8 N w W \times H \times 8N_{w} W×H×8Nw 作为输入,就是沿着通道方向将滑窗中的帧拼接起来。

损失函数上是GAN loss + VGG loss + L1 loss

4. 数据集

数据集是他们自己建立的,即动态头部姿势、眼球运动、嘴唇同步以及自动采集的每帧3D人脸模型。

音频预处理。我们使用DeepSpeech[17]来提取语音特征。DeepSpeech以每秒50帧(FPS)的速度输出字符的正常化对数概率,每秒钟形成一个大小为 50 × D 50×D 50×D 的数组。这里 D = 29 D=29 D=29 是每帧中语音特征的数量。我们使用线性插值将输出重采样为30 FPS,以匹配数据集中的视频帧,该数据集每秒生成一个大小为 30 × D 30×D 30×D 的数组。
头部姿势和眼球运动场。为了自动采集头部姿势以及检测眼球运动,我们采用OpenFace[2]生成每个视频帧的面部参数。头部姿势 p ∈ R 6 \mathbf{p} \in \mathbb{R}^{6} pR6 由欧拉角(pitch θ x \theta_{x} θx, yaw θ y \theta_{y} θy, roll θ z \theta_{z} θz)和 三维平移向量 t ∈ R 3 \mathbf{t} \in \mathbb{R}^{3} tR3 表示。为了描述眼球运动,利用动作单位(AUs)[15]来定义眼球区域周围肌肉群的动作强度。

音频用的是deepspeech + 线性插值重采样,头部姿态用的是OpenFace。

5. 训练

训练。我们的训练方案包括两个步骤:
(1)首先在整个训练数据集的基础上优化人脸表情,主要考虑音频和生成属性之间的一般映射。
(2) 给定参考视频V,我们首先提取音频特征 a a a、3D人脸模型、头部姿势 p p p 和眨眼AU e e e。然后我们对面部表情进行微调,学习个性化的谈话风格。同时,我们优化了渲染损失 L r e n d e r L_{render} Lrender ,以学习从具有眼睛注意贴图的渲染人脸到最终视频帧的映射。

测试。在给定输入音频的情况下,我们首先使用经过微调的面部表情来映射音频特征到表情 f f f、头部姿势 p p p 和眨眼AU e e e,这些特征具有参考视频的个性化谈话风格。然后,我们对相应的人脸图像和眼睛注意图进行排序,并将其转换为具有个性化谈话风格的真实感目标视频。

  1. 首先在整个数据集上训练Audio—>expression。
  2. 在单个视频上fine-tune Audio---->condition,然后完整训练渲染网络。

总结

  1. Audio—>Audio feature 用的是Deep speech
  2. Audio---->3D face Param(expression, pose, eyes blink AU) 使用的是GAN做生成。
  3. 3D face---->True face使用的是“Everybody dance now ”论文实现的转换网络,通过眼睛位置的Mask掩码(沿通道拼接)控制生成人脸的眨眼情况。
  4. 整体流程与我们之前的AudioDVP比较相似,使用的是Audio---->3D face---->True face的建模方式,用3D 人脸面具作为中间件,间接控制生成人脸表情,头部动作以及眨眼。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值