lxue
作者lxue2020-02-19 16:12
数据库管理员, 某互联网公司

人脸识别的探索、评估与应用建议

字数 8311阅读 1249评论 0赞 1

摘要:人脸识别是近几年人工智能技术的热点之一,人脸识别的准确率在实验室已经远超人类眼睛的识别率了,当然实验室的数据与实际应用场景还是有一定距离的,人脸识别受到很多因素的影响。那么,人脸识别在金融领域到底是否能进入实用阶段,是否可以大规模的使用,有哪些风险和限制因素呢?为此,我们设计了一个应用场景,进行编程探索实践。基于该实践探索,我们总结了人脸识别的原理,实际测试了人脸识别在各种场景下的使用效果、性能,分析评估了影响人脸识别准确性的因素、使用限制,并提出了具体应用场景的建议。

1 背景

图像识别是近几年人工智能(简称AI)中一个相对成熟的技术,而其中的人脸识别因其应用广泛,更是其中的热门。目前人脸识别在安防、车站、边防卡口、无人商店等领域都有一些应用尝试,在证券领域有远程开户等应用。

2015年Google的研究人员发表了一篇人脸识别的论文:FaceNet: A Unified Embedding for Face Recognition and Clustering,他们训练一个深度神经网络进行人脸识别,在LFW上面取得了当时最好的成绩,识别率为99.63%,而目前人类眼睛的识别率大约为95%,机器的识别率已经大大超过了人眼。人脸识别的应用也经常见诸于各种媒体报道中,可以大大减少人工的工作量。当然实验室的数据与实际应用还是有一定距离的,人脸识别受到很多其它因素的影响。那么,人脸识别在金融领域到底是否能进入实用阶段,是否可以大规模的使用,有哪些风险和限制因素呢?

为此,我们设计了一个应用场景,编写软件进行了人脸识别的探索与测试验证。该软件的功能是,使用摄像头在公司前台对经过的人员进行偷拍与正拍,然后对其中的每一帧图片进行人脸识别,并与人脸库中的人脸进行比对。如果是公司员工,则无任何提示,如果非公司员工,则声音提示前台人员有陌生人经过或客人来访。

基于以上实践探索,我们总结了人脸识别的原理,实际测试了人脸识别在各种场景下的使用效果、性能,分析评估了影响人脸识别的准确性的因素、使用限制,并提出了具体应用场景的建议。

2 人脸识别算法原理

人脸识别,是基于人的脸部特征信息进行身份识别的一种生物识别技术。用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部识别的一系列相关技术,通常也叫做人像识别、面部识别。通俗的讲,人脸识别是指,在一幅图像中判断是否存在有一张或多张人脸,并指出人脸的矩形位置。此外,人脸识别通常还包括人脸比对,也就是指根据一张人脸,与已知的图片库进行比较,判断这个人是谁,他的姓名是什么。

人脸识别能够比较快速地在市场上推出,很大的一个原因是,图像输入不再需要人工来进行特征提取,而是直接根据图片中的像素点的值,直接输入神经网络进行计算,简化了输入方式,从而大大节省了人力。

人脸识别包括以下内容 :

(1) 人脸检测:检测图片中是否包含一张或多张人脸,这是AI中的二分类问题。

(2) 人脸定位:指出人脸的矩形位置,这是AI中的回归问题。

(3) 人脸比对:根据一张人脸,与已知的图片库进行比较,判断这个人是谁,他的姓名是什么。这是AI中的相似度(距离)求解问题。

2.1 人脸检测

采用卷积神经网络(CNN)对图片进行是否有人脸的二分类。对输入的图片,经过若干卷积和池化层之后,加上一个全连接层,最后采用softmax 激活函数得出图片是否存在人脸的分类。

一般来说,随着CNN神经网络的层次变深,识别效果会更好,但也意味着计算机的性能要求越高,内存要求越大,为防止过拟合,训练数据要求也越多。

CNN应用于图像分类,是一个比较成熟的算法,主要解决了一张图片上是否有人脸或物体的问题,但并不知道有几张人脸及其相应的矩形框位置信息。

2.2 人脸定位

人脸定位,就是在一张图片上找到有几个人脸的同时,还要指出每个人脸的矩形位置。先后出现了几种比较典型的算法,包括使用回归问题定位、尝试不同大小图框定位和R-CNN算法。

