前言
输入是声音和短视频, 输出是带有头部姿态的视频。 整个结构分为两部分, 一个是FACIAL-GAN, 可以合成隐式属性(头部姿态)和显式属性(嘴部运动), 这些参数对渲染3d人脸有作用, 然后通过后续的网络进行操作。
方法
整体框架如图。 给定音频, FACIAL-GAN生成显式的属性和隐式的属性, 输入的视频进行3d重建, rendering过程中还需要一个网络生成的eye-attention maps.
问题公式化
A是audio, 通过encoer编码声音生成显式的lip属性和隐式的pose和eye属性, V是参考视频, 注意不同的属性需要不同的编码策略, 嘴唇和音节相关, 而隐式特征依赖上下文信息,比较长。
FACIAL具体内容
此模型有三部分, 一部分是生成上下文关系的G_tem(temporal correlation generator), 一个是提取每帧特征的G_loc(temporal correlation generator), 还有个属性鉴别器D_f 判断生成属性的真假。
下面是整体模型图:
T帧滑窗通过G_tem得到隐式的属性, 每帧通过deepspeech得到的特征通过G_loc得到每帧的特征, 然后耦合通过fc得到最后每帧的特征, f是表情参数, p是头部姿态参数, e是眨眼au估计.
下面是G_tem的网络结构, 可以看到输入是1*128*29
然后是G_loc的网络, 可以看到输入是1*16*29
注意哈,这里G_tem的输入是128帧, 然后G_loc的每个a_t是16帧组成的
网络的初始化状态为:
总的公式如下:
表示分割和提取特征X的第t个特征块
公式表示给定s, 提取A的特征, ➕是feature concatenation
Loss函数
L_s是初始状态的L 1 norm 损失
注意这里还增加了运动损失U 来保证帧间的连续性
(帧和帧的)
(帧间的)
- 鉴别器D_f 的loss定义:
最终loss定义如下:
隐式部分编码
- 这里的渲染是结合参考视频中的几何、纹理和照明系数,以及输入音频中生成的表情和头部姿势系数
- 哦哦, 这就是参考视频的作用, 那我能不能只用第一帧的参数呢?
3D的优点是能够更好的描述头部姿态, 缺点是很难捕捉面部上部区域的细微运动, 比如眨眼.
直观的做法是把face image和blink value直接级联起来, 但是卷积无法识别眼睛这部分的通道,
这里作者通过使用眼睛注意力map, 先定位眼睛区域, 然后根据blinking AU改变眼睛区域的像素值
那么眼睛区域怎么定位呢? 我们可以借助3d model中眼睛部位的顶点,
center_x, center_y是eye landmark的中心值, th是阈值, 调整眼睛区域大小
- 这里的预测AU值大说明有眨眼, 小就说明没有眨眼,那是怎么表现眨眼的呢?直接用眨眼的部分替换掉?还是说直接变黑? 那眨眼的连续过程又是怎么表示的呢? 插值吗?
渲染部分
将渲染图像与眼睛注意力图相结合变为 W*H*4, (rendering image 3 channels, attention map 1 channel)
这里一次输入是2N_w的window, 当前帧在窗的中间
rendering-to-video 网络由一个生成器G_r和多尺度鉴别器 D_r = (D_r1, D_r2, D_r3)组成
生成器的输入是stacked tensor X_t
size为
- 所以这里的生成是8N_w生成一帧吗?
后面条件鉴别器D_r 将stacked tensor X_t 作为输入, 渲染部分的损失为:
L_FM 是借用的别的论文中的, I是 real image(这是怎么监督的呢?变化的那部分在哪呢?有对应吗?)
VGG损失用于语义级别的相似性, L1是绝对像素损失
总结如下:
数据集
-
视频
这里的数据集是作者自己的, 包含动态头部姿势、眼球运动、嘴唇同步,以及自动收集的每个帧的3D人脸模型。
发邮件还没有要到数据集 -
音频
使用DeepSpeech输出为5029, 插值为3029, 也就是每秒分30帧, 和视频对应起来. -
头部姿态和眼部运动
使用openface(Openface: A general-purpose face recognition library with mobile applications) 用于生成每帧的人脸参数
头部姿态是6维的欧拉角和三维变换矩阵组成
-
眨眼
AU用来描述眼球运动的强度 所以假如我要用AU的时候还得一帧一帧标注? 大小代表眨眼的强度 -
3D模型
使用的是之前弱监督那个 -
数据集统计
有450个视频片段, 每个片段大约1分钟, re-normalize 每个视频为每秒30帧, 总共535400帧. 使用5-1-4的train-val测试分割进一步分割数据集.
数据集clip有一个固定的camera和适当的照明,只有一个说话人.
实验
train
训练包括两个步骤,
- 首先优化 L_facial 也就是属性生成的部分, 在音频和属性建立起映射
- 然后给定一个参考视频, 首先提取其音频特征, 3D face model, 头部姿态p 和 眨眼AU值. 然后 fine-tune L_facial学习个性化的talking style
- 对渲染损失Lrender进行了优化,把带有eye attention的图映射到rendered image
test
给定输入音频, 首先使用fine-tuned FACIAL-GAN 将音频映射到表情f ,头部姿态p和眨眼AU, 这些都具有参考视频的个性化谈话风格, 然后进行渲染
假如生成视频超过参考视频也没关系, 因为不是简单的替换而是借助参考视频的参数渲染成的帧
实验时T是128帧, 滑动窗口是5帧
评价指标
- Landmark distance
- Sharpness metric(cumulative probability blur detection (CPBD)
- Lip-sync metric 通过SyncNEt衡量视听(AV)偏移量和置信度分数,以确定唇部同步误差
- Eye blink metric
- Personalization metric: 一个高质量的系统应该能够为不同的身份生成个性化特征。具体还是找找代码部分, 大体是头部姿态的分类