毕设竟然抽到了模拟iPhone X的解锁技术!还好我有点Python功底!

最近大家谈论最多的关于新款iPhone X的功能之一就是新的解锁技术,即TouchID的后续技术:FaceID。

毕设竟然抽到了模拟iPhone X的解锁技术!还好我有点Python功底!

进群:548377875   即可获取数十套PDF哦! 源码在文章末尾!

创建了无边框手机后,苹果不得不找出新方法简单快捷地解锁手机。虽然一些竞争对手继续使用放在不同位置的指纹传感器,但苹果决定对解锁手机的方式进行创新和变革:只需看一眼,FaceID就能安全地解锁iPhone X。借助一款先进(而且非常小巧)的前置深度相机,iPhone X可以建立用户脸部的3D模型。此外,iPhone X通过红外摄像头识别人脸,可以避免环境光和颜色对人脸识别的影响。通过深度学习,手机可以捕捉到用户脸部的很多细节,因此在用户拿着手机的时候,手机可以识别出它的主人。比较令人惊讶的是,苹果表示这种方法比TouchID更安全,出错率为百万分之一。

我对苹果的FaceID的实现技术非常感兴趣,特别是它完全运行在设备上,而且只需利用用户的面部进行一点点训练,就可以在每次拿起手机的时候顺利地进行识别。我研究了如何使用深度学习来实现此过程,以及如何优化每个步骤。在这文章中,我将展示如何使用Keras实现一个类似FaceID的算法。我会介绍采用的各种架构,并展示一些在Kinect(一种非常流行的RGB-D相机,拥有与iPhone X前置摄像头非常相似的输出,但设备本身更大)上的最终实验。倒杯咖啡,让我们开始逆向工程苹果的新技术。

对FaceID的初步了解

“……赋予FaceID力量的神经网络不是简单的分类。”

毕设竟然抽到了模拟iPhone X的解锁技术!还好我有点Python功底!

FaceID注册的过程

第一步我们来仔细分析FaceID在iPhone X上的工作原理。我们可以通过苹果的白皮书理解FaceID的基本机制。使用TouchID的时候,用户必须多次按传感器来注册自己的指纹。大约需要15-20次不同的触摸,iPhone才能完成注册,并准备好TouchID。同样地,FaceID也需要用户进行脸部注册。过程非常简单:用户只需像往常一样看着手机,然后慢慢地转动头部一圈,从不同的角度注册脸部。如此,注册过程就完成了,手机已经准备好解锁了。这个超快的注册过程可以告诉我们很多关于底层学习算法的信息。比如,FaceID背后的神经网络并不是简单的分类。我会在后面进行详细的解释。

毕设竟然抽到了模拟iPhone X的解锁技术!还好我有点Python功底!

Apple Keynote推出iPhone X和FaceID

对于神经网络来说,分类的意思是学习如何预测看到的脸是不是用户的脸。所以,它需要一些训练数据来预测“是”或“否”,但与很多其他深度学习的应用场景不同,所以这种方式在这里并不适用。首先,神经网络需要使用从用户脸上捕捉到的数据重新进行训练。而这需要消耗大量的时间和电量,还需要大量的不同面孔作为训练数据以获得负面的样本,这也是不现实的。即使是试图迁移并微调已经训练好的神经网络,这些条件也几乎不会变化。而且,苹果也不可能在实验室等地方“线下”训练复杂的神经网络,然后再将训练好的神经网络搭载在手机中。相反,我认为FaceID是由孪生卷积神经网络实现的(siamese-like convolutional neural network),该网络由苹果公司进行“线下”培训,将脸部映射到一个低维潜在空间(latent space),并通过对比损失函数(contrastive loss)最大化不同人脸间的距离。通过本文,你可以了解Keynote中提到的体系结构。我知道,很多读者对上述名词很陌生,但是没关系,我会逐步的进行详细的解释。

毕设竟然抽到了模拟iPhone X的解锁技术!还好我有点Python功底!

FaceID看起来会是TouchID之后的新标准。苹果是否会把它带到所有的新设备上?

人脸到神经网络的数字

孪生神经网络基本上由两个完全相同的神经网络组成,它们所有的权重也都相同。这种结构可以计算特定类型的数据(如图像)之间的距离。基本思路是,将两组数据传递给孪生网络(或简单地将两组数据分两次传递给同一个神经网络),而这个网络会将数据映射到一个低维特征空间(就像一个n维数组),然后训练神经网络将不同类别下的数据点映射到尽可能远的地方,同时保证同一类的数据点又尽可能接近。从长远来看,这个网络将学习如何从数据中提取最有意义的特征,并将其压缩成一个数组,从而创建一个有意义的映射。为了对此有一个直观的理解,想象一下你如何使用小型矢量来描述狗狗的品种,并保证类似的狗狗具有最接近的矢量值。你可能会用一个数字来表示狗狗的毛色,另一个用来表示狗狗的大小,还有一个用于记录毛的长度,等等。通过这种方法,彼此相似的狗狗就可以拥有相似的矢量值。这个方法是不是很聪明?那么,孪生神经网络也可以做到这一点,类似于一个自动编码器。