Faster-RCNN也是目前精度最高的实时通用物体检测算法,效率也较高。此后出现的一些改进算法,例如R-FCN 、SSD、yolo等,能更好地提高实时检测速度。这些算法框架不限于人脸检测,也同样适用于其它通用物体的检测,都是目前较好且应用最广泛的目标检测模型。

目前,Faster-RCNN、R-FCN 和SSD算法在google的Tensorflow框架中都已经发布,可以直接使用。

2.2.1 人脸比对

人脸比对,是在一张图片中,分别对找到的每一个人脸及其位置,并与已知图片库中的人脸进行比较,如果相似度超过一定阈值且相似度最高,就认定是该人。通常的比较方式,是先计算得到人脸的128维的特征向量,然后使用该特征向量向量进行相似度比较的计算。

2.2.1.1 人脸特征向量的计算

人脸128维特征向量的计算,通常有两种方式:

(1)通过协方差的方法来计算得到128维向量:

通过人脸定位得到人脸矩形框(或者人脸68个特征点),计算矩形框里(或者人脸68个特征点)的像素矩阵(减少误差和加快速度,通常采用灰度图)的协方差矩阵,通过主成分分析法(PCA),得到协方差矩阵的所有特征值对应的特征向量,按从大到小,取前128个的特征向量,得到能代表该人脸的128维向量。

(2)通过残差深度学习网络训练得到128维向量(如ResNet-34 )。

这是目前使用较多的一种方法。

2.2.1.2 人脸相似度的计算

人脸相似度的计算,就是比较128维的向量的相似度,常用的相似度比较算法有以下几种:欧氏距离、余弦夹角,其它算法(如切比雪夫距离、闵可夫斯基距离、 标准化欧氏距离、马氏距离、曼哈顿距离、汉明距离、杰卡德距离&杰卡德相似系数、相关系数&相关距离、信息熵等)较少使用。

3 编程探索实践

我们根据设计的应用场景,分别基于以下三种人脸识别库进行python和C++的编码,并进行了测试验证。我们测试的三种人脸识别库分别是:

(1) Opencv:是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它由一系列轻量级而且高效的 C 函数和少量 C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。Opencv于1999年由Intel建立,如今由Willow Garage提供支持。Opencv采用了haar特征+adaboost级联分类器的方法进行人脸检测,并提供了python和C++两种编程接口。

(2) Dlib:是一个包含机器学习算法的C++开源工具包。Dlib可以帮助您创建很多复杂的机器学习方面的软件来帮助解决实际问题。目前Dlib已经被广泛的用在行业和学术领域,包括机器人,嵌入式设备,移动电话和大型高性能计算环境。Dlib的开源许可允许我们在任何应用中免费使用。Dlib提供了基于HOG(histogram of oriented gradient)的方法进行人脸识别,也提供了CNN算法进行人脸识别。我们在项目实践中,采用了其中的CNN算法。

(3) Libfacedetection:是由中国深圳大学于仕祺老师发布在Github上的,用于快速人脸检测的二进制库,可免费用于任何目的。Libfacedetection是基于CNN和Multi-BlockLBP算法实现。

以上三种库都是互联网上比较主流使用的人脸识别库。我们在实际测试中,摄像头在公司前台拍摄的图片大小为1920*1080。此外,我们还尝试了在电视剧中实时识别明星人脸的效果。

在以上人脸定位的算法中,需要先在图片中找到人脸所在的矩形位置,然后提取人脸中的68个特征点,再进一步精确抠出脸部区域的范围,然后再输入神经网络中计算得到128维的人脸特征向量。

例1:下图是标识出某明星人脸上68个特征点的例子。

从以上可以看出,根据人脸上的68个特征点,可以识别出人的眼睛、嘴巴等位置以及是否张开,以及张开的曲线等,据此可以初步判断人的情绪特征。

例2:在公司前台通过摄像头进行人脸识别的例子。

例3:以下是一段电视节目中的几位主持人的人脸识别结果的例子。

通过摄像头拍摄获取照片,与通过影视节目(MP4等文件)或截屏来获取照片,并进行人脸识别,原理上是完全相同的。通常情况下,由于影视节目中的拍摄装备、灯光效果、对焦技巧等更专业,人脸识别效果会更好。

