用Python深度学习实现iPhone X的FaceID

181 阅读8分钟
原文链接: click.aliyun.com

3076ab5791cdc04f30f2ad175b25dd590dff81a5

对于果粉 们 来说,对新出的iPhone X 讨论最多的是其解锁 方式 , TouchID的继承者 ——FaceID 。对于新一代无边框造型手机而言,各大手机厂商不得不开发新的手机解锁方法 以保持其无边框造型 。一些苹果手机的竞争对手 们 继续使用 传统的 指纹识别传感器,只不过是 将其 放在其它不影响造型的位置上。而苹果 公司这一次 又走在 了 科技潮流的 前沿 ,对其进行了创新,发明了一种更加简便快捷的方法—— 用户 只需要看着 手机即可完成解锁过程 。由于先进的前摄深度相机 ,iP hone X 能够创建用户人脸的立体图像,此外,使用红外 捕捉用户面部的图像,这是为了使得系统对环境光线、颜色 等 变化更 具有鲁棒性 。之后,通过深度学习,智能手机能够很好地学习用户 的 面部细节,因此使得用户每次看手机的时候,手机都能够自动 识别身份 并 进行 解锁。有些人会对这种方法的准确率产生质疑,毕竟人的指纹是不会变的,而人脸的特征会随着是否留胡须、是否带眼镜、化妆等随之变化。 然而 令人惊讶的是,苹果公司宣传FaceID比TouchID方法更加安全 ,而且其错误率仅为 1:1,000,000 。

整个系统过程看着很简单,无非是获取用户人脸图像后,使用深度学习的方法对其进行人脸识别。我好奇的是整个过程是如何应用深度学习 方法和如何对每一步骤进行优化,以得到这么高的识别正确率。本文将告诉大家我是如何使用Kears实现一个类似于FaceID算法的。

726bcc1332e0ffb92d2afd5a12b1ffacf2d1fe7f

了解FaceID

神经网络给FaceID提供的能力不仅仅是执行简单的分类过程

aaea84353e01ee7b1c5316d65a8296f743ce22d8

第一步是仔细分析FaceID是如何在iPhone X上工作 的。他们的 白皮书 可以帮助我们了解FaceID 的工作机制。

使用TouchID 时,用户必须先登记自己的指纹,需要在指纹传感器上按压几次,经过大约十几种不同方位的采集 后 ,智能手机完成整个登记过程。同理,FaceID 也需要用户首先登记自己的人脸信息,这个过程更加简单,用户只需要看着手机,然后沿着圆圈慢慢转动头部即可,这样使得能够登记来自不同角度的人脸信息。这种极快的登记方法涵盖了很多底层的学习算法,下面将一一介绍。

e6e37836d9b59b9da6d4acb34cda58e6baa919b6

对于神经网络而言,执行分类过程意味着学习预测智能手机所看到的人脸是否为其登记的人脸。因此,应该使用一些训练数据来学习到辨别“真”或“假” 的能力。但从原理上来讲,这与许多深度学习案例不一样,传统的一些深度学习方法是使用大量训练数据集来训练模型,这将需要 花费 大量的时间、精力等。此外,对于苹果公司而言,先训练一个更复杂的离线“ 网络模型 ” ,训练好后将其迁移到手机上,这样的一种方法是不会被采用的。我相信 FaceI D 是基于类似于孪生卷积神经网络(Siamese CNN) 实现的,并且通过离线训练。将人脸映射成一个低维的潜在空间,使得不同人脸之间的距离最大化,使用对比损失(contrastive loss) 衡量模型的性能。

b20d2e8f8f1ac993a9c4f10508d08e7d03f695d7

从人脸到神经网络

孪生神经网络 基本上由两个相同的神经网络组成,它们之间共享所有的权重。这种体系结构可以学习计算特定数据类型之间的距离,比如图像。我的想法是通过孪生神经网络,将用户图像映射到一个低维的特征空间,类似于一个n 维数组,之后训练网络进行映射,以便尽可能地从不同类别中提取数据点,而来自同一类别的数据点尽可能地接近。归根到底,网络将学习从数据中提取最有意义的特征,并将其压缩成数组,之后创建有意义的映射。孪生神经网络能够做到这一点, 自动编码器 同样也能做到。

32e175dbc33fcb5663d6a4d103c808cc2356cf70

