最近大家谈论最多的关于新款iphone x的功能之一就是新的解锁技术,即touchid的后续技术:faceid。
创建了无边框手机后,苹果不得不找出新方法简单快捷地解锁手机。虽然一些竞争对手继续使用放在不同位置的指纹传感器,但苹果决定对解锁手机的方式进行创新和变革:只需看一眼,faceid就能安全地解锁iphone x。借助一款先进(而且非常小巧)的前置深度相机,iphone x可以建立用户脸部的3d模型。此外,iphone x通过红外摄像头识别人脸,可以避免环境光和颜色对人脸识别的影响。通过深度学习,手机可以捕捉到用户脸部的很多细节,因此在用户拿着手机的时候,手机可以识别出它的主人。比较令人惊讶的是,苹果表示这种方法比touchid更安全,出错率为百万分之一。
我对苹果的faceid的实现技术非常感兴趣,特别是它完全运行在设备上,而且只需利用用户的面部进行一点点训练,就可以在每次拿起手机的时候顺利地进行识别。我研究了如何使用深度学习来实现此过程,以及如何优化每个步骤。在这篇文章中,我将展示如何使用keras实现一个类似faceid的算法。我会介绍采用的各种架构,并展示一些在kinect(一种非常流行的rgb-d相机,拥有与iphone x前置摄像头非常相似的输出,但设备本身更大)上的最终实验。倒杯咖啡,让我们开始逆向工程苹果的新技术。
对faceid的初步了解
“……赋予faceid力量的神经网络不是简单的分类。”
faceid注册的过程
第一步我们来仔细分析faceid在iphone x上的工作原理。我们可以通过苹果的白皮书理解faceid的基本机制。使用touchid的时候,用户必须多次按传感器来注册自己的指纹。大约需要15-20次不同的触摸,iphone才能完成注册,并准备好touchid。同样地,faceid也需要用户进行脸部注册。过程非常简单:用户只需像往常一样看着手机,然后慢慢地转动头部一圈,从不同的角度注册脸部。如此,注册过程就完成了,手机已经准备好解锁了。这个超快的注册过程可以告诉我们很多关于底层学习算法的信息。比如,faceid背后的神经网络并不是简单的分类。我会在后面进行详细的解释。
apple keynote推出iphone x和faceid
对于神经网络来说,分类的意思是学习如何预测看到的脸是不是用户的脸。所以,它需要一些训练数据来预测“是”或“否”,但与很多其他深度学习的应用场景不同,所以这种方式在这里并不适用。首先,神经网络需要使用从用户脸上捕捉到的数据重新进行训练。而这需要消耗大量的时间和电量,还需要大量的不同面孔作为训练数据以获得负面的样本,这也是不现实的。即使是试图迁移并微调已经训练好的神经网络,这些条件也几乎不会变化。而且,苹果也不可能在实验室等地方“线下”训练复杂的神经网络,然后再将训练好的神经网络搭载在手机中。相反,我认为faceid是由孪生卷积神经网络实现的(siamese-like convolutional neural network),该网络由苹果公司进行“线下”培训,将脸部映射到一个低维潜在空间(latent space),并通过对比损失函数(contrastive loss)最大化不同人脸之间的距离。通过本文,你可以了解keynote中提到的体系结构。我知道,很多读者对上述名词很陌生,但是没关系,我会逐步的进行详细的解释。
faceid看起来会是touchid之后的新标准。苹果是否会把它带到所有的新设备上?
从人脸到神经网络的数字
hadsell,chopra和lecun发表的论文“dimensionality reduction by learning an invariant mapping”。请注意此架构是如何学习数字之间的相似性,并自动将它们分组在二维中。类似的技术也可以应用于面部识别。
faceid可以适应外观的变化
接下来,让我们看看如何利用python和keras实现。
使用keras实现faceid
就像所有的机器学习项目一样,我们首先需要的是数据。创建自己的数据集需要花费大量时间和许多人的配合,这项工作本身可能非常具有挑战性。因此,我搜索了网络上rgb-d的人脸数据集,找到了一个非常合适的数据集(http://www.vap.aau.dk/rgb-d-face-database/)。这个数据集是根据人脸面向不同的方向以及不同的表情制作出的rgb-d图像集,正好类似于iphone x的情况。
最终的实现可以参考我的github代码库(https://github.com/normandipalo/faceid_beta),里面有个jupyter notebook。我还进一步尝试了使用colab notebook,你也可以试试看。
我创建了一个基于squeezenet架构的卷积网络。这个神经网络以两组rgbd的面部图像(即4通道图像)作为输入,并输出两组数据之间的距离。该网络用对比损失函数(constrastive loss)训练,可以最大程度地减少同一人的照片之间的距离,同时最大程度地提高不同人的照片之间的距离。
对比损失函数
使用t-sne创建嵌入空间中的人脸的簇,每种颜色代表不同的面孔(但颜色被重复使用)
使用pca创建嵌入空间中的人脸的簇,每种颜色都是不同的面孔(但颜色被重复使用)
实验!
现在我们可以试试个模型,模拟一个常见的faceid的流程:首先,注册用户的面部;然后在解锁阶段,需要验证两个方面——主人可以解锁,而其他人不可以。 如前所述,区别在于神经网络会计算解锁手机时和注册时的脸部的距离,然后判断是否在某个阈值以下。
下面我们来注册:我从数据集中采集了同一人的一系列照片,并模拟了注册阶段。现在该设备将计算每个姿势的嵌入,并保存在本地。
新用户注册阶段,模仿faceid的过程
在深度相机中观察到的注册阶段
嵌入空间中同一个用户的面部距离
嵌入空间中不同用户的面部距离
因此,我们可以将阈值设置为大约0.4,就可以阻止陌生人解锁设备了。
结论
在这篇文章中,我展示了如何利用面部嵌入和孪生卷积神经网络,实现faceid解锁机制的原型。希望对你能有所帮助。如果你有任何问题都可以和我联系。你可以从以下链接找到所有相关的python代码:
安防坐拥“富矿” 开始尝试融合多维数据
宁畅受邀参展ODCC 2020峰会 将践行“标准+定制=优秀TCO”理念
骁龙450最新消息:规格配置曝光 相当于低配骁龙625
光纤端口连接交换机需要注意的要求
选择电缆连接器组件时周围环境的注意事项
Apple Keynote推出iPhone X和FaceID
售电公司如何控制偏差考核?变电站运维云平台——安科瑞 严新亚
哪款二维码扫码模块适合嵌入智能快递柜?二维码扫描模组模块推荐
C/C++编译器的缺省字节对齐方式
三款常见的家用发动机型号盘点
一种可产生双卤化物SEI的新型电解质体系
2013年物联网企业赢利点:移动互联网、云计算、车联网、智慧城市
三星电子推出2024电视新品拉开人工智能屏幕时代的序幕
区块链数字宠物游戏“熊猫环球”8大优势引领区块链宠物游戏新高度
广汽埃安与华为合作生变!项目改为自主开发,车企欲掌握核心技术话语权?
大彩串口屏新品发布:爆款7寸HMI外壳串口屏开窗尺寸192*138
工业互联网的现实应用场景及其关键典型技术
如何运用正确方法管理攻击面
后补贴时代,磷酸铁锂电池强势回归
什么是数据结构