4 人脸识别效果评估

4.1 人脸检测准确性的比较

根据我们的比较测试,准确性方面libfacedetection和dlib的准确性不相上下,两者都比较准确。Opencv识别率略输一筹,主要问题在于opencv经常会把非人脸的区域识别为人脸。

4.2 人脸检测耗时比较

为尽可能提高效率,减少摄像头实时人脸识别中的时延,我们在以上三种开源库中,我们分别使用了Python和C++的方式进行了性能测试比较。结论如下:

(1) 人脸识别主要耗时在是否有人脸及其矩形位置的判断上,人脸比对的耗时基本可以忽略不计。

(2) python方式的代码执行效率比C++明显低,平均来说Python代码的执行所需时间大约是C++代码的3倍。例如对于一张图片上只有一个人脸来说,使用dlib库,python执行平均耗时大约需要7至8秒,而使用C++大约需要耗时2至3秒。

(3) 单张图片上,多个人脸的识别时延相对于单个人脸,在执行时延上几乎是成比例增加。例如,一张图片上如果只有一个人脸需要耗时2秒,那么一张图片上如果有三个人脸,那么需要的耗时大约是6秒。

(4) 在人脸识别的三种算法中,耗时结果是,opencv > dlib > libfacedetection,也就是说libfacedetection耗时最少,性能最好。使用libfacedetection进行人脸识别,一张图片只有一个人脸的情况下,在笔者的笔记本电脑(CPU为主频1.7GHZ,睿频2.4GHZ,4GB内存)上,包括人脸检测、人脸比和显示在内的全部耗时大约为0.7至0.8秒之间,耗时平均为0.75秒。

(5) 检测最小脸的尺寸参数,对耗时影响非常大。检测最小脸的尺寸越小,识别率高,但耗时越大。

(6) 图片上如果没有人脸,识别速度更快。使用libfacedetection库,没有人脸时耗时平均大约为0.16秒。

需要说明的是,以上测试,都是基于C++的Windows x64平台的Release版本。Debug版本单张人脸识别花费时间大约1至3分钟,基本无法使用。

以上三种人脸识别库,对于摄像头捕捉的实时视频,或者影视剧中人物人脸的实时识别,从笔者的使用感受来说,虽然识别率较高,但性能上明显不足,画面卡顿明显,电脑CPU占用高,使用效果较差,性能仍然有待进一步提高。进一步提高性能可能的手段:

(1) 由于人脸识别算法目前还在改进和发展过程中,比如,Faster R-CNN、R-FCN、 SSD或yolo等算法,都是比较快的算法,如果追求实时性更好的话,建议采取更快的算法。

(2) 摄像头摄像时,一般为每秒25帧图像左右,如果对每秒25张的照片都进行识别,确实没有必要,可以有选择性地进行识别。根据应用场景的不同,对于视频拍摄的照片,可以采用人脸跟踪或其它方式,选择性过滤掉一些照片,不用对每一帧照片都进行识别,以提高性能。

4.3 API接口的易用性比较

软件C++语言API接口的易用性方面,Libfacedetection最好,opencv次之,dlib最差。

为了识别不同矩形大小的人脸,Libfacedetection可以直接在调用的函数中调节最小和最大脸尺寸的参数,就可以得到想要的结果。 Opencv中规中矩,不需要进行参数调节。

而Dlib在需要识别小尺寸人脸时,需要先调用其内置函数来放大图片。但是,会遇到三个问题:首先,经常有人会忘记这个步骤,导致误认为dlib识别率比较差;第二,即使是一个很大的图片中,也可能存在小矩形的人脸,我们无法提前预知人脸的大小,所以,很难提前知道图片应该放大到什么尺寸;第三,dlib放大图片后进行人脸识别耗时太长。经测试,放大图片到一倍的尺寸时进行人脸识别,耗时增加一倍,感觉得不偿失。

4.4 开源比较

开源支持方面,Libfacedetection只有二进制库,库代码本身不开源。Opencv和dlib库代码都开源。

5 人脸识别的限制因素

5.1 人脸比对的限制

人脸比对,一般是指1:1或1:N比对。

