摘要: 本文主要是展现FaceID解锁机器的基本工做机制,采用的方法是基于人脸映射和孪生卷积神经网络,Github上附详细代码。算法
对于果粉们来讲,对新出的iPhone X讨论最多的是其解锁方式,TouchID的继承者——FaceID。对于新一代无边框造型手机而言,各大手机厂商不得不开发新的手机解锁方法以保持其无边框造型。一些苹果手机的竞争对手们继续使用传统的指纹识别传感器,只不过是将其放在其它不影响造型的位置上。而苹果公司这一次又走在了科技潮流的前沿,对其进行了创新,发明了一种更加简便快捷的方法——用户只须要看着手机便可完成解锁过程。因为先进的前摄深度相机,iPhone X可以建立用户人脸的立体图像,此外,使用红外相机捕捉用户面部的图像,这是为了使得系统对环境光线、颜色等变化更具备鲁棒性。以后,经过深度学习,智能手机可以很好地学习用户的面部细节,所以使得用户每次看手机的时候,手机都可以自动识别身份并进行解锁。有些人会对这种方法的准确率产生质疑,毕竟人的指纹是不会变的,而人脸的特征会随着是否留胡须、是否带眼镜、化妆等随之变化。然而使人惊讶的是,苹果公司宣传FaceID比TouchID方法更加安全,并且其错误率仅为1:1,000,000。数组
整个系统过程看着很简单,无非是获取用户人脸图像后,使用深度学习的方法对其进行人脸识别。我好奇的是整个过程是如何应用深度学习方法和如何对每一步骤进行优化,以获得这么高的识别正确率。本文将告诉你们我是如何使用Kears实现一个相似于FaceID算法的。安全
“神经网络给FaceID提供的能力不只仅是执行简单的分类过程”网络
第一步是仔细分析FaceID是如何在iPhone X上工做的。他们的白皮书能够帮助咱们了解FaceID的工做机制。机器学习
使用TouchID时,用户必须先登记本身的指纹,须要在指纹传感器上按压几回,通过大约十几种不一样方位的采集后,智能手机完成整个登记过程。同理,FaceID也须要用户首先登记本身的人脸信息,这个过程更加简单,用户只须要看着手机,而后沿着圆圈慢慢转动头部便可,这样使得可以登记来自不一样角度的人脸信息。这种极快的登记方法涵盖了不少底层的学习算法,下面将一一介绍。性能
对于神经网络而言,执行分类过程意味着学习预测智能手机所看到的人脸是否为其登记的人脸。所以,应该使用一些训练数据来学习到辨别“真”或“假”的能力。但从原理上来说,这与许多深度学习案例不同,传统的一些深度学习方法是使用大量训练数据集来训练模型,这将须要花费大量的时间、精力等。此外,对于苹果公司而言,先训练一个更复杂的离线“网络模型”,训练好后将其迁移到手机上,这样的一种方法是不会被采用的。我相信FaceID是基于相似于孪生卷积神经网络(Siamese CNN)实现的,而且经过离线训练。将人脸映射成一个低维的潜在空间,使得不一样人脸之间的距离最大化,使用对比损失(contrastive loss)衡量模型的性能。学习
孪生神经网络基本上由两个相同的神经网络组成,它们之间共享全部的权重。这种体系结构能够学习计算特定数据类型之间的距离,好比图像。个人想法是经过孪生神经网络,将用户图像映射到一个低维的特征空间,相似于一个n维数组,以后训练网络进行映射,以便尽量地从不一样类别中提取数据点,而来自同一类别的数据点尽量地接近。归根到底,网络将学习从数据中提取最有意义的特征,并将其压缩成数组,以后建立有意义的映射。孪生神经网络可以作到这一点,自动编码器一样也能作到。优化
使用这种技术,人们可使用大量的人脸来训练这样的网络模型以识别哪个面孔与用户者最类似。就像苹果公司所作的那样,人们可使用更难的图像数据来加强网络对双胞胎、敌对攻击(掩码)等的鲁棒性,使其拥有正确的预测和计算能力。使用这种方法的一个最大优势是得到了一个即插即用模型,它能够识别不一样的用户,只须要简单地将初始设置时拍摄的图像映射到潜在空间中,而不须要任何进一步的训练。此外,FaceID可以适应你各方面的变化:忽然变化(如眼镜、帽子、化妆等)和缓慢变化(胡须等)。这些是经过在映射特征空间中添加参考向量,根据新的外观计算出来的。编码
对于全部的机器学习项目而言,首先须要的就是数据。建立本身的数据集须要花费不少时间和精力。所以,本文经过浏览网页得到一个RGB-D人脸数据集。这些RGB-D图像数据是由一系列面向不一样方向以及不一样面部表情的人脸组成,这和iPhone X使用的数据同样。人工智能
为了看到最终的实现效果,你能够看看我我的的GitHub主页,在里面能够发现有一个Jupyter Notebook。此外,我使用Colab Notebook完成本文实验。
本文建立了一个基于SqueezeNet的卷积神经网络模型,该网络模型将RGBD人脸图像做为网络的输入,其输出是两个映射之间的距离。模型训练时使用的对比损失,最终实现最大限度地减小属于同一我的的照片之间的距离,最大化不一样人物照片之间的距离。
通过一些训练后,网络可以将人脸映射为128维数组,这将致使同一我的的照片被分到一块儿,而和其余人的照片尽量的远。这意味着为了解锁手机设备,网络模型只须要计算在解锁过程当中所拍摄的图片与以前登记阶段储存图片之间的距离。若是距离低于某一阈值(该值越小越安全),设备才解锁。
我使用T-SNE算法将128维中的两维特征进行可视化,每种颜色都对应着一个不一样的人。正如图中所示,网络模型已经学会对这些图片进行分组。此外,使用PCA降维算法时,其获得的可视化图像也颇有趣。
实验模拟仿真整个FaceID的流程:首先,对用户面部登记;而后,在解锁阶段,模型经过计算解锁时检测到的人脸与以前登记人脸之间的距离,并肯定它是否在设定的阈值如下,最终判断是否应该解锁手机。
如今让咱们从登记用户开始:从数据集中获取同一我的的一系列照片,并模拟登记过程。设备计算出这些图片的特征映射,并将其存储在本地内存中。
如今看看若是是同一个用户试图解锁设备会发生什么状况。同一用户的不一样姿式和面部表情都会得到一个较低的距离,大约平均为0.30左右。
下面看看若是是不一样用户尝试解锁设备会发生什么状况。不一样用户的人脸图像计算获得的距离平均为1.10。
所以,使用一个0.40左右的阈值就应该足够防止陌生人解锁您的手机设备。
本文主要是展现FaceID解锁机器的基本工做机制,采用的方法是基于人脸映射和孪生卷积神经网络。本文的Python代码能够在这里得到,但愿本文对你有所帮助。
做者信息
Norman Di palo,罗马大学学生,专一于人工智能、机器人。
文章原标题《How I implemented iPhone X’s FaceID using Deep Learning in Python》,做者:Norman Di palo
文章为简译,更为详细的内容,请查看原文