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

摘要: 本文主要是展示FaceID解锁机器的基本工作机制,采用的方法是基于人脸映射和孪生卷积神经网络,Github上附详细代码。



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

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


了解FaceID

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


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

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


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


从人脸到神经网络

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


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


用Kears实现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,译者:海棠,审阅:袁虎。

原文链接

干货好文,请关注扫描以下二维码:



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/522361.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工作流实战_11_flowable 流程实例 跟踪流程

项目地址https://gitee.com/lwj/flowable.git代码分支flowable-base视频讲解地址https://space.bilibili.com/485524575/channel/detail?cid94579 用户名密码0000001test0000002test0000003test0000004test文章目录1. 演示2. 代码分享1. 演示 2. 代码分享 public byte[] cre…

企业如何采用机器学习

摘要: 向机器学习专家学习如何理解机器学习开发生命周期,以及如何建立一个团队通过机器学习来解决他们的业务问题。毫无疑问,任何企业都可以利用机器学习的优势将机器学习应用到他们的业务过程中。而机器学习的意义将取决于它是如何被应用的&…

Spark精华问答 | spark的组件构成有哪些?

戳蓝字“CSDN云计算”关注我们哦!Spark是一个针对超大数据集合的低延迟的集群分布式计算系统,比MapReducer快40倍左右,是hadoop的升级版本,Hadoop作为第一代产品使用HDFS,第二代加入了Cache来保存中间计算结果&#xf…

binlog日志_mysql 重要日志文件总结

日志是所有应用的重要数据,MySQL 也有错误日志、查询日志、慢查询日志、事务日志等。本文简单总结下各种日志,以备查阅。二进制日志 binlog二进制日志 binlog 用于记录数据库执行的写入性操作(不包括查询)信息,以二进制的形式保存在磁盘中。使…

Python数据预处理:使用Dask和Numba并行化加速

摘要: 本文是针对Python设计一种并行处理数据的解决方案——使用Dask和Numba并行化加速运算速度。案例对比分析了几种不同方法的运算速度,非常直观,可供参考。如果你善于使用Pandas变换数据、创建特征以及清洗数据等,那么你就能够…

工作流实战_12_flowable 流程实例 终止流程

项目地址https://gitee.com/lwj/flowable.git代码分支flowable-base视频讲解地址https://space.bilibili.com/485524575/channel/detail?cid94579 用户名密码0000001test0000002test0000003test0000004test文章目录1. 演示2. 代码分享1. 演示 2. 代码分享 public ReturnVo&l…

让运维更高效:关于ECS系统事件

摘要: 阿里云会针对ECS实例发布系统事件,当您收到阿里云计划维护的通知时,可以利用ECS系统计划事件了解与实例相关的计划维护操作,并根据您的业务特性选择合适的时间安排运维操作进行故障转移,减少对系统可靠性和业务连…

工作流实战_13_flowable 待办任务列表查询

项目地址https://gitee.com/lwj/flowable.git代码分支flowable-base视频讲解地址https://space.bilibili.com/485524575/channel/detail?cid94579 用户名密码0000001test0000002test0000003test0000004test文章目录1. 演示2. 代码分享1. 演示 2. 代码分享 这里我使用的sql查…

openlayer xyz加载_webGIS实践:3_1_openlayer展绘点线面注记

上一篇已经讲了&#xff0c;怎么加载瓦片地图。这篇就看看怎么简单的渲染矢量点线面数据。最简单的&#xff0c;绘制点线面注记。效果长这样&#xff1a;新建一个文件FeatureOL.HTML。代码如下&#xff1a;<!DOCTYPE html> <html lang"en"> <head>…

反转了!“只问了1个框架,就给了35K的Python岗”

Python还有“敌人”吗&#xff1f;最近网络上一则帖子吸引了笔者&#xff0c;大意内容为&#xff1a;据说A是有2年多经验的Python工程师&#xff0c;面一个公司相关的岗位&#xff0c;由于人手紧缺&#xff0c;所以只问了一个框架&#xff0c;就按笔者提的35K办理了入职。&…

