前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在 Python 内使用深度学习实现 iPhone X 的 FaceID

如何在 Python 内使用深度学习实现 iPhone X 的 FaceID

作者头像
AI研习社
发布2018-09-25 16:12:23
7540
发布2018-09-25 16:12:23
举报
文章被收录于专栏:AI研习社AI研习社

本文为 AI 研习社编译的技术博客,原标题 How I implemented iPhone X's FaceID using Deep Learning in Python,作者为 SHIVAM BANSAL。 翻译 | 陶玉龙 余杭 校对 | Lamaric 整理 | MY

在最近推出的 iPhone X 中,它被讨论最多的特点之一是它采用了新的解锁方法,即 TouchID:FaceID。

在研发出无边框手机后,苹果公司想开发一种新的方法来快捷地对手机进行解锁。虽然一些竞争对手依旧在继续使用指纹传感器,把它放置在手机的不同位置上,但苹果公司决定进行创新,采用革命性的方式来进行手机解锁:用户只需要简单地看它就可以。借助于先进的(非常小)前置相机,iPhone X 能够对用户的脸创建一个 3D 地图。此外,这项技术使用红外摄像机捕获用户面部的照片,对环境的光和颜色变化具有更好的鲁棒性。使用深度学习技术,智能手机能够很好地了解用户的脸部,当他每次拿起电话时都能准确认出他。令人惊讶的是,苹果公司称这种方法比 TouchID 技术更安全,错误率仅为 1:1,000,000。

我对苹果公司使用的 FaceID 技术非常感兴趣,主要是因为这一切都是在移动设备上进行的,这项技术只利用了用户的脸进行了少量的初始训练,然后在每次拿起电话时都流畅地运行。我专注于如何使用深度学习来实现这一过程,以及如何对每一步进行优化。在本文中,我将演示如何使用 keras 实现 FaceID 这一类算法。我会解释我所采取的各种架构决定,并展示一些我最终完成的实验,这些实验是我使用 Kinect 来完成,一个非常受欢迎的 RGB 深度相机,它与 iPhone X 前置相机有着非常相似的输出(但在一个更大的设备上)。坐好,然后美美的喝一杯咖啡,让我们开始逆向搭建苹果这一改变游戏规则的功能。

理解 FaceID

“用于 FaceID 的神经网络并不是简单地执行分类”。

FaceID 的安装过程

第一步是仔细分析 FaceID 是如何在 iPhone X 上工作的。苹果公司官方布的白皮书可以帮助我们理解 FaceID 的基本机制。为了使用 TouchID,用户必须先按几次传感器来录入他的指纹。在大约 15 到 20 次不同的触摸之后,智能手机就完成了指纹的录入,TouchID 也准备好了。同样,使用 FaceID,用户必须录入他的脸部照片。这个过程非常简单:用户只需像平常那样看着手机,然后慢慢地旋转一个圆圈,把不同的姿势的脸部录入手机中。就这样,我们完成了这个过程,你的手机已经准备好解锁了。这种快速的录入过程可以告诉我们很多有关底层学习的算法。例如,神经网络的 FaceID 不仅仅是执行分类,我会在下文解释原因。

苹果公司主页揭晓 iPhone X 和 FaceID 的示例图

对于神经网络而言,执行分类操作意味着他需要通过学习来预测它所看到的面孔是否属于之前看过的那个用户。因此,一般来说它应该使用一些训练数据来预测真或假,但与许多其他的深层学习案例不同,在这里,这种方法是行不通的。首先,网络应该使用从用户的面部获得的新数据进行重新训练。这将需要大量的时间、会造成很多能量消耗以及会有很多不同面孔产生的负样本训练数据(在传输学习和已训练的网络的精细调整方面几乎没有变化)。此外,这种方法几乎没有会被利用的可能性,对于苹果公司而言,他们会在离线情况下训练一个更复杂的网络,通常是在他们的实验室,然后把这些已经训练好的网络装载到手机中进行应用。我相信 FaceID 是由一个孪生卷积神经网络支持的,它被苹果公司训练成「离线」状态,将脸部映射成一个低维的潜在空间,用对比损失表示方法来最大化不同人脸之间的距离。用这种方法,你得到了一个单阶段学习的体系结构,就像他们在要点中提到的一样。我知道,这里可能有一些名词读者并不是很熟悉:继续阅读,我会逐步解释我想表达的意思。

现在看起来,FaceID 会成为 TouchID 之后的新标准。苹果公司会把这项技术带到他们研制的所有新设备中吗?

从人脸到数字的神经网络

一个孪生神经网络是由两个基本相同的神经网络组成,它们共享所有的权重。这种架构可以计算特定类型的数据之间的距离,例如图像。这个思路是通过孪生神经网络传递数据(或者简单地通过两个不同的步骤通过同一个网络传递数据),网络将它映射到一个低维特征空间中,比如一个 n 维数组,然后训练网络进行映射的搭建,以便尽可能地使用来自不同类的数据点,而让来自同一类的数据点尽可能接近。从长远来看,网络将学会从数据中提取最有意义的特征,并将其压缩为数组,从而创建有意义的映射。要想直观地理解这一点,想象一下你是如何使用小矢量来描述狗品种的,让相似的狗有更接近的矢量。您可能会使用一个数字对狗的毛色进行标记,一个数字用于表示狗的大小,另一个数字用于表示毛发的长度,依此类推。用这种方式,彼此相似的狗将具有彼此相似的矢量。着看上去是一个很聪明的方法,对吧?类似于什么一个自动编码器,孪生神经网络可以为你学会如何去实现这一个过程。

