来自 Github上 作者 shaoanlu 链接: https://github.com/shaoanlu/faceswap-GAN
最近在研究Faceswap,随之就一定要了解GAN网络在工程中的使用原理,就算是Google上资料也并不多,检索到Github上优秀作者"shaoanlu"的工程,自己学习的需要,简单理解了一下工程的 README.md。
faceswap-GAN
在deepfake的auto编码架构中,添加了 Adversarial loss 和 Perceptual loss(在第五章网络是怎么工作的会简单介绍)。关于变脸的解码-编码原理建议可以在这里看:https://www.jiqizhixin.com/articles/2018-05-04-2。这篇博文介绍了学习人脸共性和个性的特征的过程,其中运用了Encoder和Decoder。
(“align”我都理解为校准,可能会不对,欢迎指正,谢谢)
2018.6.6 模型架构:将SAGAN模型中的self-attention机制添加到了GAN v2.2中。
2018.6.25 新版本: faceswap-GAN v2.2 被发布,这个版本的主要贡献就是:它能够生成逼真且一致的眼球运动,而且人脸对齐(face alignment)的视频质量更高。
2018.6.29 模型架构: faceswap-GAN v2.2 的输出会支持不同大小的分辨率,包括:64*64,128*128,256*256.在配置参数里修改对应位置即可。
2018.7.25 准备数据模块的更新:增加了人脸video的预处理方法,即利用MTCNN进行人脸检测和人脸对齐。
2018.8.27 提供了一个基于GAN v2.2的Demo
发布了一个可以在Google浏览器上训练模型的demo,用户可以在浏览器上训练自己的 faceswap-GAN v2.2(具体链接请去原文看,反正我的VPN没打开....)
faceswap-GAN v2.2的介绍
FaceSwap_GAN_v2.2_train_test.ipynb :
faceswap-GAN V2.2 模型训练的说明;
这个文件也提供了静态图像转换的代码;
如果你需要额外的生成训练图像,点击他给的链接进去看代码即可。
FaceSwap_GAN_v2.2_video_conversion.ipynb:
faceswap-GAN V2.2 模型进行视频转换步骤的说明;
脸部校准(face alignment)运用的5 point landmarks的方法,在其中有所介绍。
prep_binary_masks.ipynb:
faceswap-GAN V2.2 模型进行训练数据预处理步骤的说明;
输出的二进制掩膜被存在所示的两个路径下 ./binary_masks/faceA_eyes
和 ./binary_masks/faceB_eyes;
包含face_alignment模块。还有一个可选的另一种获得二进制掩膜的方法,存在 MTCNN_video...这个模块(链接)中。
MTCNN_video_face_detection_alignment.ipynb:
这个模块展示了 对于输入视频的人脸检测和校准过程。
被检测的人脸根据是否进行校准,分别存在了./faces/raw_faces
a和 ./faces/aligned_faces
这两个文件中。
粗糙的眼睛二进制掩膜也被生成了,被存在 ./faces/binary_masks_eyes
. 之中。在prep_binary_mask .ipynb(上面介绍的模块之一)中,使用这些粗糙的眼睛二进制掩膜可以作为一个次优选择。
Usage(使用方法):
1. 运行 MTCNN_video_face_detection_alignment.ipynb从视频中分离(Extract)人脸。手动的将已经校准的脸,移动/重命名进 ./faceA/
和 ./faceB/
folders两个文件中。
2. 运行 prep_binary_masks.ipynb 为训练数据生成二进制掩膜;这一步骤是可以被跳过的:
(1)把use_bm_eyes参数设置为False
(2)使用步骤1中生成的低质量二进制掩码
3. 运行 FaceSwap_GAN_v2.2_train_test.ipynb 来训练模型。
4.运行 FaceSwap_GAN_v2.2_video_conversion.ipynb,运用训练出来的模型进行转换。
Demo应用:
faceswap-GAN_colab_demo.ipynb 它说是一个demo,实际上和上面介绍Google所支持的那个demo是一个东西。
训练数据的格式:
Face的图像都应存在 ./faceA/
和 ./faceB/
中。
训练的话,图像大小resize为256x256。
1.架构:
今天只是翻译一下,具体的原理还没看,不过Generator的部分(Encoder+Decoder),如果看了最上面我推荐的博客,应该算有初步了解,至于下面的Discriminator,就涉及到了GAN的"对抗“”原理。(起到了一个监督Generator的作用)
2.Result:
(1)Adversarial loss提高了生成的图片的重建质量,也就是提高了输出质量。如下图:
(2)额外的Result:
文章中 This image 这个链接点进去是这个工程生成的160个生成结果(利用GAN v2.2 结合self-attention机制)。
(3)一致的眼球运动:
上文介绍GAN的更新过程时提到过,把眼球检测加了进来。这就是说GAN v2.2在较短时间内生成了更为真实的眼睛(输入的gif是根据DeepWap这个工程生成的)
第一行是v2版本的GAN的效果,第二行是v2.2.版本的效果(其中第1.3.5列为输入的gif,2.4.6为效果)
(4)评估:
这里给了一个传送门,点 here 里面有他们关于 Trump/Cage 这个训练集的输出质量的评估结果。
3.Features:
(1)VGGface 的 perceptual loss:
perceptual loss 改善了眼球的方向,使其更加真实,与输入的人脸更加一致。它还平滑了分割掩模中的工件,从而提高了输出质量。(还不太明白)
(2)Attention mask:
模型预测了一种Attention mask,可以帮助处理遮挡,消除人为干扰,并产生看起来自然的肤色。下图是Hinako佐(佐野ひなこ)对Emi武井(武井咲)的转换的结果。
下图:从左到右: 原始图、转换后的图(没有Attention mask),转换后的图(有Am)
下图:从左到右: 原始图、转换后的图(有Am),转换后的掩膜热图
(3)输入输出分辨率是可以配置的:
支持64*64,128*128,256*256分辨率的输出
(4)在视频转换过程中使用MTCNN和卡尔曼滤波器进行人脸跟踪/校准:
引入MTCNN进行更稳定的检测和可靠的人脸校准。
利用卡尔曼滤波器取平滑每一帧上的边界框位置,消除脸部的抖动。(Kalman Filter是进行运动模型检测研究的经典方法)
(5)训练的时间建议:
给的demo提供了一个预定义的训练时间表。以上展示的Trump/Cage换脸的模型是经过设置迭代次数为30000的同时实际迭代21000次之后的结果。
(训练技巧:在训练后期交换解码器,减少极端面部表情造成的伪影。例如,使用这个技巧可以更好地转换(上面结果的)一些失败案例)(在尝试)
(6)Eye-aware的训练:
在眼周区域引入reconstruction loss 和 edge los,引导模型生成逼真的眼睛。
1.这个网络是怎么工作的?
下面的插图显示了一个非常高级和抽象(但不是完全相同)的去噪自动编码器算法流程图。跟着的链接展示了这个算法的目标函数。
(来源: shaoanlu/faceswap-GAN)
图片中展示了文章开头提到的Adversarial loss 和 Perceptual loss,上方的MAE loss指的是GAN网络的Generator部分的auto-Encoding(自编码)网络的loss,loss越低说明自编码网络的Encoder训练的越好(一般情况下)。
2. 预览看起来是不错的,不知道转换为输出视频,效果会怎样?
当使用人脸校准方法对输入图像进行预处理后,模型效果还是不错的。