用深度学习解决Bongard问题

摘要&#xff1a; 本文介绍了深度学习和Bongard问题&#xff0c;以及如何用深度学习更好的解决Bongard问题。Bongard问题是苏联计算机科学家Mikhail Bongard提出的。从20世纪60年代&#xff0c;他致力于研究模式识别&#xff0c;并且设计了100个这样的谜题&#xff0c;使之成为…

使用Jenkins+Sonarqueb进行自动化测试和代码质量检测

摘要&#xff1a; Jenkins Jenkins是一款开源的持续集成工具&#xff0c;它的特点&#xff1a;易于安装、易于配置、可扩展&#xff08;自己开发插件&#xff09;&#xff0c;并且它拥有数以百计的成熟插件&#xff0c;这种插件式的特点提供可做任何事情的可能。 简介 Jenkins …

工作流实战_15_flowable 我发起的流程实例查询

项目地址https://gitee.com/lwj/flowable.git代码分支flowable-base视频讲解地址https://space.bilibili.com/485524575/channel/detail?cid94579 用户名密码0000001test0000002test0000003test0000004test文章目录1. 演示![在这里插入图片描述](https://img-blog.csdnimg.cn…

Istio 庖丁解牛六:多集群网格应用场景

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 钟华来源 | ServiceMesher随着容器技术的流行&#xff0c;大量互联网公司和传统 IT 企业都在尝试应用容器化和服务上云。容器化是一个持续的过程&#xff0c;伴随着多地域部署、安全等级隔离、多云和混合云等复杂的场景需求。…

NAT网关之SNAT进阶使用(一)SNAT POOL

摘要&#xff1a; NAT网关是云上VPC ECS访问Internet的出入口。SNAT可实现指定的VPC ECS使用指定的公网IP访问互联网。阿里云NAT网关控制台创建SNAT条目时&#xff0c;默认是为指定的交换机配置1个公网IP地址。 &#xff08;一&#xff09;前言 为什么使用SNAT POOL NAT网关是云…

工作流实战_16_flowable 办理任务

项目地址https://gitee.com/lwj/flowable.git代码分支flowable-base视频讲解地址https://space.bilibili.com/485524575/channel/detail?cid94579 用户名密码0000001test0000002test0000003test0000004test文章目录1. 演示2. 代码分享1. 演示 2. 代码分享 public ReturnVo&l…

OpenStack精华问答 | OpenStack的网络类型有哪些?

戳蓝字“CSDN云计算”关注我们哦&#xff01;关于OpenStack的探讨几乎从未间断&#xff0c;从2010年10月份一个版本正式发布至今&#xff0c;OpenStack在8年发展历程中&#xff0c;成为了最有争议的那一个。今天&#xff0c;我们就来看看有关于OpenStack的精华问答吧1Q&#xf…

秘籍分享:SLB实例克隆

摘要&#xff1a; 秘籍分享&#xff1a;SLB实例的备份与克隆 1. Greetings :) Hi&#xff0c;大家好&#xff0c;2018年春节刚过不久&#xff0c;想必大家一定觉得假期短暂&#xff0c;没有玩爽吧&#xff0c;但我们IT民工的命就是这么苦逼&#xff0c;想想也只能撸起袖子使劲干…

工作流实战_08_flowable 流程实例的启动

项目地址https://gitee.com/lwj/flowable.git代码分支flowable-base视频讲解地址https://space.bilibili.com/485524575/channel/detail?cid94579 用户名密码0000001test0000002test0000003test0000004test文章目录1. 演示1. 演示 ### 2. 代码 public ReturnVo<ProcessI…

SD-WAN新价值:中企通信与Fortinet强强联合 安全先行

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 刘丹当前&#xff0c;云计算、大数据、人工智能等数字技术方兴未艾&#xff0c;全球正快速进入数字经济时代&#xff0c;企业数字化转型的浪潮已经到来。与此同时&#xff0c;企业数字化转型也带动了一系列技术与应用&#x…