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

AiTechYun

编辑:yuxiangyu

新款iPhone X最热门功能之一就是新的解锁方法:FaceID。由于创建了无边框手机,苹果不得不开发一种能简单快捷的解锁手机的新方法。不同于一些竞争对手继续使用放在不同位置的指纹传感器,苹果决定革新我们解锁手机的方式,让我们看一下手机就能解锁。

借助一款先进的前置深度相机(facing depth-camera),iPhone X能够创建用户脸部的3维映射。此外,使用红外相机拍摄用户脸部的图片,该图片对于环境的光线和颜色的变化更具鲁棒性。运用深度学习,智能手机能够非常详细地学习用户的脸,因此每当手机被其拥有者拿起时,它都会立刻认出他。更令人惊讶的是据苹果表示,这种方法比TouchID更安全,错误率仅为百万分之一。

我对苹果实现FaceID的技术很感兴趣,希望了解如何使用深度学习来实现这个过程,以及如何优化每个步骤。在这篇文章中,我将展示如何使用Keras实现一个类似FaceID的算法。我将解释我采取的各种架构决策,并使用Kinect展示一些最终实验结果,它一种非常流行的RGB深度相机,它与iPhone X前置摄像头的输出非常相似(但设备更大)。那么,让我们开始对苹果的革新进行逆向工程。

了解FaceID

“…… 支持FaceID的神经网络不是简单地执行分类。”

FaceID设置过程

第一步是仔细分析FaceID在iPhone X上的工作原理。他们的白皮书可以帮助我们理解FaceID的基本机制。过去,在使用TouchID时,用户必须通过按几次传感器,初始登记其指纹。在大约15-20次不同的触摸之后,注册完成,TouchID可以开始使用了。同样地,FaceID的用户也要注册他的脸。过程非常简单:只是像往常一样看手机,然后慢慢地转动头部,这样就可以从不同的姿势来记录面部。就这样,这个过程完成,手机就可以解锁了。这种快速的注册过程可以告诉我们很多关于这种学习算法的潜在信息。比如,支持FaceID 的神经网络不仅仅是执行分类。

苹果推出iPhone X和FaceID

针对神经网络进行分类,意味着学习如何预测它看到的脸是否是用户的。所以,它应该主要使用一些训练数据来预测“真”或“假”,但与许多其他深度学习用例情况不同,这种方法实际上是行不通的。首先,网络要使用从用户脸上获得的新数据进行再训练。这需要大量时间,能量消耗和不实用的训练数据为不同的脸去做否定实例(在迁移学习和已经训练好的网络上微调的情况下会有所改变)。

此外,这种方法无法使用的一个原因是:苹果要训练更复杂的离线网络。也就是说,要在他们的实验室中训练,然后发送预训练好的网络给用户的手机。所以,我相信FaceID是由类似孪生卷积神经网络(siamese convolutional neural network)驱动的,该网络由苹果公司“离线”训练,将脸部映射到低维隐空间中,利用对比损失(contrastive loss)最大化不同人脸之间的距离。会发生什么是你得到一个能够“one shot learning”(少样本精准分类的一种)的架构。

从数字识别到人脸识别的神经网络

孪生神经网络一般由两个相同的神经网络组成,共享所有的权重。该架构可以学习计算特定类型的数据之间的距离。原理是,你通过孪生网络传递数据(或者简单地通过同一网络在两个不同的步中传递数据),网络将它映射到一个低维特征空间,就像一个n维数组,然后你训练网络进行映射,使不同类别的数据点尽可能地远,同一类别的数据点尽可能接近。网络将学习从数据中提取最有意义的特征,并将其压缩成一个数组,从而创建一个有意义的映射。为了对此有一个直观的理解,我们想象一下使用较少维度的矢量来描述狗的品种,使类似的狗具有更接近的矢量。你可能会用一个数字来编码狗的毛色,另一个用来表示狗的大小,再一个用于毛的长度,等等。这样,相似的狗将具有相似的向量。孪生神经网络可以学习为你做这件事,类似于一个自动编码器。

图片来自Hadsell,Chopra和LeCun发表的论文“通过学习不变映射降维”。注意这个架构是学习数字之间的相似性,并自动将它们分组为二维。技术上与脸部识别类似。

使用这种技术,人们可以使用大量面孔来训练这种架构,以识别哪些脸最为相似。如果拥有不错的预算和计算能力(像苹果那样),也可以使用更难的例子,使网络对诸如双胞胎,对抗攻击(面具)等更具鲁棒性。使用这种方法的优势是什么?你有了一个随时可用的模型,可在无需进一步训练的情况下识别不同的用户,它只需要在初始设置期间拍摄一些照片后,计算用户的脸部位于脸部映射空间中的哪个位置即可。。另外,FaceID能够适应你的方面的变化:突兀的变化(例如,眼镜,帽子,化妆)和细节变化(面部毛发)。这需要通过在此映射中添加参考脸的向量来完成的,它根据你的新外观计算而来。

当你的外表改变时,FaceID会适应

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

在Keras中实现FaceID

我们首先需要的是数据。我在网上找到了RGB-D人脸数据集。它由一系列面向不同方向,做出不同表情的RGB-D图片组成(与FaceID所需吻合)。

实现:https://github.com/normandipalo/faceID_beta

Colab Notebook:https://colab.research.google.com/drive/1OynWNoWF6POTcRGFG4V7KW_EGIkUmLYI

我创建了一个基于SqueezeNet架构的卷积网络。网络输入耦合人脸的RGBD图像,因此是4通道,并输出两个嵌入之间的距离。该网络训练时会产生对比损失,可以最大限度地减少同一人的照片之间的距离,并使不同人的照片之间的距离最大化。

对比损失

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

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

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

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

实验

现在我们可以试着看看这个模型的运作,它模拟一个FaceID的流程:首先,注册用户的脸。然后,解锁阶段,从用户(应该成功),从其他人那里,不应该解锁设备。前面提到,区别在于网络在解锁手机和已注册的人脸之间进行计算的距离,以及是否处于某个阈值之下。

让我们从注册开始:我从数据集中采集了同一个人的一系列照片,并模拟了注册阶段。该设备开始计算每个姿态的嵌入,并将它们存储在本地。

受FaceID新用户注册过程的启发

深度相机所看到的注册阶段

现在让我们看看如果同一用户试图解锁设备会发生什么。同一用户的不同姿势和面部表情实现了较低的距离,约为0.30多点。

同一用户嵌入空间中的距离。

另一方面,来自不同人的RGBD图片的平均距离为1.1。

不同用户嵌入空间中的距离

因此,使用约0.4的阈值应足以防止陌生人解锁你的设备。

相关代码:https://github.com/normandipalo/faceID_beta

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180318A0EQPI00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券