毕设竟然抽到了模拟iPhone X的解锁技术!还好我有点Python功底!

Hadsell,Chopra和LeCun发表的论文“Dimensionality Reduction by Learning an Invariant Mapping”。请注意此架构是如何学习数字之间的相似性,并自动将它们分组在二维中。类似的技术也可以应用于面部识别。

通过这种技术,只需使用大量面部数据来训练一个这种网络,就可以识别哪些面部最相似。如果拥有足够的预算和计算能力(就像苹果一样),我们甚至可以使用越来越难的例子(比如双胞胎)来强化这个神经网络,以便应对面具等恶意攻击。那么使用这种方法有什么优势呢?那就是我们终于有了现成的模型,只需要简单计算出用户的面部数据在潜在映射(latent map)中的位置,就可以识别出不同的用户,而无需额外训练。(就像前面说过的,我们记录下新的狗狗品种的矢量值,然后保存起来。)此外,FaceID还可以适应脸部的变化,包括突发性变化(比如眼镜、帽子、化妆等)以及缓慢变化(毛发等)。这基本上是通过向映射中增加参考矢量,并根据新外观进行计算而实现的。

毕设竟然抽到了模拟iPhone X的解锁技术!还好我有点Python功底!

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)训练,可以最大程度地减少同一人的照片之间的距离,同时最大程度地提高不同人的照片之间的距离。

毕设竟然抽到了模拟iPhone X的解锁技术!还好我有点Python功底!

对比损失函数

经过一段时间的训练后,这个神经网络可以将人脸映射到128维数组中,并将同一个人的照片分在一组,与其他人的照片分离。这意味着,该神经网络只需计算解锁过程中拍摄的照片与注册阶段存储的照片之间的距离,就可以实现解锁设备。如果距离低于某个阈值,则设备解锁(阈值越小,设备越安全)。

我使用t-SNE算法在二维空间中显示了128维的嵌入空间。每种颜色都对应不同的人,可以看出,网络已经学会了将这些图片分组并紧密排列。当使用t-SNE算法时,簇之间的距离没有意义。使用PCA降维算法时也会看到一个有趣的图。

毕设竟然抽到了模拟iPhone X的解锁技术!还好我有点Python功底!

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

毕设竟然抽到了模拟iPhone X的解锁技术!还好我有点Python功底!

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

实验!

现在我们可以试试个模型,模拟一个常见的FaceID的流程:首先,注册用户的面部;然后在解锁阶段,需要验证两个方面——主人可以解锁,而其他人不可以。 如前所述,区别在于神经网络会计算解锁手机时和注册时的脸部的距离,然后判断是否在某个阈值以下。

下面我们来注册:我从数据集中采集了同一人的一系列照片,并模拟了注册阶段。现在该设备将计算每个姿势的嵌入,并保存在本地。

毕设竟然抽到了模拟iPhone X的解锁技术!还好我有点Python功底!

新用户注册阶段,模仿FaceID的过程

在深度相机中观察到的注册阶段

毕设竟然抽到了模拟iPhone X的解锁技术!还好我有点Python功底!

嵌入空间中同一个用户的面部距离

毕设竟然抽到了模拟iPhone X的解锁技术!还好我有点Python功底!

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

因此,我们可以将阈值设置为大约0.4,就可以阻止陌生人解锁设备了。

结论

在这文章中,我展示了如何利用面部嵌入和孪生卷积神经网络,实现FaceID解锁机制的原型。希望对你能有所帮助。如果你有任何问题都可以和我联系。你可以从以下链接找到所有相关的Python代码

https://github.com/normandipalo/faceID_beta

此篇乃是参考!毕设等我完成了在给大家分享

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


