前言
新一年的第二天,我的手机微博突然要求重新登录(现在看来一股浓浓的套路的味道。。。)由于大学时的手机号早已弃用,我不得不更换微博注册手机号来验证。这时候突然跳出需要我的芝麻信用来担保,跳转支付宝APP后最终通过摄像头添加我的人脸数据来完成整个的验证过程(技术提供商是著名的旷视科技)。
继手机,邮箱,身份证和指纹后,我又向大佬们上缴了我的人脸ID,目的只是单纯的为了证明我是我自己(现在就只剩下虹膜ID和底裤的颜色他们不知道了吧)。
带着浓浓的不爽情绪,在这里我尝试利用3D打印破解下人脸识别中的“高富帅”——号称识别安全度超越普通人脸识别20倍以上的苹果face ID。
先来看看face ID的技术文档
在Apple Inc.的US 20170132456 Enhanced face detection using depth information 有提到他们使用的Face detection.
A method for face detection, comprising:
capturing a depth map, comprising an array of three-dimensional coordinates, and a two-dimensional image of a scene;
selecting one or more locations in the image to test for presence of human faces;
at each selected location, defining a respective face detection window having a size that is scaled according to an expected face size, in pixels of the image, at a depth of the selected location that is indicated by the depth map; and
processing a part of the image that is contained within each face detection window to determine whether the face detection window contains a human face.
再结合iPhone X的“刘海儿”结构图:
这货不就是微缩版的Kinect嘛!
iPhone X的Face ID采用了类似Kinect的结构光方案:数据采集由该机正面上方的景深感知摄像机(即“刘海儿”,TrueDepth Camera System)完成,其红外线发射器可以发射3万个侦测点,利用神经引擎(Neural Engine)将反射回来的数据与储存在A11芯片隔区内的数据进行对比,实现用户面部的3D读取与处理。(这里从侧面说明了A11芯片的强大处理性能,Kinect一般都需要至少2G的独立显卡加持才能正常运行)
说白了,Face ID的人脸识别会通过摄像头得到人脸的2D彩色图像
,同时还会利用红外线发射器收集到人脸的3D模型数据
,正是这一点的差距造就了Face ID的领先优势(通过图片和视频的破解方式都无法凑效)
策略
既然Face ID是采用结构光得到的3D数据来识别人脸,那我们就用同样采用结构光技术的Kinect三维扫描仪
预先扫描出对象的3D人脸数据,再通过三维建模软件将人脸数据建模成面具三维模型,同时导出色彩贴图
并2D打印,最后用3D打印技术将人脸面具模型
打印出来,将色彩贴图贴上去,用制作出的3D人脸“骗过”Face ID。
过程如下:
三维扫描
–>三维建模
–>3D打印
–>贴图
三维扫描
在这里先介绍下Kinect:
新技术的立项,很多时候是着眼于未来,但最初的出发点往往并没有我们想象中那么复杂。 2009 年微软选择推出 Kinect 的初衷其实很简单:通过 Kinect 体感操控设备提升 Xbox 的市场竞争力。
虽然现在Kinect已经停产,但是其t留下的技术财富是巨大的:
- 微软的 HoloLens AR 眼镜
- Windows Hello 面部识别系统
- leap motion 手势识别设备
- 50%的民用级手持式三维扫描仪的底层技术都来自于Kinect
- Face ID(在这里黑下苹果)
2013 年苹果公司以大约 3.6 亿美元的价格,收购了 PrimeSense 公司。而PrimeSense 正是此前为 Kinect 提供技术支持的主力公司。(又是苹果和微软的恩怨情仇。。。)
来看下我们这次要用到的三维扫描设备:
扫描对象:好友甲,开发大牛,粉丝无数。。。
连接笔记本(配置要求2G以上的独立显卡),对准头部旋转一周扫描,扫描过程大概10秒(如果只扫描脸部大约只需1-2秒)
输出为.asc
(点云)格式,其中包含上百万组点数据,每个点数据包含其空间坐标信息与色彩信息。
三维建模
将得到的.asc
点云数据导入Geomagic 建模软件,对点云数据进行封装
、去除噪音
、填充
等修复处理(这里为三维扫描常规后处理,处理过程因情况而异,不难,就是耗时,我就不详述了,懒),处理后结果为:
在显示
中取消顶点颜色
显示,将选择模式调整为选择贯通
,在侧视图中选中整张脸:
右击反转选区
,按Delete
删除非脸部部分,得到一张人脸面片:
在显示
中打开顶点颜色
显示,点击工具
–>纹理贴图
–>生成纹理贴图
,点击应用
。
纹理贴图
–>管理纹理贴图
将贴图保存
出来,并打印,用作最后的模型贴图。
如果你打算采用3DP彩色3D打印技术,这一步就不需要了,直接打印彩色三维模型即可
下面我们只需要将人脸面片拉出一个厚度即可完成人脸面具。
在多边形
工具栏中选择抽壳
工具,抽壳壁厚设置3mm(这里注意抽壳的箭头方向,如果反了就是 -3mm),点击应用
.
将模型另存为.stl
格式文件准备3D打印。
3D打印
3D打印可以采用多种技术方式:3DP
(石膏粉末打印)、SLA
(光明树脂打印)、FDM
(塑料材料打印)均可。
3DP
技术最方便,直接打印彩色三维模型,但是成本较高,这个模型打印要上千元。
SLA
白色(推荐),模型表面精度好,成本大概200-300元。
FDM
同样建议白色材料打印,其成本最低,十几块钱即可搞定,但是模型表面粗糙,后面贴图较麻烦,而且打印需要添加支撑,去除较麻烦。
贴图
这里要先介绍下图片人脸识别的原理:
一般来说图片人脸识别的算法都是基于特征点识别来完成的,如下图:
那么贴图就不需要将整张脸贴出来了,只需要将包含特征点的部分贴出即可。
贴图步骤如下:
- 将导出来的贴图文件打印出来
- 将眼眶、鼻子和嘴唇部分剪下
- 用喷壶将纸片背后喷湿,待纸张软化
- 将软化后的贴纸,用胶水贴在打印出来的模型上(这里注意要保持特征点严格的对齐)
最终效果大致如下:
最重要的验证
ok,至此所有的准备工作的都已完成,就差一个iPhone X来进行最后的验证了!!!
口干舌燥地说了这么大半天,有兴趣的老爷可以扫描文章最后的支付宝链接,赞助小弟一台iPhone X呗!!!
其实,一家叫做Bkav的安全公司已经通过类似的方式攻破了苹果的Face ID,并且发布了验证视频:
视频链接:http://www.bilibili.com/video/av16375904/
讲到这,你还觉得人脸识别安全吗?