利用3D打印破解face ID人脸识别

前言

新一年的第二天,我的手机微博突然要求重新登录(现在看来一股浓浓的套路的味道。。。)由于大学时的手机号早已弃用,我不得不更换微博注册手机号来验证。这时候突然跳出需要我的芝麻信用来担保,跳转支付宝APP后最终通过摄像头添加我的人脸数据来完成整个的验证过程(技术提供商是著名的旷视科技)。

继手机,邮箱,身份证和指纹后,我又向大佬们上缴了我的人脸ID,目的只是单纯的为了证明我是我自己(现在就只剩下虹膜ID和底裤的颜色他们不知道了吧)。

带着浓浓的不爽情绪,在这里我尝试利用3D打印破解下人脸识别中的“高富帅”——号称识别安全度超越普通人脸识别20倍以上的苹果face ID。

img


先来看看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的“刘海儿”结构图:

img

这货不就是微缩版的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:

img

新技术的立项,很多时候是着眼于未来,但最初的出发点往往并没有我们想象中那么复杂。 2009 年微软选择推出 Kinect 的初衷其实很简单:通过 Kinect 体感操控设备提升 Xbox 的市场竞争力。

虽然现在Kinect已经停产,但是其t留下的技术财富是巨大的:

  • 微软的 HoloLens AR 眼镜
  • Windows Hello 面部识别系统
  • leap motion 手势识别设备
  • 50%的民用级手持式三维扫描仪的底层技术都来自于Kinect
  • Face ID(在这里黑下苹果)

2013 年苹果公司以大约 3.6 亿美元的价格,收购了 PrimeSense 公司。而PrimeSense 正是此前为 Kinect 提供技术支持的主力公司。(又是苹果和微软的恩怨情仇。。。)

来看下我们这次要用到的三维扫描设备:

img

扫描对象:好友甲,开发大牛,粉丝无数。。。

连接笔记本(配置要求2G以上的独立显卡),对准头部旋转一周扫描,扫描过程大概10秒(如果只扫描脸部大约只需1-2秒)

输出为.asc(点云)格式,其中包含上百万组点数据,每个点数据包含其空间坐标信息与色彩信息。

三维建模

将得到的.asc点云数据导入Geomagic 建模软件,对点云数据进行封装去除噪音填充等修复处理(这里为三维扫描常规后处理,处理过程因情况而异,不难,就是耗时,我就不详述了,懒),处理后结果为:

img

显示中取消顶点颜色显示,将选择模式调整为选择贯通,在侧视图中选中整张脸:

img

右击反转选区,按Delete删除非脸部部分,得到一张人脸面片:

img

显示中打开顶点颜色显示,点击工具–>纹理贴图–>生成纹理贴图,点击应用

纹理贴图–>管理纹理贴图将贴图保存出来,并打印,用作最后的模型贴图。

如果你打算采用3DP彩色3D打印技术,这一步就不需要了,直接打印彩色三维模型即可

img

下面我们只需要将人脸面片拉出一个厚度即可完成人脸面具。

多边形工具栏中选择抽壳工具,抽壳壁厚设置3mm(这里注意抽壳的箭头方向,如果反了就是 -3mm),点击应用.

img

将模型另存为.stl格式文件准备3D打印。

3D打印

3D打印可以采用多种技术方式:3DP(石膏粉末打印)、SLA(光明树脂打印)、FDM(塑料材料打印)均可。

3DP技术最方便,直接打印彩色三维模型,但是成本较高,这个模型打印要上千元。

SLA白色(推荐),模型表面精度好,成本大概200-300元。

FDM同样建议白色材料打印,其成本最低,十几块钱即可搞定,但是模型表面粗糙,后面贴图较麻烦,而且打印需要添加支撑,去除较麻烦。

贴图

这里要先介绍下图片人脸识别的原理:

一般来说图片人脸识别的算法都是基于特征点识别来完成的,如下图:

img

那么贴图就不需要将整张脸贴出来了,只需要将包含特征点的部分贴出即可。

贴图步骤如下:

  • 将导出来的贴图文件打印出来
  • 将眼眶、鼻子和嘴唇部分剪下
  • 用喷壶将纸片背后喷湿,待纸张软化
  • 将软化后的贴纸,用胶水贴在打印出来的模型上(这里注意要保持特征点严格的对齐)

最终效果大致如下:

img

最重要的验证

ok,至此所有的准备工作的都已完成,就差一个iPhone X来进行最后的验证了!!!

口干舌燥地说了这么大半天,有兴趣的老爷可以扫描文章最后的支付宝链接,赞助小弟一台iPhone X呗!!!

img

其实,一家叫做Bkav的安全公司已经通过类似的方式攻破了苹果的Face ID,并且发布了验证视频:

视频链接:http://www.bilibili.com/video/av16375904/

img

讲到这,你还觉得人脸识别安全吗?

用钱砸我,不要停!