最近《隐秘的角落》可谓火爆全网,剧中秦昊扮演的张东升一角更是深入人心。如果盘点张东升的名场面,肯定少不了这一幕:“想看看二十年后的自己吗?
两边蜘蛛网,中间溜冰场,作为一名数学老师,张东升年级轻轻已经秃成这样。虽然剧中是化妆特效,不过脱发已经成为年轻人的普遍焦虑,尤其是从事科研、程序员等高压行业的年轻人,好像秃顶已成为注定的宿命,有多少人曾想象过自己二十年后会秃成什么样?
在看完《隐秘的角落》后,B站Up主MarsLUL决定用代码来实现自己的“梦想”。MarsLUL是谷歌的一名在职程序员,曾在加利福尼亚大学(UC Irvine)学习计算机相关专业。
在最近上传的一则视频中,他利用StyleGAN自制了一款秃顶生成器,可以从发量浓密的现在分分钟看到二十年后发量稀疏的自己。先来看一下效果如何?
先来还原东升哥秃顶的全过程,发际线后移的速度着实让人觉得恐怖。
从生成效果来看,除了面部有些区别外,最终发型还是非常一致的。
再来看MarsLUL的,这画面简直无法接受。
网友们的评论更是扎心:仿佛看到了我的未来。
如果你也有脱发焦虑,想看看二十年后的自己,不妨来如法炮制一下。接下来我们来详细说说秃顶生成器是如何实现的。
基于StyleGAN的生成器原理
B站视频中,MarsLUL没有详细呈现代码的实现过程,但所用到的核心技术和详细参考资料均已给出。这款秃顶生成器所用到的技术,如市面上普遍的图片生成器一样,都是英伟达开源的StyleGAN,StyleGAN在图像合成的质量和分辨率方面具备出色的性能,通常我们看到的逼真的人脸交换都是基于它实现的。
基于StyleGAN技术,《Hairstyle Transfer-Semantic Editing GAN Latent Code》(链接见文末),这篇详细讲述了如何在保持人脸不变的情况下,改变发型的全过程。
GAN的基本原理是通过对抗式训练学习从潜在空间分布到真实数据的非线性映射。通常情况下,潜在空间和语义属性之间的关系是未知的。比如潜在代码如何确定生成的发型属性?又如何区别目标属性与非目标属性?
因此,潜码估计和语义编辑是解决潜在空间与语义属性的未知关系的关键。在这里,研究人员对两个模块的原理进行了详细说明。
潜在代码估计:
首先,将输入图像发送至预训练的残差网络进行潜在代码估计,然后将生成的估计值发送给生成器。此时已经完成了对原始输入图像的初步猜想。对于此图像,我们可以将预训练图像分类器应用于特征提取,同时,对输入图像进行相同的特征提取。
接下来,在特征空间中执行梯度下降,将特征向量L2损失最小化并更新潜码估计(红色箭头)。相比于在像素损失上采用梯度下降的方法,这种在语义特征向量执行梯度下降更具有优势,因为直接在像素空间中使用L2优化会陷入不良的局部最优。
生成潜在代码估计
带边界的语义编辑
所谓语义编辑是指在保留所有其他信息的同时编辑具有目标属性的图像,在这里我们的目标属性就是头发。
在编辑之前,我们需要在潜在空间中找到能够分隔二进制属性的特定边界,其中每个边界将对应一个头发属性。如发型、颜色、发际线高低、面部毛发等;
对于任何二进制属性,在潜在空间中都存在一个超平面,使来自同一侧的所有样本都具有相同的属性,这样便可以训练负责每个属性的独立线性SVM。因此,我们需要从StyleGAN的512维潜在空间中找到一个超平面。
要查找超平面,需要配对的潜在代码数据和该属性的分数。最终研究人员决定使用在大型数据集(CelebA)上训练过的预训练分类器来获取头发属性。10个属性匹配的10个分类器大约生成了20k个潜在代码和分数组。这些配对的潜在代码在头发属性上训练了独立的线性SVM,通过验证评估,其准确度达到了80%。
对于每个输入图像,首先在StyleGAN潜在空间中找到它的特定位置,然后沿着特定方向移动,并进行语义编辑。
如上图,研究人员在StyleGAN空间中发现了年轻莱昂纳多·迪卡普里奥(Leonardo DiCaprio)图像的潜码,画出了一个与刘海超平面正交的方向,并沿该方向移动了潜码的位置。最终创建了不同刘海状态的莱昂纳多。以下是最终的动态效果图:
关于条件边界,研究人员谈到许多属性是相互耦合。比如发际线的高低与年龄有关,发型较长的通常为女性,男性的胡子和鬓角更为明显等。因此,将目标属性与其相关属性分开至关重要。
正是出于这一点,这种通过寻找超平面边界来编辑人脸属性的方法也存在一些不足。当使用一个属性编辑面孔时,一些其他属性也可能由于它们的相关性而被更改。另外,该模型也无法完成跨性别的人脸交换。研究人员称或许更多的分类器和使用特殊的数据集训练可以解决以上问题。
最后,MarsLUL坦言自己制作这款秃顶生成器,目的是警醒大家合理作息防脱发!小编奉上完整视频链接,希望大家都能成为发量浓密的程序猿。(雷锋网雷锋网雷锋网)
https://medium.com/swlh/hairstyle-transfer-semantic-editing-gan-latent-code-b3a6ccf91e82