(1)1:1是指比较一张人脸与另外一张人脸是不是同一个人,比如用户在进行股票账户在线开户,或者通过火车站、机场、海关等通过卡口的场所,就是使用当前拍照的人脸与身份证上的人脸进行比对,判断是否为同一个人,即验证“你是不是某个人”。对于人脸1:1比对,一般都属于强制性拍照,一般都要求先输入身份证件,并强制性要求拍摄人的正脸,这样的人脸比对的相似度可以很高。

(2)1:N比对,是指有一张人脸,与图片库中保存的多张人脸进行比对,搜索“你是谁”。1:N比对的验证速度,还受到人脸库的数量大小的影响。

我们的实验采用的是1:N比对。在我们的实验中,我们通过人脸识别可以得到人脸的矩形位置和128维的特征向量,然后将这128维向量,与事先保存好的人脸库中的128维向量进行相似度比对。人脸比对相似度的算法以上已经介绍过,在我们的代码实验中,我们同时采用了欧氏距离和夹角余弦两种算法,两种算法得到相似度最高值的结论一致,亦即两种算法相似度最高值都指向人脸库中的同一个人,且相似度都超过一定的阈值,那么我们认为比对成功了,输出该人的姓名即可。

对于1:N比对的场景,发生在我们日常生活中的非强制性拍摄的场景较多,我们测试发现,其准确性受到一些因素的影响,总结如下:

(1) 正脸或侧脸的影响。如果是正脸,1:N识别率很高,基本上只要在人脸库中,相似度最高的人脸肯定能正确匹配到。但对于侧脸,相似度的比对经常误报。

(2) 如果要比对的人脸在人脸库中不存在,根据阈值的设置,人脸差异比较大时,会匹配不到,这是期望的结果;但人脸差异比较小时,经常会出现找到一个相似度很高的人脸出来。这是因为,受拍摄光照条件或正脸侧脸等因素的影响,即使是同一个人的不同照片,相似度差异也会很大。例如,同一个人的不同照片相似度可能为90%至97%之间,而不同人的照片相似度也可能达到93%。这就造成了一个问题,没有办法设置统一的相似度阈值,来断定到底是不是同一个人。项目团队认为,这也是目前人脸1:N场景比对无法大规模应用的根本原因。

人脸识别有两个重要指标,一个是认假率,一个是拒真率。认假率是指人脸比对通过了但其实并不是本人,把“假的”认成了“真的”。 拒真率是指本人亲自拍照比对但是比对失败了,把“真的”当成了“假的”。这两个指标的好坏都与相似度的阈值设置有关,且两者有跷跷板效应,其中一个指标上升,另外一个指标必然下降。但是由于现实场景中,环境差异很大,应用场景不同,导致这个阈值无法设置为一个固定的值。只有对于环境类似、强制性拍照的同一个应用场景下,阈值才能设置为较高。而对于非强制性拍照,如果阈值设置过高,就会导致拒真率太大。

2018年11月底,我公司承办了一项600余人参加的重要技术会议,在此会议中,采用了某知名公司的人脸识别技术系统作为会议现场验证身份的手段。在该系统中,参会人员需要先在会议系统中进行注册,注册时需要提交个人人脸照片。在活动现场签到或办理业务(比如索取餐券、会议资料等)时,使用人脸识别和1:N比对作为验证身份的手段之一。在系统服务的过程中,现场服务的工作人员发现,确实偶尔会出现人脸匹配失败的情况,需要人工干预改为使用手机号码等进行验证身份。我们根据人脸比对的原理推测,该人脸比对的失败,与阈值设置有关。该人脸比对偶尔失败情况的出现,与我们的预期和实验结果的判断完全一致。

5.2 影响人脸检测准确性的因素

相对于实验室的图片(如:LFW人脸数据集),实际情况下,拍摄的照片人脸识别的准确率相对较低,与多种因素有关,以下是几种主要因素。

(1) 照片的光照条件对人脸识别的结果影响是首要的。尤其是背光导致的脸部黑黑的效果,可能导致无法识别人脸,识别率大大降低。例如,笔者在同一个办公室,即使室内有照明灯光,在身后是否有窗户(背光)的情况下,识别率也会有很大不同,有背光的情况下识别率会更低。因此,如果要得到好的效果,一定要保持好的光照条件。但该问题也是可以解决的,由于人脸识别的照片在预处理过程中,首先会转换成灰度图片,然后进行人脸识别,也就是说,我们只需要有黑白图片即可,不需要彩色图片。因此,我们可以改用红外摄像头进行摄像。红外摄像头一般都是自带红外光源,人眼看不到红外光,与环境光中的光照条件没有关系,而且还能在黑夜拍照。

