链接

视频:
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维)
总共使用到了两个生成器:局部语音生成器GlocG_{loc}Gloc​,时间相关性生成器 GtemG _{tem}Gtem​

1.1 Audio–>expression

Audio---->expression使用的是一个局部语音生成器GlocG_{loc}Gloc​

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

1.2 Audio—>pose, eyes blink

这里建模用的是一个时间相关性生成器 GtemG _{tem}Gtem​

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

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

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

1.3 拼接

将全局特征 ztz_{t}zt​ 和局部特征 ctc_tct​ 拼接后再接入一个全连接层-----> Y (expression, pose, eyes blink)

总流程:

zt=S(Gtem(E(A)∣s),t)ct=Gloc(S(E(A),t))[f^t,p^t,e^t]=FC(zt⊕ct)\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(zt​⊕ct​)​

损失函数:

LReg=ω1Lexp⁡+ω2Lpose +ω3Leye +ω4Ls\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​=ω1​Lexp​+ω2​Lpose ​+ω3​Leye ​+ω4​Ls​

(1).

其中ω1,ω2,ω3\omega_{1}, \omega_{2}, \omega_{3}ω1​,ω2​,ω3​, 和 ω4\omega_{4}ω4​ 是平衡权重,LsL_sLs​ 是初始状态值的 L1L_1L1​ 范数损失,这保证了生成的滑动窗口序列之间的连续性:
Ls=∥f0−f^0∥1+∥p0−p^0∥1+∥e0−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​=∥∥∥​f0​−f^​0​∥∥∥​1​+∥p0​−p^​0​∥1​+∥e0​−e^0​∥1​

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

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

Lexp ,Lpose \mathcal{L}_{\text {exp }}, \mathcal{L}_{\text {pose }}Lexp ​,Lpose ​, 和 Leye \mathcal{L}_{\text {eye }}Leye ​ 分别是面部表情、头部姿势和眨眼的 L2L_2L2​ 标准损失。我们还引入了运动损耗 U\mathcal{U}U 来保证帧间的连续性。
Lexp=∑t=0T−1V(ft,f^t)+ω5∑t=1T−1U(ft−1,ft,f^t−1,f^t)Lpose =∑t=0T−1V(pt,p^t)+ω5∑t=1T−1U(pt−1,pt,p^t−1,p^t)Leye =∑t=0T−1V(et,e^t)+ω5∑t=1T−1U(et−1,et,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} Lexp​Lpose ​Leye ​​=t=0∑T−1​V(ft​,f^​t​)+ω5​t=1∑T−1​U(ft−1​,ft​,f^​t−1​,f^​t​)=t=0∑T−1​V(pt​,p^​t​)+ω5​t=1∑T−1​U(pt−1​,pt​,p^​t−1​,p^​t​)=t=0∑T−1​V(et​,e^t​)+ω5​t=1∑T−1​U(et−1​,et​,e^t−1​,e^t​)​
其中 V(xt,x^t)=∥xt−x^t∥22,U(xt−1,xt,x^t−1,x^t)=∥xt−xt−1−(x^t−x^t−1)∥22\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​)=∥xt​−x^t​∥22​,U(xt−1​,xt​,x^t−1​,x^t​)=∥xt​−xt−1​−(x^t​−x^t−1​)∥22​ 是为了保证相邻帧之间的时间一致性。 ω5\omega_{5}ω5​ 平 衡这两项的权重. 这里我们用 xxx 来表示预测值 x^\hat{x}x^ 的真值。

第一项就是普通的L2L_2L2​ 损失,第二项是运动损失: U(xt−1,xt,x^t−1,x^t)=∥xt−xt−1−(x^t−x^t−1)∥22\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(xt−1​,xt​,x^t−1​,x^t​)=∥xt​−xt−1​−(x^t​−x^t−1​)∥22​。这里可以理解为让相邻间的差值尽可能小。

(3) 判别器损失

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

