使用OpenCV的移动平台人脸检测技术研究
2017-08-30郭奇青李伟
郭奇青, 李伟
(河南工业职业技术学院 电子信息工程系,南阳 473000)
使用OpenCV的移动平台人脸检测技术研究
郭奇青, 李伟
(河南工业职业技术学院 电子信息工程系,南阳 473000)
面部智能识别系统的前提是在视频流或者图像中实时精准地检测人脸信息。针对人工检测效率低的弊端,设计了一种应用于Android移动平台的实时人脸检测系统,利用OpenCV视觉开发库进行二次开发,详述其设计原理和实现方法,并给出了软件编程实现。测试结果表明,该系统实时性高,在检测速度和准确性方面效果良好,实现了在移动环境下对人脸信息的有效检测和采集。
特征提取; OpenCV; 人脸检测; 级联分类器
0 引言
在工业4.0浪潮及《中国制造2025》规划来临之后,人脸检测技术做为机器视觉和模式识别的重点研究课题[1,2],受到国内外科研及工程人员的重点关注,已被广泛应用于视频会议、人机交流、图像检索、执法监控、访问控制等领域。
文献[3]将人脸模型分解出很多明显的T字型结构特征,并将Haar-Like特征优化为Haar-Like T特征,结合Adaboost分类器实现人脸检测算法。尚雪莲等人[4]避开一般纹理描述子描述人脸纹理特征不精确的情况,改用一种新型局部图结构结合加权纹理估计,进行人脸识别。文献[5]充分考虑了深度神经网络所具备的视觉特征自学习特点,基于类间约束与特征间约束,提出了一种新的人脸识别方法。
由于人脸形态多样,测试环境复杂,造成识别率较低。另外,随着微电子技术与移动操作系统的发展,各种移动平台的软硬件配置越来越高,在移动环境下进行人脸检测的需求逐渐增多。因此,本文针对移动应用环境,提出了一种在Android平台下基于OpenCV的人脸检测方法。
1 OpenCV技术
OpenCV即Open Source Computer Vision Library,它是Intel公司开发的一个遵从BSD(Berkeley Software Distribution,伯克利软件套件)许可证的开源计算机视觉和机器学习库,设计OpenCV的初衷是构建出一个包含计算机视觉基本功能的程序框架,以便于科学家及工程师在其基础上完成更加复杂的计算机视觉相关应用程序。
OpenCV自2.2版本开始支持Android系统,并在终端设备上引入OpenCV Manager来管理OpenCV库,使各应用程序方便地共享OpenCV动态链接库[6]。
1.1 OpenCV架构
OpenCV主要分为10个模块,即core模块、imgproc模块、video模块,calib3d模块、features2d模块、objdetect模块、ml模块、highgui模块、GPU模块和ocl模块。OpenCV各个模块间的关系,如图1所示。
图1 OpenCV的架构
1.2 OpenCV的特点
做为一款计算机视觉、图像处理软件,OpenCV的主要特点包括以下几个方面:
(1)平台开放。OpenCV基于宽松的BSD许可证,源代码完全免费公开,程序的安全性有保障,任何人可以根据需要对源代码进行修改、调用以及优化。
(2)功能强大。OpenCV包含了几百个类和函数,其用途广泛,覆盖了姿势识别、人机交互、运动理解、立体视觉、增强现实等图像处理和计算机视觉方面的通用场景。
(3)可移植性强。OpenCV采用C++语言开发,可以运行在Linux、Windows、Mac OS等桌面操作系统和Android等移动操作系统上。
(4)支持多种语言进行开发。OpenCV提供了C#、Python、Ruby、MATLAB等多种语言接口,这些接口可以同本地的C++代码互相调用。
2 人脸检测算法
常见的人脸检测方法主要有神经网络[5]、Adaboost算法[7]、支持向量机[8]等。
做为一种迭代算法,Adaboost在一个训练集中分别训练不同的弱分类器,并按照不同的权重将其集合为最终的强分类器。Adaboost迭代算法的流程如图2所示:
图2 Adaboost训练流程
Adaboost算法描述如下:
(1)对包含了N个样本的待训练数据集进行权重初始化。为简化运算,将其赋予相同的初始权重1/N,如式(1)。
(1)
(2)训练弱分类器要进行多轮迭代,用m=1,2,…,M表示每次迭代。
使用权重分布为Dm的数据集进行训练,选取让误差率最低的阈值,得到基本分类器,如式(2)。
(2)
计算Gm(x)误分类样本的权重之和做为分类误差度量的标准,为式(3)。
(3)
计算该弱分类器的权重为式(4)。
(4)
更新权重为式(5)。
(5)
其中Zm是规范化因子,具体见为式(6)。
(6)
(3)将训练好的各个弱分类器进行加权,得到最终的强分类器,为式(7)。
(7)
3 系统实现
通过相册选取本地图像,或者通过摄像头拍摄实时图像做为待检测样本。为了方便检测,需要对待测试图像进行预处理,包括样本图像灰度化、统一尺寸、亮度归一及图像旋转,达到简化图像的目的[9],之后提取测试图像的特征矢量,做为分类训练的输入。通过OpenCV预制的人脸分类器对待测试特征矢量进行对比[10],当分类器检测出样本向量中包含有人脸信息时,标记显示并保存图片,从而实现人脸检测,主要步骤,如图3所示。
图3 人脸检测处理流程
其中的关键步骤实现如下:
(1)添加训练过的人脸模型,使用配置文件lbpcascade_frontalface.xml创建一个人脸识别器,添加到项目路径下。
String xmlfilePath=getClass().getResource("lbpcascade_frontalface.xml").getPath().substring(1);
CascadeClassifier faceDetector=new CascadeClassifier(xmlfilePath);
if(!faceDetector) {
printf("Can't load lbpcascade_file!!");
return false;
}
(2)要使用OpenCV manager,必须首先在onResume函数中调用OpenCVLoader.initAsync()进行加载,否则会找不到链接库。
public void onResume() {
super.onResume();
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_6, this, mLoaderCallback);
}
(3)将待检测图像放入Mat结构中,调用CascadeClassifier类中的detectMultiScale方法在图像中检测人脸。
Mat image = Highgui.imread(Path);
MatOfRect faceDetections = new MatOfRect();
faceDetector.detectMultiScale(image, faceDetections);
实例化Rect对象数组,在每一个检测出来的人脸周围画出一个方框。
for(org.opencv.core.Rect rect: faceDetections.toArray()) {
Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0));
++facenum;
}
使用Highgui将Rect数组中保存的图像信息以png文件格式存放?String filename = "faceDetection.png";
System.out.println(String.format("Writing %s", filename));
Highgui.imwrite(filename, image);
4 系统测试
采用小米手机Mi5作为实验平台,以其自带的摄像头作为视频/图像采集设备,手机相关基本参数配置,如表1所示。
表1 实验平台软硬件参数配置
在Android系统中采用加利福尼亚理工学院万人网络脸数据库Caltech 10000 Web Faces及自带摄像头拍摄图像做为待检测图像数据集,通过静态人脸检测进行测试。测试结果如表2所示。测试效果,如图4所示。
表2 人脸检测测试结果
5 总结
本文对Android系统下人脸检测算法进行研究,实现了基于OpenCV进行二次开发的人脸检测系统?该系统合理地利用了移动平台的软硬件资源,使用OpenCV库极大减小程序的复杂度和工作量,检测效果精确,检测时间短,具有实际应用价值。
图4 人脸检测图像及结果
[1] Robert Laganière.OpenCV:计算机视觉编程攻略(第2版)[M].相银初,译.北京:人民邮电出版社,2015.
[2] Rafael Gonzalez, Richard Woods.数字图像处理(第3版)[M].阮秋琦,译.北京:电子工业出版社,2011.
[3] 王庆伟,应自炉.一种基于Haar-Like T特征的人脸检测算法[J].模式识别与人工智能,2015(1):35-41.
[4] 尚雪莲,梁传君.改进局部图结构结合加权纹理估计的人脸识别算法[J].微型电脑应用,2015,31(10):34-37.
[5] 陈国平,杜姗姗.基于深度神经网络的动态人脸识别方法及应用[J].微型电脑应用,2015,31(9):39-41.
[6] Open CV, Android Open CV Manager[EB/OL].[2016-3-1]. http://docs.opencv.org/2.4/platforms/android/service/doc/Intro.html#architecture-of-opencv-manager.
[7] 颜学龙,任文帅,马峻.基于扩展Haar特征的AdaBoost人脸检测算法[J].计算机系统应用,2015,24(9):152-155.
[8] Zhang H, Zhao L. Integral Channel Features for Particle Filter Based Object Tracking[C].International Conference on Intelligent Human Machine Systems and Cybernetics,2013: 190-193.
[9] Chang C C, Lin C J. LIBSVM: A library for support vector machines[J]. ACM Transactions on Intelligent Systems & Technology, 2011,2(3): 389-396.
[10] 卜宇,刘俊霞,唐学军.局部二值模式结合多类组LASSO算法的人脸识别方法[J].微型电脑应用,2016,32(9):15-18.
Research on Face Detection Technology for Mobile Platform by Using OpenCV
Guo Qiqing, Li Wei
(Department of Electronic and Information Engineering, Henan Polytechnic Institute, Nanyang 473000)
Collecting and detecting the face information in real time video or image promptly and accurately are the foundation of face intelligent recognition system. Aiming at the defects of manual recognition, OpenCV Vision development library is used to establish a real-time face detection system based on Android mobile platform. It proposes the design and implementation method of the system, and gives the software program solution. Test results show that the system has high real-time performance, fast detection speed and high accuracy, the system realizes effectively face detection in the mobile environment.
Feature extraction; OpenCV; Face detection; Cascade classifier
郭奇青(1983-),女,河南省南阳市人,硕士,讲师,研究方向:计算机应用、系统工程数据处理。 李伟(1982-),男,河南省南阳市人,硕士,工程师,研究方向:智能交通系统、物联网技术。
1007-757X(2017)08-0051-03
TP391.41
A
2017.02.08)