刘 程,谭晓阳,2
(1.南京航空航天大学计算机科学与技术学院,江苏 南京 210016; 2.软件新技术与产业化协同创新中心,江苏 南京 210016)
随着机器学习在计算机视觉领域,特别是人脸识别上的突破性进展,人脸验证技术[1-3]的产业化越来越受到学术界和工业界的关注。目前市面上已经有不少投入使用的人脸验证产品,如南京高铁站采用的人脸验证检票系统、支付宝的刷脸支付等。这些人脸验证系统[4]已经达到了工业化应用的标准,但也存在一定的局限性。例如前者需要采购特定的设备,并且设备体积过大不便于移动。而后者受限于网络传输的速度和稳定性,在需要不断移动,并且无法保证网络通畅的环境下无法满足应用需求。例如物流公司的货运系统需要在长途运输过程中验证货车司机的真实身份,由于货车长途跋涉不能保证网络的通畅与稳定,而且货车驾驶舱空间较小无法安装大型的人脸验证设备。
综合考虑上述应用需求,本文设计并实现一种部署于移动端平台的人脸验证系统。移动端设备具有小巧便携的特点,并且随着移动端高性能计算芯片技术[5-6]的发展,如高通、联发科等厂商生产的移动设备芯片具有一定的多核并行计算能力,能够满足较低分辨率图片的实时处理,以及谷歌官方提供了NDK编译技术对于C语言在安卓平台[7]的支持,使得在移动端设备部署小型深度卷积神经网络模型成为了可能。
基于上述2点,本文设计并实现一款完全基于安卓系统智能手机的人脸验证系统。该人脸验证系统在人脸检测部分使用多层感知机[8]进行人脸检测和定位,在人脸特征点定位上使用级联多个栈式自编码网络[9-10]来回归人脸关键点坐标,并在人脸图像特征提取中应用深度卷积神经网络模型[11]来提取特征向量从而进行比对。在编程实现方面,为了优化算法运行效率,采用了NDK技术[12]交叉编译Java和C++代码,并使用OpenCV[13]调用安卓手机自带的图形处理器(GPU)进行并行加速运算以提高系统运行效率。实验表明,该系统在FERET数据库[14]上进行人脸验证达到了97.16%的准确率;在运行速度方面,可将进行一次完整的人脸验证流程控制在4 s以内,能够满足工业化应用的需求。
本文的人脸验证系统功能主要分为2部分:数据采集和人脸验证。
数据采集部分功能为:输入用户身份信息,采集用户不同姿态下的正面人脸图像,同时对采集的图像进行预处理和人脸特征向量提取,并将人脸特征向量与用户身份信息一起存入数据库中。该部分主要完成数据库的建立与更新,是进行人脸验证的基础。在实际应用中,可以由软件管理员预先完成。
图1 人脸验证主要流程
人脸验证部分的具体工作流程如图1所示,主要包括以下几个步骤:用户身份信息输入,该用户预存储的人脸图像特征向量的获取,用户当前摄像头获取的人脸图像的预处理和人脸图像特征向量提取,预存储的人脸图像特征向量和用户当前摄像头获取的人脸图像的预处理和人脸图像特征向量的相似度计算等。
一次完整的人脸验证过程为:1)获取用户身份信息如工号、姓名等,具体可以通过扫描身份证件或用户手动输入;2)根据获取的身份信息查找数据库,返回代表该身份人的图像特征向量组,同时打开摄像头引导用户进行人脸图像采集;3)进行采集图像的人脸检测,对于无法检测人脸的图像要求用户重新采集;4)对于图像进行预处理,具体为灰度化处理、裁剪并进行特征点定位,根据人脸图像特征点进行图像的旋转摆正;5)对于预处理后的图像进行特征向量提取;6)与数据库中获得的特征向量组进行相似度比对,返回验证结果。
人脸图像处理是人脸验证系统的关键部分,通常分为人脸图像检测、人脸特征点定位和人脸特征向量提取比对3个部分。本章简要介绍本文的人脸验证系统的这3个部分的具体算法。
人脸检测是指判断一幅原始图像中是否存在人脸部分,并返回人脸部分的位置坐标和大小。作为人脸图像处理的首要步骤,人脸检测的结果直接决定了接下来的步骤能否顺利进行。本系统综合考虑了人脸检测的精度和速度需求,采用了基于级联多个多层感知器[15-16]的漏斗型树状结构分类器进行人脸检测和定位。
对于漏斗型的多层级联结构,本文在最底层直接使用OpenCV自带的人脸检测器框出所有可能是人脸的部分图像,并将其作为下一层的训练数据对多个训练感知器进行分类,舍弃不是人脸的图片,并将可能包含人脸的图片继续作为下一层的输入,层层递进,最终得到检测出的人脸图像。在实际实现中,采用三层的结构以达到精度与运行时间的平衡。其中单个感知器的输入为上一层输出的可能包含人脸的图像,输出为确定不包含人脸的部分图像和可能包含人脸的部分图像。
人脸特征点定位,即在人脸定位的基础上定位人脸关键点,如眼睛、鼻子、嘴巴等的坐标。人脸特征点定位的目的是排除不同角度、姿态的人脸图像对于人脸图像分类的影响;同时利用定位的特征点进行人脸图像的摆正对齐,以提高特征提取的准确性。本系统采用了一种由粗到精的栈式自编码网络[16]来回归人脸中的眼睛、鼻子、2个嘴角共5个关键特征点的坐标。
具体算法流程如下:
1)输入人脸图像的低分辨率版本,并估计人脸的大致轮廓S0。
2)提高输入图像的分辨率,抽取当前人脸形状S0各特征点位置的局部特征输入下一级自编码网络优化轮廓S1。
3)循环若干次步骤1~步骤2,最后返回回归的特征点坐标值。
图2 人脸特征点回归示意图
人脸特征点定位示意如图2所示,在实际算法实现中,为了提高算法的运行效率和优化计算,只回归了人脸的双眼、鼻子和2个嘴角共计5个点的坐标。
本文通过计算2眼的坐标点连线的中点作为原点建立二维坐标系,并将图片进行旋转变换,使其2眼坐标点位于水平x轴方向上。以完成人脸的摆正。具体的操作过程如图3所示。
图3 人脸摆正示意图
人脸特征向量提取是人脸验证系统的最关键部分,特性向量的表征好坏直接影响了人脸验证结果的准确率。传统的人脸图像特征提取算法有基于局部二值模式(Local Binary Pattern)[18]算法、方向梯度直方图(Histogram of Oriented Gradient)[19]算法等。随着近年来深度学习的迅猛发展,特别是Krizhevsky[20]在Imagenet上的图像分类挑战中获得了2012年的冠军,并且远远领先于第二名的传统方法。使用深度卷积神经网络模型进行特征提取成了现今较为流行的方式。
本系统采用了改进的深度卷积神经网络进行人脸图像的特征提取。对于完成人脸特征点定位的人脸图像,将其作为输入在训练好的网络模型中进行前向传播,将输出层的2048个节点的数据作为代表该人脸图像的特征向量进行输出(具体格式为d0,d1,d2,…,d2047)。在比对过程中,将其与数据库中预先存储的相同维数的特征向量计算欧氏距离,并根据具体情况设定阈值进行判断,当结果小于阈值,便可判断验证通过。
本文系统实现平台为安卓6.0系统,所用编程软件为Android Studio2.2,并调用了OpenCV2.4.10进行图像处理。主要使用的编程语言为Java和C++。编程平台为64位的Windows7系统,测试平台为Android Studio2.2自带的Android虚拟机、一加2手机、魅族mx4手机。
用户界面如图4所示,具体分为信息录入和人脸验证2个部分。
用户身份信息的输入,以用户手动输入个人姓名(或工号等)的方式进行,也可以扫描工作证的方式进行。其中,信息录入部分具体流程如下:
1)输入用户姓名。
2)调用摄像头获取用户人脸图像,并通过算法处理获取特征向量。
3)查询数据库中是否存在该用户,存在则将特征向量写入该用户部分并更新数据库,若不存在,则新建该用户信息并写入特征向量。
4)返回结果。
人脸验证部分具体流程如下:
1)用户输入姓名。
2)系统查询数据库中是否存在该用户,存在则返回存储的用户特征向量,若不存在则返回错误信息。
3)调用摄像头获取用户人脸图像,将其与用户信息一同传入算法处理部分,进行人脸相似度计算。
4)等待算法处理结果,并输出最终验证结果。
由于Android Studio2.2支持使用Cmake方式编译C++代码进行交互,因此在算法实现部分,使用C++语言进行算法实现。使用C++语言相比于Java语言具有3大优势:1)C++作为底层语言,本身运行效率高于Java;2)使用C++可以调用Android系统手机的GPU进行并行运算以提高效率;3)目前大部分图像处理算法都有C++实现版本,可以进行方便的算法复用,提高编程效率。
图4 系统界面
算法实现部分具体流程如下:
1)获取验证人身份信息、摄像头人脸图像以及数据库中的人脸特征向量。
2)将摄像头人脸图像进行人脸检测,裁剪出人脸部分,若无人脸返回错误信息。
3)将裁减后的人脸图像进行特征点定位,并根据特征点位置进行人脸对齐。
4)将人脸对齐后的图像传入训练好的CNN模型[20],计算输出人脸特征向量。
5)与数据库中的人脸特征向量进行相似度计算,返回结果。
在具体实现过程中,为了统一Java与C++部分图像数据的格式,本文使用了OpenCV作为图像表示的桥梁,并且以OpenCV定义的MAT格式作为图片处理的主要格式。
本系统通过综合考虑实际应用的数据量大小和运行平台,采用SQLite作为数据库平台。SQLite是一种开源、跨平台的轻量级数据库,目前是Android系统下应用最广泛的一种数据库,具有占用系统资源低、查询速度快的特点。
为了提高数据操作效率,本文把人脸图像数据用特征向量的形式存储,这样可以大大减少图像数据的存储空间,同时可以极大提高系统读取人脸数据的效率。具体存储数据结构用其中同一用户存储多张人脸图片的特征向量表示,代表该用户不同姿态,或者是否佩戴眼镜等条件下的人脸表征。
根据本文的人脸验证系统的实际应用需求。本系统的实验主要分为2个部分:1)验证系统的人脸识别准确率;2)测试系统的可用性,具体包括准确率、运行时间、能耗、用户体验等方面。
为了测试本系统人脸验证算法的准确率,本文选用了FERET数据库作为测试数据进行验证。FERET数据库是美国军方提供的人脸识别数据库,其中共有3880张人脸图像,包含了1029个人不同表情的正面人脸图像,是目前最权威的人脸数据库之一。在具体实验过程中,对于数据库中的每一张人脸图像,本文随机选取9张人脸图像与其进行两两验证并计算相似度,其中包含同一人在不同光照、不同姿态下的人脸图像和不同人的人脸图像。并对实验结果设定不同阈值进行数据统计。具体实验结果如表1所示。
表1 在FERET人脸数据库上的实验结果(%)
阈值RRRFFRFF0.789.6710.331.0198.980.697.162.841.1998.810.598.721.273.1296.87
本文实验了3种阈值设定下的验证结果,包括将同一个人认证为同一个人(RR)、将同一个人认证为不同人(RF)、将不同人认证为同一人(FR)、将不同人认证为不同人(FF),分别计算其识别百分比。实验结果表明在选取阈值为0.6时,RR和FF的比值分别达到了97.16%和98.81%,基本满足了工业化应用的需求。
为了测试该系统在实际使用中的准确率和效率,将该系统以打包成apk的形式安装在不同配置的安卓系统手机上,并通过调用手机摄像头收集人脸图像数据进行验证实验。
在具体实验过程中,收集了216例共523张手机拍摄的照片。同时为了控制变量,首先对收集的图像进行人工裁剪和分类标注身份,得到200对验证图像。其中部分收集到的图像如图5所示,包括同一人在不同时间段处于同一位置的图像,同一时间处于不同位置的图像,以及不同人处于同一位置的图像。然后将其拷贝至手机内存中,更改调用摄像头的代码,接口为调用手机相册,进行人脸验证。具体实验结果如表2所示,由于手头设备有限,本文只测试了在Android Studio中的虚拟机,以及手头现有的2款安卓系统手机下的实验。
表2 在不同安卓系统手机上的实验结果
平台准确率/%平均时间/s虚拟机96.02.20一加手机296.52.33魅族mx496.03.46
图5 部分实际采集到的图片
在安卓虚拟机上,采用收集的同一批数据测试了几种不同人脸验证API的验证结果。由于市面上能提供人脸验证APP都为上传图像至服务器端进行识别验证并返回JSON格式的字段,所以运行时间无法控制变量进行对比,只统计了准确率,具体如表3所示。可以看到几款准确率普遍比本文的要高,一方面是商用的人脸验证模型往往训练集都在百万以上,以量取胜,另一方面,本文所设计的人脸验证系统为了能够在手机端进行图像处理,简化了部分算法以提高处理速率,必然会带来验证精度的损失。
表3 采用其他API的实验结果
Face++腾讯优图本系统准确率/%99.59996.5
实际实验结果相较于FERET数据库中的准确率较低,经分析是因为实际收集的图像与训练模型所采用的数据集存在较大的差异,其中训练模型使用的是各个年龄段的人脸图像,而实际实验中采集的图像多为工科大学的大学生和研究生,并且男性占了较大的比重。但也说明了该系统的迁移能力较强。总的来说,实验结果表明,在实际应用中,该系统能够在保证较高的准确率的情况下快速高效地完成人脸验证工作,同时能够很好地应对光照强度和不同姿态的影响。
本文设计并实现了一种离线部署于安卓系统平台的人脸验证系统。该人脸验证系统使用深度学习的方法进行特征向量的提取,在设计和实现过程中兼顾了准确率和运行效率。相比于国内外同类型的研究,该系统首先将图像的处理过程在移动端完成,不依赖于网络传输,整个设备也只有口袋大小,具有便携性和稳定性。缺点为耗时较长,为了算法的移植也牺牲了一定的准确率。但是在需要便携、移动的环境下能够很好地完成人脸验证的应用需求。将该系统进行工业化应用必将创造良好的社会应用价值。
[1] Ahonen T, Hadid A, Pietikainen M. Face description with local binary patterns: Application to face recognition[J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2006,28(12):2037-2041.
[2] Cao Xudong, Wipf D, Wen Fang, et al. A practical transfer learning algorithm for face verification[C]// Proceedings of the IEEE International Conference on Computer Vision. 2013:3208-3215.
[3] Berg T, Belhumeur P N. Tom-vs-Pete classifiers and identity-preserving alignment for face verification[C]// Proceedings of the British Machine Vision Conference. 2012:129.1-129.11.
[4] Song Fengxi, Zhang D, Wang Jizhong, et al. A parameterized direct LDA and its application to face recognition[J]. Neurocomputing, 2007,71(1-3):191-196.
[5] Rodriguez C S, Fischer G. The Linux Kernel Primer: A Top-down Approach for x86 and PowerPC Architectures[M]. India: Pearson Education, 2006.
[6] Cheng Kwang-Ting, Wang Yi-Chu. Using mobile GPU for general-purpose computing-A case study of face recognition on smartphones[C]// 2011 International Symposium on VLSI Design, Automation and Test(VLSI-DAT). 2011:1-4.
[7] 韩超,梁泉. Android系统原理及开发要点详解[M]. 北京:电子工业出版社, 2010.
[8] Li Haoxiang, Lin Zhe, Shen Xiaohui, et al. A convolutional neural network cascade for face detection[C]// Proceedings of 2015 IEEE Conference on Computer Vision and Pattern Recognition. 2015:5325-5334.
[9] Xiong Xuehan, De la Torre F. Supervised descent method and its applications to face alignment[C]// Proceedings of 2013 IEEE Conference on Computer Vision and Pattern Recognition(CVPR), 2013:532-539.
[10] Zhang Zhanpeng, Luo Ping, Chen C L, et al. Facial landmark detection by deep multi-task learning[C]// Proceedings of 2014 13th European Conference on Computer Vision. 2014:94-108.
[11] Sun Yi, Wang Xiaogang, Tang Xiaoou. Deep convolutional network cascade for facial point Detection[C]// Proceedings of the 2013 IEEE Conference on Computer Vision and Pattern Recognition. 2013:3476-3483.
[12] Zapata B C. Android Studio Application Development[M]. Packt Publishing, 2013.
[13] Stone J E, Gohara D, Shi G. OpenCL: A parallel programming standard for heterogeneous computing systems[J]. Computing in Science & Engineering, 2010,12(3):66-73.
[14] Phillips P J, Wechsler H, Huang J, et al. The FERET database and evaluation procedure for face-recognition algorithms[J]. Image and Vision Computing, 1998,16(5):295-306.
[15] Yan Shengye, Shan Shiguang, Chen Xilin, et al. Locally assembled binary (LAB) feature with feature-centric cascade for fast and accurate face detection [C]// 2008 IEEE Conference on Computer Vision and Pattern Recognition. 2008:1-7.
[16] Bay H, Tuytelaars T, Gool L V. SURF: Speeded up robust features[J]. Computer Vision & Image Understanding, 2006,110(3):404-417.
[17] Zhang Jie, Shan Shiguang, Kan Meina, et al. Coarse-to-fine auto-encoder networks (cfan) for real-time face alignment[C]// European Conference on Computer Vision. 2014:1-16.
[18] Zhang Baochang, Gao Yongsheng, Zhao Sanqiang, et al. Local derivative pattern versus local binary pattern: face recognition with high-order local pattern descriptor[J]. IEEE Transactions on Image Processing, 2010,19(2):533-544.
[19] Dalal N, Triggs B. Histograms of oriented gradients for human detection[C]// 2005 IEEE Computer Society Conference on Computer Vision and Pattern Recognition. 2005,1:886-893.
[20] Krizhevsky A, Sutskever I, Hinton G E. Imagenet classification with deep convolutional neural networks[C]// Advances in Neural Information Processing Systems. 2012:1097-1105.