超硬核科普:让你一文看懂
人脸识别技术流程
小编是个天生懒惰的人,同时又是个急性子,这样的人最享受被科技服务的乐趣。
举个例子,十多年前大家还在普遍用现金的时代,小编在商店买东西排队结账,每当看到收银员找零时手忙脚乱的样子就会心急如焚,只恨不能拿了东西直接走人。那时候年幼的小编就攥紧拳头梦想着以后一定要发明一种不用找零钱的方法。
后来这个在心底萌芽多年的梦想被别人实现了,失望之余小编也乐享其成。用手机扫扫码就能付钱可比现金方便快捷多了。可天知道小编“懒癌+急癌”晚期,久而久之竟觉得抬手扫码、输入密码这样的动作也很麻烦。所以后来出现的指纹支付算是拯救了小编。
再后来,连手指都不用动了,因为出现了“刷脸支付”,配合手上iPhone的卓越体验,不得不说小编爱死了这个功能。
嗯,刷脸支付将小编从付钱时漫长等待的焦躁和不安中解救了出来,所以在IT之家编辑部的科技氛围里淫浸多年后,小编觉得有必要为大家讲一讲“刷脸”到底是个什么东西,也可算是知恩图报了!
“刷脸”,顾名思义,背后是一项关键技术:人脸识别。
别看这两年因为在智能手机上的使用而大热,其实人脸识别技术最早的研究还要追溯到20世纪50年代,当时已经有科学家在研究人脸轮廓的提取方法,但受限于技术水平,这项技术的相关研究一度停滞,直到20世纪80年代,人脸识别的方法才有了新的突破,神经生理学、脑神经学、视觉等相关知识被引入,人脸识别进入了新的发展阶段。
所以,当前阶段的人脸识别不是单一的技术,而是融合了神经生理学、脑神经学、计算机视觉等多方面学科的技术。不过,本质上它还是一项计算机视觉技术。
当然,IT之家做这篇文章的重点不在于回顾人脸识别的历史,而是和大家讲讲人脸识别背后的一些基本原理。
我们每天用人脸识别技术解锁手机、结账付款,是那么的自然,但相信很少有同学深入思考这项技术背后是怎样一个流程。
前面我们说,计算机视觉是人脸识别关系最紧密的技术。所以我们从这一点入手。
计算机视觉,通俗来说就是利用摄像头等设备代替人眼,来获取图像,利用计算机对图像信息进行处理,综合人类的认知模式来建立人类视觉的计算理论。
这其中,最难的无疑是如何处理图像信息、如何模拟人类的认知模式。
为了解决这些问题,计算机视觉还引入了图像处理、模式识别、图像理解、图像生成等学科的知识。
图像处理就是把原始图像转换成计算机更容易识别的图像;模式识别,就是计算机判断自己要识别的是什么和怎么识别的过程;图像理解,就是对图像中描述的景物进行分析;图像生成,举例来说就是当图像的部分信息缺失时,能够将缺失的信息补上……
这些都是计算机视觉需要借助的学科技术。这里面我们要着重讲的是模式识别,它是一个独立的理论体系,具体到计算机视觉领域的应用,它表示将计算机表示出来的图像和一致的类别进行匹配的过程。
有点懂是吧。IT之家为大家通俗解释一下,所谓“识别”,就是先认识,然后辨别。认识什么?认识的是图像和从图像中总结的目标物体的特征。怎么辨别?就是将总结出来的特征和自己已经掌握的特征库进行比对,然后才能实现辨别。
我们人类识别一样物体也是遵循这个逻辑,先总结特征,然后比对。至于前面的“模式”,就有点抽象了,你可以理解为一种规律,它影响着特征和类型比对的结果。
没错,人脸识别本质上也是这个过程。
所以,我们沿着模式识别的思路,来看看它的整体过程:分别为预处理、特征提取和分类等。我们画出如下流程图:
预处理是第一步,但是这部分工作可能很多很杂,例如减少图像中的噪声干扰、提高清晰度、还有包括图像滤波、变换、转码、模数转化等。
特征提取,就是在预处理后的图像中,提取对识别有明显作用的特征,并在这个过程中降低模式特征的维数,令其便于处理。这是一个复杂的过程,后面我们讲到具体方法时候会有体现;
分类,就是对提取到的特征值按照一定的准则进行分类,便于决策。
举个例子,计算机要识别出这张照片中的男人,当它拿到照片时,可能觉得画面太暗,先提个亮度,然后又发现噪点太多,再做个降噪……一顿操作后感觉可以了,再将照片转化为数字信息,这个过程是预处理。
提取出来的特征值会进入单独的特征空间,因为这样可以更好地识别和做分类。接下来,就要对特征空间里的数据进行分类了,让它们眼睛归眼睛,鼻子归鼻子,头发归头发……基于这些分类好的数据,计算机才可以进行识别判断和决策。
当然,为了方便大家理解这个逻辑过程,IT之家在这里只是举例粗略地说明,可能不准确,实际的步骤也是相当复杂的,还要考虑各种干扰的因素,例如图像的质量不清晰、背景复杂、图像光照分布不均匀、目标姿势角度出现扭曲或者佩戴了头饰、眼镜以及张了胡须、化了妆等等各种情况。
还有要说明的一点是,这个模式识别的系统是需要一个自我训练、学习的过程的,其中最重要的是对前面分类错误率的训练(分类器训练),因为在前面的分类中,我们无法保证分类的结果是100%正确的,但必须控制在一定的错误率之类,这必须通过大量的训练样本来不断修正,令错误率符合要求。
好了,基于以上对计算机视觉模式识别的讨论,我们就可以给出人脸识别系统的主要功能模块了:
可能有小伙伴觉得上面这个举出功能模块太简单了,所以我们再精确一些,给出下面的逻辑架构图,相信不难理解:
人脸识别的主流方法
在上面一部分,我们主要介绍了人脸识别的基本逻辑流程,其实人脸识别的基本思想是比较类似的,都是要将图像中的特征提取出来,转换到一个合适的子空间里,然后在这个子空间里衡量类似性或分类学习。但问题在于,对客观世界采用怎样协调统一且有成效的表示法?我们要找到怎样合适的子空间,怎样去分类,才能区分不同类,聚集相似的类别?为解决这些问题,衍生出了很多种方法和解决方案。
所以说,我们所说的人脸识别技术是笼统的,事实上,这是一个很多技术和方法的集合。
我们不妨依据上面的逻辑结构图来逐步说明。
1、预处理
人脸图像的预处理,这一步没有太多可说的,主要包括消除噪声、灰度归一化、几何校正等,这些操作一般有现成的算法可以实现,属于比较基本的操作。不过要说明的是,这里主要说的是静态人脸图像的预处理,如果是动态人脸图像的预处理,就比较复杂了,一般是要先将动态人脸图像分割成一组静态人脸图像,然后对人脸进行边缘检测和定位,在做一系列的处理,这里就不展开了。
2、特征提取
图像特征的提取是比较关键的一步(上文所说的模式空间向特征空间的跨越),但对于图像处理来说也是比较初级的一步。目前关于图像特征提取的方法有很多,但其实我们想一想,通常而言图像的特征还是可以归类的,例如颜色特征、纹理特征、空间关系特征、形状特征等,每一种特征都有匹配的方法,其中有一些比较经典、好用的方法,例如HOG特征法,LBP特征法,Haar特征法等,小编当然不可能一一讲解,所以这里选取其中一种——HOG特征法。
HOG特征也叫方向梯度直方图,它是由Navneet Dalal和Bill Triggs在2005年的一篇博士论文中提出的。我们简单来看它是怎么进行的。
我们以这张照片为例,第一步是要将它变成黑白的照片,因为色彩信息在这里对识别并没有帮助。
在这张黑白照片中,我们从单个像素看起,观察它周围的像素,看它是往哪个方向逐渐变暗的,然后用箭头表示这个像素变暗的方向。
如果对每个像素执行这样的操作,这样所有像素都会被这样的箭头取代,它们表示了像素明暗变化的方向。每一个这样的箭头表示明暗梯度。
事实上,对于每一个像素,给定坐标系,我们能够求出它的梯度方向值。计算的方法比较复杂,我们不需要了解,只需要知道这一步是为了捕获目标的轮廓信息,同时进一步弱化光照的干扰。
如果是以这样的方式做提取的话,计算量会很大。所以我们会把图像分割成8x8像素的小方块,叫做一个Cell,然后对每个Cell计算梯度信息,包括梯度的大小和方向。得到的是这个Cell的9维特征向量。
相信到这里大家有些不懂了。IT之家再为小伙伴们稍微解释一下,其实这一步的目的是为每个Cell构建梯度方向直方图,直方图就是我们大家熟知的条形统计图,这个直方图中,X轴是将方向划分的区间,Navneet Dalal等人研究表示划分9个区间效果是最好的,如果是180°的方向,每个区间就代表20°。y轴表示某个方向区间内的梯度大小。这样就等于是每个Cell的特征描述符。
▲大致就是这个意思
这里还有一步,就是如果你的图像受到光照的影响比较大,那么还可以将一定的Cell组成一个block,例如2x2个Cell,这样每个block上就是36维的特征向量,然后对这36维特征向量做规范化(具体怎样规范,涉及到高等数学的知识,大家也不需要知道)。
如果我们输入的图像大小是256x512像素,那么就有32x64=2048个Cell,有31x63=1953个block,每个block有36维向量,那么这个图像就有1953x36=70308维向量。这70308维向量就是这个图像的HOG特征向量了。
当然,上面这些步骤你也可都不了解,你只需要知道,最后原始的图像被表示成了HOG的形式,如下图:
硬核科普:一文看懂人脸识别技术流程
然后根据这个HOG形式,在我们的库中找到与已知的一些HOG样式中,看起来最相似的部分。
3、图像识别
人脸识别技术经过科学家多年的研究和发展,已经形成了多种研究方向和更多种的研究方法,如果我们梳理一下,主要包括基于几何特征的方法、基于模板的方法、基于模型的方法以及其他方法。
基于几何特征的方法是比较早期、传统的方法了,它主要是研究人脸眼睛、鼻子等器官的形状和结构关系的几何描述,以此作为人脸识别的重要特征。
基于模板的方法基本思想是拿已有的模板和图像中同样大小的区域去比对,包括基于相关匹配的方法、特征脸方法、线性判别分析方法、神经网络方法等。
基于模型的方法的方向是对人脸的显著特征进行特征点定位,然后进行人脸的编码,再利用相应的模型进行处理实现人脸识别,例如隐马尔柯夫模型,主动形状模型和主动外观模型的方法等。
▲不同的人脸识别算法
在人脸识别领域,有一些比较经典的算法,例如特征脸法(Eigenface)、局部二值模式法、Fisherface等,不过IT之家在这里还是还是觉得与时俱进比较好,所以选择一个目前应用比较广泛且流行的方法作为示例,叫做OpenFace。当然,我们不做实际的测试,只是通过它来了解识别的原理。
OpenFace属于基于模型的方法,它是一个开源库,包含了landmark,head pose,Actionunions,eye gaze等功能,以及训练和检测所有源码的开源人脸框架。
在前面的步骤中,IT之家已经为大家介绍如何通过HOG的方法将图像中人脸的特征数据提取出来,也就是成功检测到了人脸。
这时又有一个问题,就是这个人脸的姿势好像不是那么“正”,同样一个人,如果她的姿势,面部的朝向不同,人类仍然能认出她来,而计算机可能就认不出了。
解决这个问题,有一个办法,就是检测人脸主要特征的特征点,然后根据这些特征点对人脸做对齐校准。这是Vahid Kazemi和Josephine Sullivan在2014年发明的方法,他们给人脸的重要部分选取68个特征点(Landmarks),这68个点的位置是固定的,所以只需要对系统进行一些训练,就能在任何脸部找到这68个点。
有了这68个点,就可以对人脸进行校正了,主要是通过仿射变换将原来比较歪的脸摆正,尽量消除误差。这里的仿射变换主要还是进行一些旋转、放大缩小或轻微的变形,而不是夸张的扭曲,那样就不能看了。
▲过程大约是这样,原来的脸被进行了一定程度的校正(图片来源:OpenFace github说明页面)
这样我们把原始的人脸图像以及HOG的特征向量输入,能够得到一张姿势正确的只含有人脸的图像。
注意,到这一步我们还不能直接拿这张人脸图像去进行比对,因为工作量太大,我们要做的是继续提取特征。
接着,我们将这个人脸图像再输入一个神经网络系统,让它为这个脸部生成128维的向量,也可以说是这个人脸的128个测量值,它们可以表示眼睛之间的距离,眼睛和眉毛的距离、耳朵的大小等等。这里只是方便大家理解而举例,实际上具体这128维的向量表示了哪些特征,我们不得而知。
当然,这一步说起来简单,其实难点在于如何训练这样的一个卷积神经网络。具体的训练方法不是我们需要了解的,但我们可以了解一下训练的思路。训练时我们可以输入一个人脸图像的向量表示、同一人脸不同姿态的向量表示和另一人脸的向量表示,反复进行类似的操作,并不断调整,调整的目标是让同一类对应的向量表示尽可能接近,其实也就是同一个人的向量表示尽可能距离较近,同理,不同类别的向量表示距离尽可能远。至于人工智能神经网络训练的基本原理,大家可以查看IT之家之前发布的《AI不是科幻电影里的洪水猛兽,而是被慢慢变革的生活方式》这篇文章。
其实训练的思路也很好理解,因为一个人的人脸不管姿态怎么变,在一段时间内有些东西是固定的,比如眼睛间的距离、耳朵的大小、鼻子的长度等。
在得到这128个测量值后,最后一步就简单了,就是将这128个测量值和我们训练、测试过的所有面部数据做比对,测量值最接近的,就是我们要识别的那个人了。
这样就可以完成一次人脸的识别。
总结
人脸识别技术经过70多年的发展,到今天已经发展成为一门以计算机视觉数字信息处理为中心,糅合信息安全学、语言学、神经学、物理学、AI等多学科交合的综合性技术学科,内涵已极为丰富。而IT之家在本文试图为大家讲解的,只是人脸识别最基础和通俗的原理以及相对单一的用例分析,显然无法涵盖人脸识别领域所有的内容,只是希望借此对大家理解、认识如今我们已经习惯使用的人脸识别功能有所帮助。
国际调研机构Gen Market Insights发布的数据显示,到2025年底全球人脸识别设备市场价值将达到71.7亿美元,智能手机上对人脸识别技术的广泛应用,只是为我们了解这项技术提供了一个契机,未来,随着5G万物互联时代的到来,智能硬件市场将得到极大扩展,那才是人脸识别技术真正大展身手的天地。
嗯,不错,期待这个时代早日到来,到时候小编这张盛世美颜终于能做点有意义的事情了,也算不负父母恩泽。