中间的照片是一张浴室自拍的原始照片。左边是“男性”滤镜的效果,右边是“女性”滤镜的效果。
大多数用户可能会注意到的第一件事是这个滤镜是实时工作的,你可以使用几个不同的角度,并且不需要联网也能运行。戴着毛线帽的时候,头发的渲染表现也非常自然。
下图是一个我在转头的时候拍摄的动图。应用程序似乎能检测到面部是否指向指定的方向,并且只有满足该布尔值的时候才会触发滤镜效果。
性别交换滤镜可适用于各种光线条件,但是头发似乎没有阴影的投射。
你看变身女装大佬的我是不是很可爱[嘻嘻]。
从前面的观察来看,它的效果非常好。那么我们可以让它失败吗?该滤镜可以检测出人脸是否处于错误的姿势,但是如果有东西挡住了脸怎么办,那么被遮挡的人脸也会被“转性”吗?答案是肯定的。下面是一个(水平遮挡的)测试,我在脸上滑动一个物体。当仅有半边脸被遮挡时,滤镜就能正常工作,但如果脸部被遮挡的太多,“我应该换脸吗”的选项就会被设为False。
再来看下垂直遮挡,这里的滤镜效果似乎取决于“脸部区域被遮挡的百分比”,而不是什么重要的语义特征(例如眼睛、嘴唇)被遮挡。就在滤镜决定“我应该换脸吗”应该切换到“False”之前,你可以看到手中拿着的白色的瓶子变模糊了。而且,当我把瓶子放在视线中央时,我的头发变成了金黄色。这个效果很有趣。在我看来,这一定是机器学习在起作用,它会从训练过的数据中提取一些数据进行渲染。那么问题来了,金发女郎会继续做更多的化妆教程吗?
我用黑色的活性炭面膜遮住了一部分脸,得出的渲染效果似乎很稳定。女性的滤镜确实将面膜稍微消除了。从下面的GIF可以很明显地看出,“面部交换”功能仅限于追踪头部的矩形区域(注意头发到达我肩膀时的尖锐截止)。
把面膜揭除的时候,渲染效果则令人惊讶地稳定。
我对头发的真实感印象最深,所以我想弄清楚是否有用于动态照明的头发网格模型,或者是否都是基于机器学习的。
头发似乎会被渲染为最顶层(就像Photoshop的图层),但与平常所用的简单的小狗耳朵/舌头的滤镜不同,这个头发层有一个部分透明的alpha通道。如果你仔细观察,头发上还有一个清晰的分割面罩,可以让脸部显露出来。Snapchat可能正在进行头部的跟踪,以确定头部的位置,并计算头发的2Dalpha蒙版。
头发和面部的变换似乎是各自独立合成的,因为它们占据不同的图层(或者可能是一起合成的,并在渲染之前分割成不同的图层)。这也是我第一次看到GANs被用来渲染alpha通道。我有点怀疑头发是不是真的由GAN产生。一方面,显然有一些平滑的功能,它可以根据遮挡物体的位置切换高光和头发颜色,这表明颜色可能部分是从数据中习得的。另一方面,头发非常稳定,我很难相信它完全是用GAN发生器合成的。我看过一些其他东亚男性用类似发型换脸的例子,这表明可能存在一个大型的haridos模板库(用一些机器学习模型进行了改进)。
Snap的ML工程师如何知道,CycleGAN在这么大的数据集上训练以后到底收敛没有?
只有如此有限的计算资源,他们是怎么把这种水平的神经网络运行起来的?它们动态生成的图像分辨率是多少
如果它确实是一个CycleGAN,那么将男性滤镜应用于我的女性滤镜图像的时候应该恢复成原始图像才对,对吗?
如上面动图所示,这张照片的比例基本不变,但当我们把它放大得非常近时,这张脸确实更像是我的脸。我猜想在将标准的人脸图像输入神经网络之前,会有一个预处理步骤对其进行裁剪和大小调整。这个滤镜中可能还有其他的子程序,例如调整下颚大小,它们不使用CycleGAN,但是它的添加会使得M2F和F2M滤波器不再完全相反。
我有个朋友就是这样,他在做变装之前要做很多的工作。我对这样的技术感到非常兴奋,因为它会让化妆师、角色扮演者和变装艺术家更容易以更廉价更快速的方式尝试新的想法和身份。