很高兴今天有机会来分享我们最近的研究成果,这篇文章发表在AAAI2020, 题目是通过自监督解耦身份和姿态特征实现人脸再扮演任务。
我们首先简单介绍一下什么是人脸再扮演任务,然后回顾一下领域内比较相关的重点工作,紧接着解读我们的探索成果。
论文地址:https://arxiv.org/abs/2003.12957
问题简介
人脸再扮演任务中,通常我们给定一组驱动/目标图片, 以及一张/组源人脸图片, 期望将驱动图片中人脸表情、姿态迁移至源图片,使得源人脸再现驱动人脸中的动作。例如,在图1中,生成的图片既具有目标人物的姿态兼具源人脸的身份特征。
总的来说,人脸再扮演需要解决两个核心问题:
通常我们会选择人脸关键点作为表征,第一个问题从人脸关键点恢复人脸图像,这是再扮演任务的基础,第二是寻找特征的自适应方法或者特征的解耦学习。这是因为在迁移类任务中,我们只想迁移某个特定的属性。
再扮演任务可以用于驱动虚拟人物,比如虚拟主持人,使其产生更拟人的表情,又或者用于人像表情调整,对于拍好的照片,我们对人像的表情进行微调。
重点工作介绍
首先我们回顾下Pix2Pix,它是图像翻译的开山之作,亦是人脸再扮演的基础。它可以给定一个物体边缘图,然后恢复出原来的图片。
[right]图4[/right]
我们将它的生成器部分和一个人脸边缘提取模块组合在一起,就可以得到一个人脸再扮演的方法,先用人脸边缘提取模块,从目标人物中提取人脸边缘,然后再用生成器恢复源人脸图像。这种方法的缺点在于,脸型变化不能太大, 否则会有明显的身份差异。
在 ReenactGAN 这篇论文中讨论了身份差异的问题,例如我们从图6人物C中提取人脸边缘,然后将其应用于人物B上,会出现脸型不匹配的结果。
ReenactGAN框架包含三个模块,编码器,转换器和解码器,编码器模块从人脸图像提取人脸边缘图,转换器将两个人物的人脸边缘做一个自适应变换,解码器模块从人脸边缘图中回复人脸图像。
增加了转换器模块之后,可以缓解身份之间的差异。它的问题在于,它是一对一的模型,使得整个框架的扩展性很差。当我们增加一个目标人脸时,我们需要增加一个转换器模块。
这篇文章取得了最好的再扮演效果,它包含嵌入器,生成器和判别器模块三个模块,嵌入器从多个图像帧中学习视频特征(如身份属性),视频特征对于每帧的姿态或者表情是鲁棒的,生成器的输入是人脸边缘及视频特征,得到对应姿态的人脸图像,判别器模块判断生成图片的真实度、姿态是否匹配。
这篇文章真人效果惊艳,可以生成非常真实的细节,比如耳朵、眼镜,也可以用真人图像来驱动油画,让油画运动起来。
相对于ReenactGAN,它可扩展性好,对于多个目标人脸,只训练一个模型就够了,不同的目标人物,我们只需要替换嵌入器的输入。嵌入器训练比较好情况下,生成器的两个输入近似解耦:身份特征编码发型、肤色、五官;关键点编码姿态信息。因为两个特征近似解耦,所以推断过程中直接替换,效果也不错。
上述方法效果很好,但是依赖关键点作为人脸表征,而人脸关键点的标注是很昂贵的,在没有人脸关键点的情况下,如何实现再扮演任务呢?思路是寻找人脸关键点的替代,设计网络自己学习姿态的表征,从图片中解耦学习身份特征和姿态特征,对解耦后的特征交叉融合,实现特征迁移。
比较有启发的文章是这篇Deforming Autoencoders中的观点,这篇文章中将图片视为模板和形变的融合,模板编码了图片的纹理信息而形变编码了图片的位姿信息。
个人探索成果
现在我们整个方法的流程就比较清晰了,我们的框架中包含三个模块:身份编码器、姿态编码器、以及条件生成器,身份编码器从视频中学习身份特征,位姿编码器对视频中的每一帧提取位姿特征,用于替代人脸关键点,条件生成器对提取到的身份特征和脸特征进行生成,得到特定位姿下的人脸图片,整个框架是自监督学习的,无需额外的标注信息。
接下来介绍身份编码器的细节,编码器被设计为从一段视频中学习一个身份特征,对于视频中的每一帧,它预测一个形变场以及一个注意力图,借助形变场对原图进行形变,对每一帧预测身份特征,由于每帧的人脸的角度不同,预测的人脸会有部分缺失,通过注意力图,对多个人脸进行融合,得到该身份的人脸模板。
位姿编码器被设计为编码每一帧的位姿信息,它的输出是一个二维形变场,用以从人脸模板中重建自身,由于人脸模板往往是正面的图像,所以预测的形变场需要正确的编码自身位姿信息,才能重建自身,网络设计有一个小技巧,就是利用残差学习,使得网络只需要预测低分辨率下的形变场。
对两个编码器的结果进行了可视化,可以看到学到的身份特征,确实能保留人物的身份属性,同时位姿编码器输出的形变场确实编码了人脸的位姿。另一个实验是利用学习到的位姿特征做图像检索任务,可以看到检索出来的图像和查询图像具有相似的位姿,而身份属性不一样。结果从侧面印证了学习到的身份特征,确实编码了图像的位姿信息。
实现了身份编码器和位置编码器这两个模块之后,我们就可以完成人脸再扮演。之前的工作x2face就是一个自编码器的框架。它用身份编码器去提取源人脸的人脸模板,同时用位姿编码器去提取目标人脸的位姿特征,利用位姿编码器输出的形变场,对源人脸的人脸模完成二维形变,即可实现表情迁移。
自编码器的框架存在两个主要的问题:一个是生成的图片会损失很多细节,比如说生成的图像中没有耳朵,后者眼睛的瞳孔消失,第二个问题是人物和背景的交界处,会有比较大的形变,这是由于不同身份的人脸模板存在差异,直接利用光流场重建人脸会导致在边缘处存在比较明显的伪影。
因此我们引入第三个模块,一个条件生成器,他将身份编码器学习到的人脸模板作为输入,同时将位姿编码器提取到的位姿特征,通过AdaIN层作为条件送入到生成器中,实现特定姿态下的人脸生成。这样可以避免自编码器类方法的成像模糊问题,也能避免采用光流场重建人脸所引起的边缘伪影问题。
最终的结果展示里,x2face是基于自编码器的方法,倒数第二个是基于关键点的方法,我们的方法优于自编码器的框架,避免了人物边缘处的形变同时细节损失较少。结果近似基于关键点的方法,我们的优势在于不需要依赖关键点的标注。在定量结果中,我们在user study这个指标中取得了最好的结果(之一)。
由于身份编码器和位姿编码器学习后特征是近似解耦的,对于不同身份之间实现表情迁移任务,我们只需要替换条件生成器的人脸模板即可,使得我们的模型具有非常高的可拓展性,可以在不同身份之间灵活的迁移位姿、表情等属性。更多的实现细节以及演示视频,可以搜索我们的论文进一步了解。
版权声明