使用这种技术,人们可以使用大量的人脸来训练这样的网络 模型 以识别哪一个面孔与用户者最相似。就像苹果公司所做的那样,人们可以使用更难的图像数据 来增强网络对双胞胎、敌对攻击(掩码)等的鲁棒性,使其拥有正确的预测和计算能力。使用这种方法的一个最大优点是 获得了 一个即插即用模型 ,它可以识别不同的用户,只需要简单地将初始设置时拍摄的图像映射到潜在空间中,而不需要任何进一步的训练。此外,FaceID 能够适应你各方面的变化:突然变化(如眼镜、帽子、化妆等)和缓慢变化(胡须等)。这 些 是通过在映射特征空间中添加参考向量,根据新的外观计算出来的。

b8cfd8c850b97d1182151615460c54f5d632cb93

用Kears实现FaceID

对于所有的机器学习项目而言,首先需要的就是数据。创建自己的数据集需要花费很多时间和精力。因此,本文通过浏览网页获得一个RGB-D人脸数据集 。这些RGB-D 图像数据是由一系列面向不同方向以及不同面部表情的人脸组成,这和 iPhone X 使用的数据一样。

为了看到最终的实现 效果 ,你可以看看我 个人的GitHub主页 ,在里面可以发现有一个Jupyter Notebook 。此外,我使用 Colab Notebook 完成本文实验。

本文创建了一个基于SqueezeNet 的卷积神经网络模型,该网络模型将RGBD 人脸图像作为网络的输入,其输出是两个映射之间的距离。模型训练时使用的 对比损失 ,最终实现最大限度地减少属于同一个人的照片之间的距离,最大化不同人物照片之间的距离。

7e2d1bd0c81e9e1189d0c5952780dfad54b65dd5

经过一 些 训练 后 ,网络能够将人脸映射为128 维数组, 这将 导致同一个人的照片被 分到 一起,而 和其他人 的照片 尽可能的远 。这意味着为了解锁手机设备,网络模型只需要计算在解锁过程中所拍摄的图片与之前登记阶段储存图片之间的距离。如果距离低于某一阈值(该值越小越安全),设备才解锁。

我使用T-SNE算法 将128 维中的两维特征进行可视化,每种颜色都对应着一个不同的人。正如图中所示,网络模型已经学会对这些图片进行分组。此外,使用PCA降维算法 时,其得到的可视化图像也很有趣。

e144e170dca9c218bec43e8e05c52257464e7435

c1be9e4c0a69c5552d2bb422cb7016015fb538cb

实验

实验 模拟仿真整个FaceID 的流程:首先,对用户面部登记;然后,在解锁阶段,模型通过计算解锁时检测到的人脸与之前登记人脸之间的距离,并确定它是否在设定的阈值以下,最终判断是否应该解锁手机。

现在让我们从登记用户开始:从数据集中获取同一个人的一系列照片,并模拟登记 过程 。设备计算出这些图片的特征映射,并将其存储在本地内存中。

4e465bd54a5d7a318034079fce8921c8540f26e7

5022d3eea7021701082ff86ad6f46352a39247cd

现在看看如果是同一个用户试图解锁设备会发生什么情况 。 同一用户的不同姿势和面部表情 都会获得 一个较低的距离,大约平均为0.30 左右。

48f213dadef5499d642af2066eeb703cf9b8edfb

下面看看如果是不同用户尝试解锁设备会发生什么情况。不同用户的人脸图像计算得到的距离平均为1.10 。

124d6af305332a045c15c0d9a8b47c4dd3ac2974

因此,使用一个0.40 左右的阈值就应该足够防止陌生人解锁您的 手机 设备。

结论

本文主要是展示FaceID 解锁机器的基本工作机制,采用的方法是基于人脸映射和孪生卷积神经网络。本文的Python代码 可以在这里获得,希望本文对你有所帮助。

bcd9c6f30d3bb78ec362f9685145af0b385b7336

数十款阿里云产品限时折扣中,赶紧点击领劵开始云上实践吧!

作者信息

Norman Di palo,罗马大学学生,专注于人工智能、机器人。

个人主页:www.linkedin.com/in/norman-d…

本文由北邮@爱可可-爱生活老师推荐,阿里云云栖社区 组织翻译。

文章原标题《How I implemented iPhone X’s FaceID using Deep Learning in Python》,作者: Norman Di palo,译者:海棠,审阅:袁虎。

文章为简译,更为详细的内容,请查看原文