我最近重新拾起了计算机视觉,借助Python的opencv还有face_recognition库写了个简单的图像识别demo,额外定制了一些内容,原本想打包成exe然后发给朋友,不过在这当中遇到了许多小问题,都解决了,记录一下踩过的坑。 1、Pyinstaller打包过程当中出现warning,跟d
说到Pooling,相信学习过CNN的朋友们都不会感到陌生。Pooling在中文当中的意思是“池化”,在神经网络当中非常常见,通常用的比较多的一种是Max Pooling,具体操作如下图: 结合图像理解,相信你也会大概明白其中的本意。不过Pooling并不是只可以选取2x2的窗口大小,即便是3x3,
记得大一学Python的时候,有一个题目是判断一个数是否是复数。当时觉得比较复杂不好写,就琢磨了一个偷懒的好办法,用异常处理的手段便可以大大程度帮助你简短代码(偷懒)。以下是判断整数和复数的两段小代码: 相信看到这里,你也有所顿悟,能拓展出更多有意思的方法~
文章目录 3 直方图Histogramplot1. 基本直方图的绘制 Basic histogram2. 数据分布与密度信息显示 Control rug and density on seaborn histogram3. 带箱形图的直方图 Histogram with a boxplot on t
文章目录 5 小提琴图Violinplot1. 基础小提琴图绘制 Basic violinplot2. 小提琴图样式自定义 Custom seaborn violinplot3. 小提琴图颜色自定义 Control color of seaborn violinplot4. 分组小提琴图 Group
文章目录 4 核密度图Densityplot1. 基础核密度图绘制 Basic density plot2. 核密度图的区间控制 Control bandwidth of density plot3. 多个变量的核密度图绘制 Density plot of several variables4. 边
首先 import tensorflow as tf tf.argmax(tenso,n)函数会返回tensor中参数指定的维度中的最大值的索引或者向量。当tensor为矩阵返回向量,tensor为向量返回索引号。其中n表示具体参数的维度。 以实际例子为说明: import tensorflow a
seaborn学习笔记章节 seaborn是一个基于matplotlib的Python数据可视化库。seaborn是matplotlib的高级封装,可以绘制有吸引力且信息丰富的统计图形。相对于matplotlib,seaborn语法更简洁,两者关系类似于numpy和pandas之间的关系,seabo
Python ConfigParser教程显示了如何使用ConfigParser在Python中使用配置文件。 文章目录 1 介绍1.1 Python ConfigParser读取文件1.2 Python ConfigParser中的节1.3 Python ConfigParser从字符串中读取数据
1. 处理Excel 电子表格笔记(第12章)(代码下载) 本文主要介绍openpyxl 的2.5.12版处理excel电子表格,原书是2.1.4 版,OpenPyXL 团队会经常发布新版本。不过不用担心,新版本应该在相当长的时间内向后兼容。如果你有新版本,想看看它提供了什么新功能,可以查看Open
1. 发送电子邮件和短信笔记(第16章)(代码下载) 1.1 发送电子邮件 简单邮件传输协议(SMTP)是用于发送电子邮件的协议。SMTP 规定电子邮件应该如何格式化、加密、在邮件服务器之间传递,以及在你点击发送后,计算机要处理的所有其他细节。。但是,你并不需要知道这些技术细节,因为Python 的
文章目录 12 绘图实例(4) Drawing example(4)1. Scatterplot with varying point sizes and hues(relplot)2. Scatterplot with categorical variables(swarmplot)3. Scat
文章目录 10 绘图实例(2) Drawing example(2)1. Grouped violinplots with split violins(violinplot)2. Annotated heatmaps(heatmap)3. Hexbin plot with marginal dist
文章目录 9 绘图实例(1) Drawing example(1)1. Anscombe’s quartet(lmplot)2. Color palette choices(barplot)3. Different cubehelix palettes(kdeplot)4. Distribution
Python装饰器教程展示了如何在Python中使用装饰器基本功能。 文章目录 1 使用教程1.1 Python装饰器简单示例1.2 带@符号的Python装饰器1.3 用参数修饰函数1.4 Python装饰器修改数据1.5 Python多层装饰器1.6 Python装饰器计时示例 2 参考 1 使
1. 用GUI 自动化控制键盘和鼠标第18章 (代码下载) pyautogui模块可以向Windows、OS X 和Linux 发送虚拟按键和鼠标点击。根据使用的操作系统,在安装pyautogui之前,可能需要安装一些其他模块。 Windows: 不需要安装其他模块。OS X: sudo pip3
文章目录 生成文件目录结构多图合并找出文件夹中相似图像 生成文件目录结构 生成文件夹或文件的目录结构,并保存结果。可选是否滤除目录,特定文件以及可以设定最大查找文件结构深度。效果如下: root:[z:/] |--a.py |--image | |--cat1.jpg | |--cat2.jpg |
文章目录 VENN DIAGRAM(维恩图)1. 具有2个分组的基本的维恩图 Venn diagram with 2 groups2. 具有3个组的基本维恩图 Venn diagram with 3 groups3. 自定义维恩图 Custom Venn diagram4. 精致的维恩图 Elabo
mxnet60分钟入门Gluon教程代码下载,适合做过深度学习的人使用。入门教程地址: https://beta.mxnet.io/guide/getting-started/crash-course/index.html mxnet安装方法:pip install mxnet 1 在mxnet中使
文章目录 1 安装2 快速入门2.1 基本用法2.2 输出图像格式2.3 图像style设置2.4 属性2.5 子图和聚类 3 实例4 如何进一步使用python graphviz Graphviz是一款能够自动排版的流程图绘图软件。python graphviz则是graphviz的python实