LF-GAN =arg⁡min⁡Gfmax⁡DfEf,p,e[log⁡Df(f,p,e)]+Ea,s[log⁡(1−Df(Gf(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 ​=argminGf​maxDf​Ef,p,e​[logDf(f,p,e)]+Ea,s​[log(1−Df(Gf(a,s))]​
其中生成器 Gf\mathbf{G}^{f}Gf包括两个子生成器 Gtem \mathbf{G}^{\text {tem }}Gtem  和 Gloc⁡\mathbf{G}^{\operatorname{loc}}Gloc, 最小化该目标函数,同时对判别器 Df\mathbf{D}^{f}Df 进行最大化优化。最终损失定义为:
Lfacial =ω6LF−GAN+LReg\mathcal{L}_{\text {facial }}=\omega_{6} \mathcal{L}_{\mathrm{F}-\mathrm{GAN}}+\mathcal{L}_{\mathrm{Reg}} Lfacial ​=ω6​LF−GAN​+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×4W \times H \times 4W×H×4的训练输入数据 I^\hat{I}I^(渲染图像有3个通道,注意力图有1个通道)。为确保时间相干性,使用大小为 2Nw2N_w2Nw​的窗口,当前帧位于窗口的中心。

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

通过遵循Chan等人的方法[6],我们将渲染训练为视频网络,该网络由生成器 GrG_rGr​和多尺度判别器 Dr=(Dr1,Dr2,Dr3D_r=(D_{r1}, D_{r2}, D_{r3}Dr​=(Dr1​,Dr2​,Dr3​) 组成,它们以对抗性方式交替优化。生成器 GrG^rGr 采用叠加张量 Xt={I^t}t−Nwt+NwX_{t}=\left\{\hat{I}_{t}\right\}_{t-N_{w}}^{t+N_{w}}Xt​={I^t​}t−Nw​t+Nw​​ 大小为 W×H×8NwW \times H \times 8 N_{w}W×H×8Nw​ 作为输入,并输出目标人物的真实照片图像 Gr(Xt)\mathbf{G}^{r}\left(X_{t}\right)Gr(Xt​) 。条件判别器 DrD_rDr​ 将叠加张量 XtX_{t}Xt​ 和检查帧(真实图像 III 或生成的图像 Gr(Xt)\mathbf{G}^{r}\left(X_{t}\right)Gr(Xt​))作为输入,并判别检查帧是否为实。损失函数可以表示为:
Lrender =∑Dir∈Dr(LR−GAN(Gr,Dir)+λ1LFM(Gr,Dir))+λ2LVGG(Gr(Xt),I)+λ3L1(Gr(Xt),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 ​=​Dir​∈Dr∑​(LR−GAN​(Gr,Dir​)+λ1​LFM​(Gr,Dir​))​+λ2​LVGG​(Gr(Xt​),I)+λ3​L1​(Gr(Xt​),I)​

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

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

Gr∗=arg⁡min⁡Grmax⁡DrLrender (Gr,Dr).\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∗=argGrmin​Drmax​Lrender ​(Gr,Dr).

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

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

4. 数据集

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

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

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

5. 训练

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

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

  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 人脸面具作为中间件,间接控制生成人脸表情,头部动作以及眨眼。

FACIAL: Synthesizing Dynamic Talking Face with Implicit Attribute Learning 论文解读相关推荐

  1. FACIAL: Synthesizing Dynamic Talking Face with Implicit Attribute Learning(论文翻译)

    FACIAL论文 链接 视频: https://www.youtube.com/watch?reload=9&app=desktop&v=hl9ek3bUV1E arvxiv: htt ...

  2. 论文阅读:FACIAL: Synthesizing Dynamic Talking Face with Implicit Attribute Learning

    文章目录 前言 方法 问题公式化 FACIAL具体内容 Loss函数 隐式部分编码 渲染部分 数据集 实验 train test 评价指标 前言 输入是声音和短视频, 输出是带有头部姿态的视频. 整个 ...

  3. Paper:论文解读《Adaptive Gradient Methods With Dynamic Bound Of Learning Rate》中国本科生提出AdaBound的神经网络优化算法

    Paper:论文解读-<Adaptive Gradient Methods With Dynamic Bound Of Learning Rate>中国本科生(学霸)提出AdaBound的 ...

  4. Dynamic ReLU论文解读

    其实一直在做论文阅读心得方面的工作,只是一直没有分享出来,这篇文章可以说是这个前沿论文解读系列的第一篇文章,希望能坚持下来. 简介 论文提出了动态线性修正单元(Dynamic Relu,下文简称 DY ...

  5. Face Super-Resolution Guided by 3D Facial Priors(ECCV2020)论文解读

    Face Super-Resolution Guided by 3D Facial Priors(ECCV2020)论文解读 论文地址:https://arxiv.org/pdf/2007.09454 ...

  6. 论文解读:High Dynamic Range and Super-Resolution from Raw Image Bursts

    论文解读:High Dynamic Range and Super-Resolution from Raw Image Bursts 今天介绍一篇发表于 2022 年 ACM Tranaction o ...

  7. 论文解读:Dynamic Connected Networks for Chinese Spelling Check

    论文解读:Dynamic Connected Networks for Chinese Spelling Check   我们知道,拼写纠错任务比较类似预训练语言模型中的**Masked Langua ...

  8. Dynamic MDETR: A Dynamic Multimodal Transformer Decoder for Visual Grounding 论文阅读笔记

    Dynamic MDETR: A Dynamic Multimodal Transformer Decoder for Visual Grounding 论文阅读笔记 一.Abstract 二.引言 ...

  9. Cascade EF-GAN: Progressive Facial Expression Editing with Local Focuses 论文解读

    题目:Cascade EF-GAN:局部聚焦渐进式面部表情编辑 时间:2020.3 作者:Rongliang Wu, Gongjie Zhang, Shijian Lu, and Tao Chen C ...

最新文章

  1. 使用Python,OpenCV制作图像Mask——截取ROIs及构建透明的叠加层
  2. linux六种进程状态,Linux操作系统中进程的七种状态
  3. 如何从零设计一款高并发架构(建议收藏)
  4. ruby环境sass编译中文出现Syntax error: Invalid GBK character错误解决方法
  5. Spring mvc 内置编码过滤器原理解析
  6. CSS3中:nth-child和:nth-of-type的区别深入理解。 关于:nth-child和:nth-of-type的区别之前一直没太注意,经深入理解才发现里面其实暗藏玄机...
  7. Java SE 8新功能介绍:使用Streams API处理集合
  8. Android官方开发文档Training系列课程中文版:多样屏幕之实现自适应UI
  9. hashmap put过程_看完还不懂HashMap算我输(附互联网大厂面试常见问题)
  10. JUC系列四:任务的取消与关闭
  11. 数据库存储时间的时区问题
  12. python身份证验证系统_用python制作全国身份证号验证及查询系统
  13. Android应用源码基于安卓的个人隐私监控项目
  14. 滴滴开源Android插件框架
  15. 2022-2028全球与中国交通信号控制系统市场现状及未来发展趋势
  16. 用python画笛卡尔心形线_05.总是套路得人心,如何用数学+Python示爱!
  17. [转载]VBA创建数据透视表
  18. opencv PIL读取图像得到的图像格式
  19. RTC实时时钟实验学习笔记一
  20. 回归算法-线性回归分析-过拟合欠拟合岭回归

热门文章

  1. CleanMyMac X是干嘛的?及最新版功能介绍
  2. jasper 导出html,使用jasper导出HTML并解决图片显示问题代码
  3. c语言编程题改错题怎么改,c语言编程改错题.doc
  4. maven项目调转servlet 500异常
  5. postcss-pxtorem使用方式
  6. ImportError: cannot import name ‘get_num_classes’ from ‘torchmetrics.utilities.data’
  7. maven 搭建ssm多模块项目(web+service)
  8. 前端必备网站(纯手工输入)
  9. php json数据条数,PHP中的JSON数据
  10. python绘制蟒蛇_Python实现七彩蟒蛇绘制实例代码