注:本文仅作技术逻辑参考,不限于deepfacelab
人脸替换人脸替换(Face Swapping),是指用人物 A 的面部替换目标图像或视频中人物 B 的面部,使结果中的人物具有 A 的身份,并保持 B 的面部属性,包括表情、姿态、肤色、光照等。
人脸替换可以应用在: 1)替换图像中的人脸以保护目标人物的隐私,但又不破坏原图的完整性; 2)可以应用于娱乐,比如将某个经典的电影桥段中的主角替换为搞笑明星,产生滑稽效果; 3)将影视作品中某演员面部替换为其他人,保持作品的合法和完整。
此处约定人脸替换中用于替换的人脸为源人脸(src),被替换的目标图像中的人脸为目标人脸(dst)。 人脸替换的方法可分为三类: (1)基于图像编辑的方法; (2)基于三维模型的方法; (3)基于深度学习的方法。
基于图像编辑的人脸替换早期的人脸交换采用图像编辑的方法,在建立好的人脸库中寻找姿态和光照与目标人脸相似的源人脸,利用泊松融合等方法进行融合。这种方法无法指定源人脸,只能应用到隐私保护上。为了实现指定人脸的替换,一些方法利用面部关键点对源人脸进行形变以匹配目标人脸。基于图像编辑的方法有立体感和真实感缺失、光线难以匹配等问题。
基于三维模型的人脸替换Blanz 等人利用3DMM从单张图得到源人脸的三维模型估计,用估计的目标图像的渲染参数对源人脸的三维模型进行重新渲染,将渲染后的人脸融合到目标图像,在合成过程中需要手动进行对齐和面部区域的标记。Cheng 等人提出了一种三维表情估计算法用来使源人脸表情匹配目标人脸,并对形变后的人脸模型进行重新光照以保证替换后源人脸与目标背景的一致性。三维模型的不足在于从二维图像估计三维模型和光照条件本身是病态的,难以处理复杂的光照、遮挡等问题,且比较繁琐,自动化程度低。
基于深度学习的人脸替换基于深度学习的人脸替换是比较流行的方法,如Deepfakes、FaceSwap、FaceShifter、DeepFaceLab、SimSwap等。从笔者看来,基于深度学习的方法又可以分为可以进行任意人脸替换的方法和一对一的替换方法。一对一人脸替换是指模型训练好之后只能将输入人脸替换成特定身份的人脸。任意人脸替换是指模型训练完成后,给定任意两张人脸图像,都能够以其中一张为源图像、另一张为目的图像进行替换。
一对一的人脸替换方法DeepFaceLabDeepFaceLab的网络基于自编码器结构,以传统的DF结构为例进行分析(如下图所示)。整体分为编码器Encoder、中间层Inter、解码器Decoder三部分。编码器为一系列降采样的卷积模块;中间层为两层全连接层;解码器为一系列升采样的反卷积模块。
src和dst共用编码器、中间层,分用解码器。训练时src和dst交替输入,将图像进行随机扭曲,通过编码器、中间层、各自的解码器,最后得到还原的非扭曲图像。损失函数采用SSIM + MSE,还有一个patch discriminator作为选项产生对抗损失。 在预测时将dst输入,通过编码器、中间层以及src的解码器,得到换脸之后的结果。
关于自编码器换脸的原理,可以解释为:编码器将人脸图像进行编码,得到人脸的抽象表示,编码器训练理想的情况下,可以把人脸编码成一个与身份无关的向量。输入解码器后还原为对应的人脸,这种情况下相当于人脸的身份、细节信息存储在对应的解码器中。比如src的解码器可以将向量还原为src,dst的解码器可以将人脸还原为dst。
为什么训练时要扭曲图像?一种说法是为了增强编码器的编码能力;另一种说法是可以把dst理解为扭曲之后的src,这样经过src的还原路径就可以得到一张src的人脸。个人认为第一种说法靠谱一点,因为不扭曲图像进行训练也可以进行换脸。
论文中还提出了一种共用编码器、解码器,分用中间层的结构,说是可以提升光影效果,但经过实测一般,而且会使还原出来的人仍保留部分dst的特征,不那么像src。
基于自编码器的改进
网络结构如上图所示,在单编码器-双解码器基础上,加上了更多身份的解码器,成了单编码器-多解码器结构,论文中称之为multi-way comb network。除此之外还提到了一种步进训练的方式,最终得到了1024*1024的高质量换脸结果。
任意人脸替换风格迁移Korshunova等人将姿态和表情视为内容,将身份视为风格,基于风格迁移的思路,通过卷积神经网络实现了人脸替换。损失函数采用内容损失、风格损失、光线损失(通过一个光照网络计算)和一个控制整体方差的正则项。下面是论文中的网络结构:
RSGAN
简单来讲就是从一张图像提取人脸,一张图像提取头发,在隐空间把它们组合在一起。这个不太算严格的换脸,更多的是人脸图像编辑,还实现了人脸的属性编辑。
FSNet
设计了两个网络,一个编解码网络,一个基于U-Net的生成网络。用编解码网络来提取人脸的隐编码以及分割图,将背景部分和人脸编码输入生成网络,实现了人脸替换。
IPGAN
从一张人脸图像提取identity,另一张人脸图像提取attributes,输入生成器进行生成。上图的L是损失,具体的定义见论文。
FSGAN
同时实现了人脸替换和人脸驱动两个任务。提出了一种插值方法来解决不同角度的问题。
FaceShifter
用其提出的AEI-Net(Adaptive Embedding Integration Network)进行多层次的属性编码以及自适应融合, 解决了源对象和目标对象之间面部照明和脸型不一致的问题,用 HEAR-Net(Heuristic Error Acknowledging Refinement Network)通过自监督的方式解决了面部遮挡物保留的问题。
UniFaceGAN
可以完成人脸替换、人脸重演(face reenactment)任务,还可以进行身份、表情、属性的解耦。 提出了一种新的基于重心坐标插值的光流损失;提出了一种区域感知条件归一化(RCN)层,以空间感知的方式调制解码过程中的特征,从而产生更真实的输出。
One Shot Face Swapping on Megapixels
把人脸图像分成不同层次的表示,对高层表示应用迁移模块,最后将迁移后的表示输入到StyleGAN2的生成器,生成逼真的人脸替换结果。
One-stage Context and Identity Hallucination Network
通过幻觉图(Hallucination map)来区分人脸区域和周围区域,并有效学习特征,还设计了一种新的重建损失和swap block,值得关注。属于单阶段的换脸,主要解决训练-合成这种两阶段边缘产生伪影的问题。
SimSwap
主体基于自编码器的架构,加入了ID注入模块,在隐空间将新的人脸的身份信息注入,再进行解码,完成任意人脸的替换。
|