如何在Python中使用Deep Learning实现iPhone X的FaceID

新款iPhone X最受欢迎的功能之一就是新的解锁方法,即TouchID的继任者:FaceID。

在这篇文章中,将展示如何使用Keras实现一个类似FaceID的算法。我将解释我采取的各种架构决策,并展示一些最终实验,使用Kinect,一种非常流行的RGB和深度相机,它具有与iPhone X前置摄像头非常相似的输出,让我们开始逆向设计苹果的新游戏改变功能。

了解FaceID

如何在Python中使用Deep Learning实现iPhone X的FaceID

FaceID设置过程

第一步是仔细分析FaceID如何在iPhone X上工作。他们的白皮书可以帮助我们理解FaceID的基本机制。使用TouchID时,用户必须通过按几次传感器来初始登记其指纹。在大约15-20次不同的触摸之后,智能手机完成了注册,并且TouchID准备好了。同样,用FaceID用户必须注册面部。这非常快速的注册程序可以告诉我们很多关于底层学习算法的信息。例如,支持FaceID 的神经网络不仅仅是执行分类。

如何在Python中使用Deep Learning实现iPhone X的FaceID

Apple Keynote推出iPhone X和FaceID

对神经网络进行分类意味着学习如何预测它的脸是否是用户的脸。所以,它应该基本上使用一些训练数据来预测“真实”或“虚假”,但与许多其他深度学习用例不同,这种方法无效。首先,网络应该重新从头开始使用从用户脸上获得的新数据进行训练。这需要大量时间,能量消耗和培训数据的不切实际的可用性不同面孔有负面的例子(在转移学习和已经训练好的网络的微调情况下,很少会改变)。此外,这种方法不会利用苹果的可能性来“培训”更复杂的“离线”网络,即在他们的实验室中,然后将其运送到已经训练好且可以在手机上使用的网络中。相反,我相信FaceID是由类似暹罗式的卷积神经网络驱动的,该网络由苹果公司“离线”训练,将脸部映射到低维潜在空间中,利用对比损失最大化不同人脸之间的距离。

如何在Python中使用Deep Learning实现iPhone X的FaceID

FaceID看起来会是TouchID之后的新标准。苹果是否会把它带到他所有的新设备上?

从人脸到神经网络的数字

一个暹罗神经网络基本上由两个相同的神经网络组成, 同时也共享所有的权重。此体系结构可以学习计算特定类型数据 (如图像) 之间的距离。这个想法是,你通过暹罗网络传递数据(或者简单地通过两个不同的步骤通过同一网络传递数据),网络将它映射到一个低维特征空间,就像一个n维数组,然后你训练网络进行映射,使不同类别的数据点尽可能地多,同一类别的数据点尽可能接近。从长远来看,网络将学习从数据中提取最有意义的特征,并将其压缩成一个数组,从而创建一个有意义的映射。为了对此有一个直观的理解,想象一下如何使用小向量来描述狗的品种,以便类似的狗具有更接近的向量。你可能会用一个数字来编码狗的毛色,另一个用来表示狗的大小,另一个用于毛的长度,等等。这样,彼此相似的狗将具有彼此相似的向量。很聪明,对吧?那么,一个暹罗神经网络可以学习为你做这件事,类似于一个自动编码器。

如何在Python中使用Deep Learning实现iPhone X的FaceID

Hadsell,Chopra和LeCun发表的论文“通过学习不变映射降维”

使用这种技术,人们可以使用大量面孔来训练这样的体系结构,以识别哪些面最相似。拥有正确的预算和计算能力(正如苹果所做的那样),人们还可以使用越来越难的例子,使网络对诸如双胞胎,对抗性攻击(掩模)等事物具有稳健性。使用这种方法的最终优势是什么?你终于有了一个即插即用的模型即可在不需要进一步训练的情况下识别不同的用户,但只需在初始设置期间拍摄一些照片后,计算用户的脸部位于脸部潜在地图中的哪个位置即可。(想象一下,如前所述,为一只新的狗写下狗品种的载体,然后将其存储在某个地方)。另外,FaceID能够适应你的方面的变化:突然变化(例如,眼镜,帽子,化妆)和减缓变化(面部毛发)。这是通过基本上在此映射中添加参考面向量来完成的,根据您的新外观进行计算。

如何在Python中使用Deep Learning实现iPhone X的FaceID

当你的外表改变时FaceID会适应请点击此处输入图片描述

在Keras中实现FaceID

机器学习项目,我们首先需要的是数据。创建我们自己的数据集需要时间和许多人的协作,而这可能会非常具有挑战性。因此,我浏览了网络上的RGB-D人脸数据集,并且发现了一个看起来非常合适的人脸。它由一系列面向不同方向并制作不同面部表情的人的RGB-D图片组成,就像在iPhone X用例中发生的一样。

我创建了一个基于SqueezeNet架构的卷积网络。网络输入耦合面的RGBD图像,因此是4通道图像,并输出两个嵌入之间的距离。该网络训练有一个固定的损失,使同一人的照片之间的距离最小,并使不同人的照片之间的距离最大化。

如何在Python中使用Deep Learning实现iPhone X的FaceID

对比损失

经过一些训练后,网络能够将人脸映射成128维阵列,使得同一人的图片被分组在一起,而与其他人的图片相距甚远。这意味着,要解锁您的设备,网络只需计算在解锁过程中拍摄的照片与在注册阶段存储的照片之间的距离。如果距离低于某个阈值,则设备解锁(设备越小,设备越安全)。

我使用t-SNE算法在两维中可视化128维嵌入空间。每种颜色都对应不同的人:正如你所看到的,网络已经学会了将这些图片分组得很紧密。(当使用t-SNE算法时,簇之间的距离没有意义)使用PCA降维算法时也会出现一个有趣的情节。

如何在Python中使用Deep Learning实现iPhone X的FaceID

使用t-SNE创建的嵌入空间中的人脸簇。每种颜色都是不同的面孔(但颜色被重复使用)

如何在Python中使用Deep Learning实现iPhone X的FaceID

使用PCA创建的嵌入空间中的人脸群集。每种颜色都是不同的面孔(但颜色被重复使用)

结论

在这篇文章中,展示了如何基于人脸嵌入和连体卷积网络实现FaceID解锁机制的概念验证。

所有的代码可以有python实现,可以去阅读Github。

相关推荐