输入是template mesh , audio , 其他的mesh, 相当于mesh情绪驱动加audio 嘴型驱动
voca并没有对面部表情的所有方面进行编码, 因此音频驱动的面部动画问题试图学习一对多的映射,也就是说,每个输入都有多个似是而非的输出。这通常会导致过度平滑的结果,特别是在面部区域,只有微弱或甚至不相关的音频信号。
例如,闭上眼睛不应该局限于特定的唇形。潜在空间是基于一种新型的跨模态损失来训练的,它鼓励模型具有独立于音频输入的准确的上脸重建 (应该是提取的声音的无关信息, 比如情绪? 看看它是否专门说出了是什么无关的信息) 和只依赖于所提供的音频输入的准确的嘴区。这就使得上下面部的运动不再关联,并防止了过度平滑的结果。
运动合成是基于音频条件时间模型在学习到的分类隐空间。结果: 嘴唇运动高度精确, 也能够有眨眼有和眉毛运动 不过没有提到头部姿态
(A novel categorical latent space for facial animation synthesis that enables highly realistic animation of the whole face by disentanglement of the upper and lower face region based on a cross-modality loss.)
(An autoregressive sampling strategy for motion synthesis from an audio-conditioned temporal model over the learned categorical latent space.)(Autoregressive中的“Auto”意味着自我(self
),而机器学习术语的回归(regress
)意味着预测新的值。将它们放在一起,自回归意味着我们使用模型基于模型的过去数据点来预测新数据点。简单理解就是利用时序信息)
x 1 : T = ( x 1 , . . . , x T ) x_{1:T}=(x_1,...,x_T) x1:T=(x1,...,xT), x t ∈ R V × 3 x_t∈R^{V\times3} xt∈RV×3 是T个face meshes, 每个代表V个顶点.
a 1 : T = ( a 1 , a 2 , . . . . , a T ) a_{1:T}=(a_1, a_2,....,a_T) a1:T=(a1,a2,....,aT) , a t ∈ R D a_t∈R^D at∈RD 是T个演讲片段, 每个有D个样本, 对齐到相应的视频帧t, (这里是说一帧对应D个小段吗)
此外, 设定一个 template mesh 作为输入: h ∈ R V × 3 h∈R^{V\times3} h∈RV×3
对潜在空间的要求: 空间必须足够大, 会导致某个潜在类别产生大量的类别C (Since this leads to an infeasibly large number of categories C for a single latent categorical layer), 所以这里对C-way 类别的H个潜在分类进行建模. 结果是允许使用数量相对较少的类别来实现较大的表达式空间. 分类是C个类, 每个C有H? (是不是这样理解的, 假如C代表笑啊或者啥的, H就代表是怎么笑的,可能是对类进行细分这样的理解.) 这里C=128, H=64
然后有个编码器, 从表情和音频到这个分类空间的映射, 我可以理解成是根据一些mesh帧和语音帧进行编码, 映射到 T × H × C T\times H \times C T×H×C 的编码空间
然后这个编码使用一个Gumbel-softmax 转换为分类表示:
最后通过一个解码器得到动画mesh:
最后看看整个网络的架构:
训练时, ground truth对应关系仅适用于template mesh, 语音和表情信号时来自同一个人的。解码器输出的mesh的表情是和输入一致的,虽然本意是说音频提供嘴型, 对应的mesh提供表情, 但是由于解码器用 l2 loss 限制表情一致性, 带来的结果就是音频被忽略了。 或者说你没法指定音频就只对应嘴部运动。那当然嘴部和音频的同步也比较弱。 这里作者安排了语音与情绪的解耦
这里作者提出了跨模态的损失, 可以保证输入的模态能够在隐空间使用。 x x x 和 a a a 表示 expression 和 audio. 进一步设 h x h_x hx 是从 x x x 中可代表的. 这里不是只生成一个h, 而是两个, 看下面的公式比较好理解
x ~ 1 : T \widetilde x_{1:T} x 1:T 和 a ~ 1 : T \widetilde a_{1:T} a 1:T 是从训练集中随机采样的, 换句话说, 带波浪线的是不对的随机选的, 所以不带波浪线的会倾向于指导网络有对应的输出
作者定义的跨模态损失如下:
M u p p e r M^{upper} Mupper 是一个脸的上部有比较大权值而嘴部有比较小权值的 mask. 类似的 M m o u t h M^{mouth} Mmouth 嘴部有较高的权值, 脸上部权值比较小. 让这个损失很小, 就是说当audio随机采样时高权重的mask挡住了expression, 然后让这个随机的audio不会对audio产生影响.
这里有个挺重要, 就是对于眼睛的处理, 眨眼这个动作是快速和稀疏的, 只影响少数几个顶点. 因此作者增加了一个特定的眼睑损失
其中 M e y e l i d M^{eyelid} Meyelid (这个是个二进制蒙版, 眼睑顶点为1, 其他所有顶点为0) 优化后的最终损失为
也就是单独对眼睛部分进行约束
音频编码器是一个四层的一维卷积, expression 编码器有一个LSTM跟着三个全连接层。 解码器是个UNet-style 模型带有跳连接。
当单独使用音频驱动mesh时,expression input是不可用的。 由于只有一个模态,不能从音频推断的缺失信息必须合成(应该是表情吧) 这里是把音频通过一个自回归的时间模型。合成出和音频同步的似是而非的表情。
这里使用贝叶斯的规则, 隐层embedding可以按下面公式分解:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-30hC8QDr-1642993590791)(typora_pic/image-20220124102922096.png)]
每太看懂啥意思。。。
这里用了类似 pixelcnn 的方法, 此刻的类别只依赖当前和过去的audio, 而不是还依赖未来的。
数据集是in-house 的, 不公开
每个视觉帧对应600ms, 500ms之前的, 100ms之后的, 每10ms提取80维mel光谱特征。
extract 80-dimensional Mel spectral features every 10ms, using 1, 024 frequency bins and a window size of 800 for the underlying Fourier transform.