拍照表情管理不好?用Masking GAN让每个人都露出灿烂笑容
编者按:本文来自微信公众号“将门创投”(ID:thejiangmen),来源:Medium,编译:Tom R,36氪经授权发布。
很多小伙伴都利用生成对抗网络(GAN)进行过各种各样的有趣的实验,虽然GAN难以训练和评价,但它仍然在深度学习领域占有十分重要的位置。究其原因是因为GAN为我们打开了一扇完全不同于传统机器学习研究的全新大门。
对人脸特征进行各种各样有趣的操作(年龄、性别、表情等)是图像语义操作中最为有趣的问题,人们可以将这样的功能集成到很多移动app中来修改拍照后的面部表情。虽然有很多各种各样的实现方法,但GANs却有着最为出众的表现——让你的照片绽放笑容~ 😄
下图是Age-cGAN,CycleGAN和IcGAN处理后的示意图,但这些应用中我们都会面临一个严重的问题:GAN会改变不需要改变的部分,比如说图像的背景,特别是对于只需要对图像中一小部分进行操作的任务尤其明显!
相关链接
https://arxiv.org/abs/1702.01983
https://arxiv.org/abs/1703.10593
https://arxiv.org/abs/1611.06355
接下来就让我们一起来看看本文作者Georgiy Trofimov是如何突破这一问题的瓶颈的。
解决方案
为了解决上面提到的问题,一种可行的解决办法是单独训练分割模型,利用它来生成一个匹配生成图像中目标的掩膜。但这随之而来的是两个问题,第一训练数据的获取十分复杂,第二你必须假设GAN对于图像的语义操作不会改变对象的外形。
基于条件掩膜的GAN
https://arxiv.org/abs/1708.00315v1
看来这个办法不是太靠谱,那么另一种方法呢?
我们还可以利用损失函数来限制生成器的行为,从而迫使生成器减小对于无关区域的影响。作者通过对以上两个想法的综合提出了自己的解决方法:
1. 利用生成器架构的内置分割;
2. 将原始图像和通过分割掩膜后的图像块混合;
3. 端到端地训练整个神经网络;
4. 利用L1损失函数约束生成器并减小图像的改变。
这就是最后实施的想法,作者希望模型可以生成完美的掩膜,并可以训练出一个很好的分割模型。
结果如何?
下图是作者选取的结果,最终结果中超过80%的模型输出被接受。
看起来很不错,图中的人都发出了灿烂的微笑而且背景没有被显著的改变。但作者还是发现了一些问题:
1. 如果照片中的人已经在笑的话,网络机会不会对模型进行任何操作;
2. 对于一些极特殊的头部角度处理的效果并不好;
3. 有时候还是会有一些不希望的地方别GANs改变。
生成的结果随着训练次数的变化情况
在最初的几次训练中,生成器生成了越来越逼真的图像,但随着训练的增加模型开始显示出一系列人工雕琢的痕迹,比如说头发和面部颜色都发生了些许的变化。
思考与回顾
对于上面出现的情况其主要的原因在于:当生成器生成了逼真的面庞时,它迫使判别器忽略了表情并让它将注意力集中于其他的位置和特征(此时,笑容已经不是主要的特征了)。
还有一种理解来自于判别器的过拟合(虽然拥有约100000个的训练样本),如果加入更为强烈的正则化项可能会帮助网络更好地理解图像的主要特征。
同样对于其他的数据集(例如斑马-马转化的数据集)同样存在这些问题,生成器还是会对图片的其他位置产生影响。
具体的实施步骤:
1.训练CycleGan网络;
2.利用对齐后的CelebA数据集进行训练;
3.具体框架使用了PyTorch。
上面的结果是作者在3Gb的GPU(GTX 1080)上训练了4-5天的时间得到的。具体的可以移步https://github.com/tgeorgy/mgan。祝大家2018牙齿天天晒太阳~ ☀