(2) 非强制拍照的影响。我们在实验过程中,如果采用偷拍,经过的人员可能并没有注意到摄像头的存在,能拍摄到正脸的可能性低,但测试发现,侧脸仍然可以识别,比如只能拍摄到鼻子和半边脸的轮廓,仍然能正确识别人脸的位置,但比对的准确度会下降。对于该问题的解决方案,我们可以采用多个位置的摄像头,或者对于同一个摄像头中的多张不同瞬间的图片合成一个正脸图片。

(3) 焦点问题:如果不是自动对焦摄像头,由于人体的走动,在拍摄焦点变动导致人脸模糊的情况下,也会很大影响人脸识别的准确性。经测试,由于影视节目中的拍摄装备、灯光效果、对焦技巧等更专业,人脸识别效果会更好。

(4) 即使是正脸,如果旋转30度角以内,可以识别,如果超过这个范围,无法识别。

6 反人脸识别技术

伴随着人脸识别的技术的应用和发展,人们对隐私保护的担忧也与日俱增。近期有加拿大学者研发出“反人脸识别”的 AI算法,可以让人脸识别系统的准确率,从 接近100% 直线下降到只剩 0.5%,这项技术可望应用成为“隐私过滤器”。反人脸识别系统能够知道人脸识别系统在找寻什么关键部位,并在图像细节上稍作修改,使人眼看不出来变化,例如改变眼角,使其不太明显,人眼无法分辨,但却能够完全欺骗系统,让人脸识别系统无法识别。

该反人脸识别技术借鉴了生成对抗神经网络中的判别网络技术。虽然当前反人脸识别技术能快速瓦解人脸识别系统,但是这只是针对现有的基本的人脸识别神经网络,意义并不太大。人脸识别技术也将不断发展,从对抗神经网络的理论上分析,两者类似于矛和盾的关系,随着技术的发展,假以时日,如果将人脸识别系统与反人脸识别系统放在同一个神经网络中进行对抗训练,一个创建越来越强大的人脸检测系统,另一个创建更强大的工具来禁用人脸检测,才能真正形成同时提高两者的辨识能力的系统。

7 人脸识别应用场景建议

人脸识别的应用场景分为强制性拍照和非强制性拍照两种:

(1) 强制性拍照场景:

a) 人脸1:1比对:成功性比较高,效果较好。但必须配合身份证件等信息使用,先根据身份证信息,找到对应的身份证照片,然后再比对身份证照片与拍摄的照片相似度,如果超过一定阈值就算比对成功。

b) 人脸1:N比对:由于现实世界长得相似的人太多,甚至还有些双胞胎等,如果人员在图片库中,一定能比对成功。但是如果被比对人员不在图片库中,则只能找到一个最相似的人员。因此,建议在不太重要的场景中使用,或者模糊匹配后再由人工进行二次判断。

(2) 非强制性拍照场景:无论是1:1还是1:N比对:由于此场景受到侧脸的方位、角度、光线的影响很大,因此比对的精确度不高,建议仅在不重要的场合作为参考。

综合以上结论,我们认为人脸识别技术虽然在实验室具有99.x%的识别正确率,但是在金融领域的支付、交易等关键环节,对识别率要求往往是100%,百分之零点几的误差所导致的安全风险仍是很难接受的。此外,人脸比对阈值的设置,会导致认假率和拒真率同时受到影响,两者有跷跷板效应,其中一个上升,另外一个就必然下降,无法两全,从而影响人脸比对的使用效果。

因此,我们认为,在多数情况下,在金融领域的人脸识别只能作为一种辅助手段,可以减少人工的工作量,不能作为重要场合的唯一的用户身份认证手段,就如同在银行的顾客没有银行卡及密码的情况下,客服人员只看顾客的人脸,不可能为顾客办理交易业务一样。

文章转自微信公众号:上交所技术服务

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论0 条评论

Ctrl+Enter 发表