对 iPhone X 的全新解锁机制进行逆向工程。python
本文涉及到的全部 Python 代码能够在这里获取。git
https://github.com/normandipalo/faceID_betagithub
围绕新款 iPhone X 最热议的话题之一就是用于取代触控 ID 的全新解锁机制: Face ID。算法
为了顺利打造出无边框的全面屏手机,Apple 必须开发一种能快速简单地解锁手机的全新方法。虽然不少竞品依然在全面屏手机上使用指纹传感器,但必须将传感器放置在其余位置,而 Apple 决定经过创新为手机开发一种革命性的全新解锁方式:注视一眼就够了。借助先进(而且体积很是小巧)的 前置原深感摄像头,iPhone X 能够为用户的面孔建立 3D 面谱,此外还会使用红外镜头捕获用户面孔照片,这样即可更好地适应环境光线与色彩的变化。借助 深度学习 技术,这款手机能够学习用户面容的细节变化,确保用户每次拿起本身的手机后都能快速解锁。使人惊讶的是,Apple 宣称这种方法甚至 比触控 ID 更安全,错误率可低至 1:1,000,000。安全
我对 Apple 实现 Face ID 所用的技术很好奇,尤为是考虑到这个功能彻底是在设备本地实现的,只须要经过用户面容进行少许训练,就能够在用户每次拿起手机后很是流畅天然地完成识别。因而我研究了如何使用深度学习技术实现这一过程,并对每一个步骤进行优化。本文我将介绍如何使用 Keras 实现相似于 Face ID 的算法。我会介绍在选择最终架构时的考虑因素,以及经过 Kinect 这一流行的 RGB 和景深摄像头(能得到与 iPhone X 的前置摄像头很是相似的输出结果,但体积略大)进行实验的过程。找个温馨的姿式坐下来,端起茶杯,开始进行 Apple 创新功能的逆向工程吧。微信
“…驱动 Face ID 的神经网络并不只仅是执行分类操做那么简单。”网络
Face ID 的配置过程架构
首先须要细致分析一下 iPhone X 中 Face ID 的工做原理。Apple 提供的白皮书能够帮助咱们理解有关 Face ID 的基础机制。在使用触控 ID 时,用户首先要触碰传感器屡次,以注册本身的指纹。在进行过大约 15–20 次触碰后,便可完成注册过程,随后就可使用了。相似的,使用 Face ID 时,用户也要注册本身的面孔信息。整个过程很是简单:按照正常使用时的操做注视本身的手机,随后缓慢旋转头部画圈,经过不一样姿态注册本身的面孔便可。就这么简单,随后就能够用本身的面孔解锁手机。这个极为快速的注册过程可让咱们深度了解该技术底层的学习算法。例如,驱动 Face ID 的神经网络并不只仅是执行分类操做那么简单,下文会介绍具体缘由。app
Apple Keynote 演示文稿中展现的 iPhone X 和Face IDiphone
对于神经网络来讲,执行分类操做意味着须要学着预测本身看到的面孔是否就是用户本人的面孔。所以基本上,神经网络须要经过一些训练数据来预测“真”或“假”,可是与不少其余深度学习用例不一样的地方在于,此时使用这种方法是不可行的。首先,网络须要经过从用户面孔新得到的数据,从头开始从新进行训练,这将须要花费大量时间并消耗大量电力,而不一样面孔会产生数量多到不切实际的训练数据,这也会产生消极的影响(就算使用迁移学习或对已训练网络进一步优化,效果也不会有太大改善)。此外,这种方法将没法让 Apple 以“脱机”方式训练更复杂的网络,例如在实验室中训练网络,而后将训练好的网络包含在产品中交付给用户使用。所以我认为,Face ID 是由一种连体(Siamese-like)卷积神经网络驱动的,该网络由 Apple“脱机”训练而来,可将面孔映射为低维隐空间(Low-dimensional latent space),并经过形状调整,使用对比损失(Contrastive loss)的方式得到不一样用户面孔间的最大距离。借此打造的架构只须要经过一张照片便可学习,这一点在发布会的演讲上也有提到。我知道,这其中涉及的某些技术可能对不少读者而言还显得挺陌生,下文将按部就班地进行介绍。
Face ID 彷佛会成为继触控 ID 以后的新标准,Apple 是否会让之后的全部设备都支持它?
简单地说,连体神经网络实际上由两个彻底相同的神经网络组成,这两个网络会共享全部权重。这种架构能够学着计算特定类型的数据,例如图片间的距离。而其主要目的在于,向连体网络传递一对数据(或向同一个网络传递处于两个不一样阶段的数据),网络会将其映射至一个低维特征空间,例如 n 维阵列,随后训练网络实现所需映射关系,让来自不一样类的数据点可以尽量远离,同时让来自同一个类的数据点可以尽量接近。经过长时间运行,网络便可学习从数据中提取最有意义的特征,并用这些特征产生阵列,建立出有意义的映射。为了更直观地理解这一过程,能够假设你本身使用小向量描述狗的种类的方法,越是相似的狗,它们就会有越接近的向量。你可能会使用某个数字表明狗毛颜色,用另外一个数字表明狗的大小,并用其余数字表明狗毛长度,以此类推。经过这种方式,类似的狗将得到类似的向量。很聪明对吧!而连体神经网络能够经过学习帮助咱们作到这一点,这也有些相似 autoencoder 的功能。
Hadsell、Chopra 和 LeCun 撰写的论文《Dimensionality Reduction by Learning an Invariant Mapping》中提供的插图。请留意该架构学习不一样数字之间类似性,并将其自动分组为两个维度的方法。相似的方法也能够用于处理面容信息。
经过这种技术,咱们可使用大量面容照片训练相似的架构来识别哪些面孔是类似的。只要(像 Apple 那样)有足够的预算和运算能力,任何人均可以使用难度愈来愈大的样本改善网络的健壮性,成功应对双胞胎、对抗性攻击(面具)等场景。使用这种方式的最终优点是什么?咱们终于能够经过一个即插即用模型直接识别不一样用户,而无需任何进一步的训练,只要在初始配置时拍摄一些照片,随后计算用户的面孔与面孔的隐映射(Latent map)之间的距离就好了。(按照上文所述,这个过程能够类比为:对新出现的狗记录下品种的相关向量,随后将其存储在某个地方。)此外 Face ID 还能够适应用户面容的变化,例如突发的变化(眼镜、帽子、化妆等)以及缓慢的变化(面部毛发)。这其实是经过在映射中添加基于新外貌计算出的参考性质的面容向量实现的。
Face ID 能够适应用户外表的变化
最后,让咱们一块儿来看看如何使用 Python 在 Keras 中实现这一切。
对于全部机器学习项目,首先咱们须要有数据。自行建立数据集须要花费大量时间,还须要不少人配合,这可能不太好实现。所以我在网上搜索现成的 RGB-D 面容数据集,而且还真找到了一个很是适合的。其中包含一系列 RGB-D 形式的人脸图片,图片采用不一样角度和表情拍摄,彻底符合 iPhone X 的实际用例。
为了直接看到最终效果,能够访问个人 GitHub 代码库,我在这里提供了一个 Jupyter Notebook。此外我还试验过使用 Colab Notebook,你本身也能够试试。
随后我建立了一个基于 SqueezeNet 架构的卷积网络。该网络能够接受 RGBD 格式的四通道人脸图片做为输入,并输出两个图片之间的距离。该网络使用对比损失的方式训练,借此在同一我的的不一样照片之间得到最小距离,并在不一样人的照片之间得到最大距离。
对比损失
训练以后,该网络可将面容映射为 128 维度的阵列,同一我的的不一样照片可分组在一块儿,并会拉开不一样人的照片之间的距离。这意味着若是要解锁你的设备,网络只须要计算解锁时所拍摄的照片以及注册阶段所存储的照片间的距离便可。若是距离低于某个阈值(阈值越小,安全性越高),设备便可顺利解锁。
我使用 t-SNE 算法对 128 维度的嵌入空间进行二维可视化,并用每一个颜色对应一我的员。如你所见,网络已经能够学着将图片进行尽量紧密的分组。(使用 t-SNE 算法时,聚类间的距离已再也不重要)。在使用 PCA 降维算法时还出现了一种有趣的分布。
使用 t-SNE 在嵌入空间中建立的面容聚类。每一个颜色表明一个不一样的人脸(不过颜色有重复使用)
使用 PCA 在嵌入空间中建立的面容聚类。每一个颜色表明一个不一样的人脸(不过颜色有重复使用)
接着能够试试这个模型的效果了,咱们将模拟 Face ID 的操做过程:首先注册用户面容,随后分别使用用户本人(应该能成功)以及他人的面容(应该会失败)试着解锁。正如上文所述,两种状况的差别在于,网络对解锁时以及注册时拍摄的面容计算出的距离,以及这个距离究竟是低于仍是高于某个阈值。
首先注册:从数据集中挑选同一我的的不一样照片,而后模拟注册过程。随后设备会开始计算不一样姿式的嵌入,并将其存储在本地。
模拟 Face ID 的新用户注册环节
景深摄像头在注册阶段看到的内容
接着看看用户本人解锁设备时会发生什么。同一我的的不一样姿式和面部表情产生的距离很小,平均仅为大约 0.30。
同一用户在嵌入空间中的面容距离。
然而不一样用户的 RGBD 照片的平均距离高达 1.1。
不一样用户在嵌入空间中的面容距离。
所以将阈值设置为 0.4 左右就足以防止陌生人解锁你的设备。
本文介绍了基于面容嵌入和连体卷积网络,从概念证明的角度实现 Face ID 解锁机制的方法。但愿本文对你有所帮助。本文涉及到的 Python 代码可在这里获取。
阅读英文原文:
https://towardsdatascience.com/how-i-implemented-iphone-xs-faceid-using-deep-learning-in-python-d5dbaa128e1d
更多干货内容请关注微信公众号“AI 前线”,(ID:ai-front)