这张图来自 Hadsell、Chopra 和 LeCun 发表的论文「Dimensionality Reduction by Learning an Invariant Mapping」。注意该结构是如何学习数字之间的相似性并自动将它们分组为二维的。类似的技术被应用于 Iphone X 的面部识别技术中。

运用这项技术,人们可以使用大量的脸部图像对这个架构进行训练,从而识别出哪些脸部最为相似。在拥有合适的预算和计算能力时(正如 Apple 公司那样),人们也可以使用更难的例子来使网络更具鲁棒性,诸如双胞胎,对抗性攻击(掩码)等。那么使用这种方法的最大优势是什么呢?你最终会拥有一个即插即用模型,在无需进一步训练的前提下可以识别出不同用户,只需在初始设置过程中拍摄一些照片,计算用户脸部在隐藏图中的位置。(想象一下,正如前文所述,我们为新的狗品种写下它的矢量,然后将其存放在某处)。此外,FaceID 能够适应脸部的一些变化:突然变化(例如眼镜,帽子,化妆)和减慢变化(面部毛发)。这是通过在此图中基本添加参考面向量来完成的,这些参数可以根据您的新外表进行计算。

当您的外观发生变化时,FaceID 会自动适配。

现在,让我们看看如何使用 Keras 在 Python 中实现它。

在 Keras 中实现 FaceID

对于所有机器学习项目来说,我们首先数据集。创建我们自己的数据集需要时间同时离不开和其他许多人的合作,这可能非常具有挑战性。因此,我浏览了网页上的 RGB-D 人脸数据集,我找到了一个看起来非常合适的例子。它由由一系列从不同方向拍摄、有不同面部表情的 RGB-D 图片组成,就像在 iPhone X 用例中一样。

如果想查看最终实现过程,你可以查看我的 GitHub 库,在里面可以找到一个 Jupyter Notebook 文件。此外,我利用 Colab Notebook 进行实验,你也可以试一试。

我创建了一个基于 SqueezeNet 架构的卷积网络。网络将一系列人脸的四通道 RGBD 图像作为输入,输出两个嵌入之间的距离。网络训练有一个恒定的损失,最小化同一个人的图片之间的距离,并最大化不同人的图片之间的距离。

对比损失

训练过后,神经网络已经能够把脸部映射成一个 128 维矩阵,同一个人的照片组合在一起,与其他人的照片相距很远。这意味着,为了解锁你的设备,神经网络只需要计算在注册阶段解锁设备时存储的相片与它所使用的相片之间的距离。如果这个距离低于某个特定的阈值,(阈值越小,安全性越高)那么设备即可解锁。

我使用 t-SNE 算法在二维空间中可视化 128 维嵌入空间。每个颜色对应于一个不同的人:正如你所看到的,神经网络已经学会把这些相片紧紧地组合在一起。(使用 t-SNE 算法时,簇之间的距离是毫无意义的)。使用 PCA 降维算法时会生成一个非常有趣的图片。

采用 t-SNE 创建的嵌入空间面的簇。每种颜色是不同的面貌(但颜色重复使用)。

使用 PCA 在嵌入空间中生成脸部数据簇。每个颜色代表一个不同的脸部(颜色是重复使用的)

验证!

现在我们可以尝试使用这个模型来模拟一个常用的 FaceID 轮廓 : 首先,注册用户的脸部。然后是解锁阶段,用户的脸部数据可以解锁设备,而其他人的脸部数据不能解锁设备。正如之前所提到的,区分点在于正在解锁手机的脸部数据与注册时的脸部数据之间的距离,并且该距离需要低于一个特定的阈值。

从注册阶段开始:从数据集中提取相同一个人的相片集并模拟注册。设备正在计算每个动作的嵌入,并存储到本地。

FaceID 的新用户注册阶段

深度相机视角的注册极端

让我们一起来看看如果相同用户尝试注册设备会发生什么。相同用户使用不同的姿势以及面部表情所生成的数据点之间的距离很小,平均大概为 0.30 。

相同用户在嵌入空间中的脸部数据点距离。

从另一个方面来说,不同人的脸部 RGBD 图像距离大概在 1.1 左右。

不同用户在嵌入空间中的脸部数据距离

因此,设定阈值为 0.4 可以有效预防陌生人解锁你的设备。

结论

在这篇博客中,我展示了理论上的使用 FaceID 解锁设备的实现,基于脸部数据嵌入空间以及孪生卷积神经网络。希望这篇博客对你们有所帮助,如果有任何问题的话,欢迎联系我。你可以在这里找到所有的 python 代码。你也可以关注我的 Twitter 账号获取我更新的工作以及其他更多内容: https://twitter.com/normandipalo

原文链接:

https://towardsdatascience.com/how-i-implemented-iphone-xs-faceid-using-deep-learning-in-python-d5dbaa128e1d

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-08-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI研习社 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 理解 FaceID
  • 从人脸到数字的神经网络
  • 在 Keras 中实现 FaceID
  • 验证!
  • 结论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档