My App
Paper/TakingHeadGeneration

SadTalker: Learning Realistic 3D Motion Coefficients for Stylized Audio-Driven Single Image Talking Face Animation

当前生成talking head videos存在很多问题: 不自然的头部移动, 扭曲的表情, 身份修改. 他们认为这是因为从耦合的2D motion 表示中学习导致的. 另一方面显示的使用3D信息又会导致表情僵硬, 不连贯. 提出SadTalker, 从音乐生成3D motion 系数, 3D-aware face render生成视频.

SadTalker-intro

介绍

在数字人, 视频会议中有重要应用. 先前的工作主要生成嘴唇的移动, 因为和sppech有强烈的关联, 也有工作考虑整个面部的工作, 但是生成质量不真实, 嘴部模糊, 身份修改, 脸部扭曲.

讲难点: audio和speech有一个很强的关联, 但是同一段audio可以有多种不同的head pose和eye blink表达, 他们认为这导致之前的工作生成的脸部会扭曲. 他们的观察是说3D facial motion 包含高度解耦的表示, 可以用来单独学习每种类型的运动, 尽管在另一篇论文中被讨论过, 但他们做的效果不好.

讲方法在method章节再看.

方法

Preliminary

在我们建模一个人的3D face时, 可以用S表示, Sˉ\bar{\mathbf{S}} 表示3D-face的平均形状(大众脸), Uid\mathbf{U}_{id}Uexp\mathbf{U}_{exp} 是正交基座, α\alphaβ\beta 表示人的 identity 和expression 属性, 在用audio预测motion变化时, 只预测{β,r,t}\{ \beta, \mathbf{r}, \mathbf{t} \}, 分别表示表情, 旋转角, 偏移量.

S=Sˉ+αUid+βUexp\mathbf{S} = \bar{\mathbf{S}} + \alpha \mathbf{U}_{id} + \beta \mathbf{U}_{exp}

Motion Coefficients Generation through Audio

他们的观察是audio和嘴唇的变化有一个很强的关联性, 但是audio和head pose的关联性很弱, 因此它们用了两个网络分别去预测head pose和expression.

ExpNet

SadTalker-ExpNet

难点: 1) audio to expression 不是一对一的映射关系; 2) expression Coefficients中一些音频无关的动作影响准确性.

这里的结构看了好久, 搞不清楚它到底想训练什么. 好像是: 上面的audio编码和解码器是它要训练的部分, 设计了一系列的损失. 1)LdistillL_{distill}比较生成的嘴唇表达与Wav2Lip预训练模型得到的嘴唇表达比较; 2)RdR_d是一个可微的3D渲染器, 不涉及可训练参数, 计算一些感知损失包括landmark loss LlksL_{lks}和lip reading loss LreadL_{read}.

为了保持身份信息, 将β0\beta_0作为输入条件.

PoseVAE

SadTalker-PoseVAE

预测的ρ1\rho_1ρt\rho_tρ0\rho_0的残差, 输入条件自己看图, LMSEL_{MSE}是平方损失误差, LKLL_{KL}用于衡量生成motion的分布情况, LGANL_{GAN}对抗损失用于衡量生成的质量.

3D-aware Face Render

渲染器是face-vid2vid, 训练分两步, 第一步按照论文中的方法用自己的数据集重训, 第二步训练一个mappingNet学习显式的3DMM motion和face-vid2vid中隐式的3D keypoint间的关系.

实验

定量和定性实验不看, 对ExpNet, PoseVAE, FaceRender进行了消融实验. 局限性:1) 牙齿渲染问题; 2) 表情多样性有限.

感受

这个方法和x-dancer有点像, 先生成3D面部表示, 再用模型(face render)渲染出视频.

他们的观察很有意思, 音频和嘴唇的动作有很强的关联, 音频和头部动作, 表情变化有弱关联性, 如果直接将audio输入网络, 模型不知道采取怎样的表达, 带来的结果就是头部模糊. 针对这个问题它们的解决方法是, 我先预测出特定的motion表示, 然后告诉模型, 按这个渲染吧, 就消除了这种不确定性.

这种基于重建的方法训练起来很简单, 就几层线性层和几层卷积.

On this page