于世强,应 捷
(上海理工大学 光电信息与计算机工程学院,上海 200093)
基于Android平台的实时人脸检测与跟踪
于世强,应捷
(上海理工大学 光电信息与计算机工程学院,上海 200093)
摘要针对Android智能手机自带人脸检测功能效率低、错误率高的问题,提出了一种将OpenCV移植到Android平台的方法,在运行Android系统的嵌入式平台中使用改进的AdaBoost算法,并结合OpenCV库来实现实时人脸检测与跟踪。实验取得了高达95.05%的人脸检测准确率和50.13 ms的平均检测速率,在保证检测速度的同时比Android自带的人脸检测更具高效性和实用性。
关键词Android;OpenCV;人脸检测;AdaBoost算法
人脸检测是自动人脸识别系统[1-2]中的一个关键环节,在门禁系统、人脸跟踪和身份识别等领域得到了广泛应用。这种应用背景要求自动人脸检测系统[1]对动态的环境具有一定的适应能力,因此人脸检测与跟踪开始作为一个独立的课题受到研究者的重视。经过几十年的发展,涌现了许多人脸检测经典算法,如隐马尔科夫模型,主成分量分析法,人工神经网络[3]以及AdaBoost算法等。不同的人脸检测方法都不是绝对独立的,其之间均存在着一定的联系和自身的优越性。AdaBoost算法在人脸检测的实时性和准确性方面有着自己的优势,因而AdaBoost算法在实时人脸检测与跟踪[4-7]的研究课题中得到了广泛的应用。
近年来,以Android操作系统为代表的智能手机得到快速的发展。谷歌在2009发布NDK(NativeDevelopmentKit),允许开发者使用C/C++或移植C/C++库例如OpenCV(OpenSourceComputerVisionLibrary)到Android端来开发Android应用程序。智能手机轻量化和功能集成的优点,使得计算机视觉系统在智能手机上的应用前景更加广阔[8-9]。为此,文中提出一种脱离外部网络终端的实时人脸跟踪与检测系统,该系统所有的实验工作都在Android智能手机上完成。
1实现人脸检测与跟踪
1.1AdaBoost算法改进
AdaBoost是一种迭代算法,其核心思想是针对同一个训练集训练不同的弱分类器,然后将这些弱分类器集合起来,构成一个强分类器,强分类器的分类精度依赖于所有弱分类器的分类精度,这样可深入挖掘弱分类器算法的能力。最后将每次训练得到的强分类器最后融合起来,作为最后的决策分类器。
PaulViola和MichaelJones提出的AdaBoost算法采用了积分图计算特征值的算法[10],大幅提高了检测速度。为在提高检测速度的同时降低误检率和漏检率,本文在结合积分图算法的的基础上提出了两点改进:首先为弱分类器设定阈值,这样就避免了分类器自己寻找阈值,并在训练过程中不断调整错误样本的权重,突出错误样本以期能够最快达到阈值,大幅减少了训练和检测的时间;其次在设定不同比例的人脸搜索框,在人脸检测过程中可根据距离等实际情况选择不同大小的初始搜索框,这样可避免搜索框过大造冗余信息被采取影响检测速度,或搜索框过小导致误检或漏检。
1.2改进的AdaBoost人脸训练流程
训练样本要求是面部特写图像,将一簇训练样本大小被归一化为24×24像素,由于人脸形态千差万别,所以训练样本选取过程中要考虑到样本的多样性。训练过程分为以下步骤:
(1)Harr-like特征提取。图1为4种常用的Haar特征,在这4种特征的基础上设计出更多、更复杂的特征。Haar-like人脸特征的数量就取决于训练样本图像矩阵的大小,特征模板在子窗口内任意放置,一种形态称为一种特征。
图1 特征样子
如图2所示,眼睛区域的颜色比脸颊区域的颜色深,鼻梁两侧比鼻梁的颜色要深,这样就提取到两个Haar特征值如图2(b)和图2(c)所示。
图2 脸部Harr-like特征提取
(2)使用“积分图”实现特征数值的快速计算。积分图的主要思想是将图像从起点开始到各个点所形成的矩形区域像素之和作为一个数组的元素保存在内存中,当要计算某个区域的像素和时可以直接索引数组的元素,从而加快计算速度,大幅提高检测速度。
图3 特征值计算—积分图
矩阵A、B的值计算方法如式(1)和式(2)所示。Harr-like特征值为白色矩形减去黑色矩形的值
A=i(5)+ii(1)-ii(4)-ii(2)
(1)
B=i(6)+ii(2)-ii(3)-ii(5)
(2)
(3)训练弱分类器。AdaBoost算法中不同的训练集是通过调整每个样本对应的权重来实现的。开始时,对样本权重进行归一化
(3)
对于每个特征f,训练一个弱分类器h,计算所有特征的加权错误率
εf=∑iqi|h(xi,f,p,θ)-yi
(4)
选取具有最小错误率εf的弱分类器。对于分类错误的样本,加大其对应的权重;而对于分类正确的样本,降低其权重,这样分错的样本就被突显出来,从而得到一个新的样本分布
(5)
(6)
在新的样本分布下,再次对弱分类器进行训练。以此循环,直到达到设定阈值,得到最优弱分类器。
(4)强分类器训练。将这弱分类器叠加(Boost)起来,得到最终的强分类器
(7)
强分类器集合就构成了训练好的人脸特征库,至此训练完成,整体训练流程如图4所示。
图4 人脸分类器训练模型
1.3人脸检测系统
首先调用安卓相机对图像进行有效的扫描,根据实际情况选择相应的初始搜索窗口。然后用强分类器对捕获的图像进行判别,每级强分类器均以大概相同的识别率保留进入下一级具有物体特征的候选物体,而每一级的子分类器则由诸多Haar-like特征构成,且每个特征带一个阈值,每级子分类器带一个总阈值。跟踪检测物体时,同样计算积分图像为后续计算Haar-like特征做准备,每当窗口移动到一个位置,即计算该窗口内的Haar-like特征,加权后与分类器中的阈值比较,大于该阈值才可通过进入下一轮分类器筛选。当通过分类器所有级时,说明人脸被成功检测。
图5 人脸检测系统模型
基于Haar-like特征的人脸检测可自动对大量图片进行训练,训练结果存储为XML文件,这些级联分类器一般需要训练上千幅人脸图片和上万幅非人脸图片,训练过程耗时很长,本文在自行训练的基础上结合OpenCV中训练好的相关XML文件来实现人脸检测与跟踪。
图6 人脸检测与跟踪系统
2Android平台人脸检测的实现
2.1开发环境的搭建
本文首先采用Google官方的JDK,ADT插件和Eclipse搭建通用的Android开发环境。由于开发过程中要编写本地C/C++代码,需要Android NDK进行编译,这里采用官方版本android-ndk-r9d。只需要解压android-ndk-r9d压缩文件到任意路径,在Eclipse中NDK Location中配置解压后的android-ndk-r9d文件路径,便可实现Eclipse自动调用Android NDK编译C/C++。此外,最新OpenCV-3.0.0-android-sdk已被打包成备用的Android Library Project,将其导入Eclipse工作空间就可在项目中引用OpenCV库函数。
2.2应用程序开发
(1)在Eclipse中新建名为FaceDetection的Android应用工程并导入OpenCV最新函数库OpenCV-3.0.0-android-sdk。首先在AndroidManifest.xml对使用CAMERA的进行权限声明;再在文件夹src中新建Java类,实现对camera的使用和对帧图像数据的处理;
(2)在工程目录中新建JNI文件夹,JNI是一套可实现Java与本地代码间的互操作的双向接口,利用JNI与OpenCV接口编写本地C/C++代码,并利用Android NDK对其编译后生成供Java代码可调用的共享库。JNI目录下,还需要编写Android.mk和Application.mk两个脚本文件;
(3)在Eclipse中用Android SDK编译后,便会在bin目录中生成可发布在安卓手机上的APK文件,图7是应用程序的开发流程。
图7 安卓应用程序开发流程图
3实验结果
打开安装好的检测相机,图8是对静态图像人脸的检测结果,无论是单人脸或是多人脸图像均可成功检测。
图8 人脸检测示例图
图9是对动态图像人脸检测与跟踪的结果,在镜头中的人脸偏移和晃动时,能够实现对人脸的成功追踪,过程平滑无卡顿现象出现。
如图10所示,在距离不变的情况下,初始搜索框较大时,由于摄入过多人脸外冗余信息,未能快速实现成功检测人脸,而切换到相对较小初始搜索框时,能较快地实现人脸检测。
实际测试的初步结果显示应用程序已经能够实现人脸检测与跟踪,进一步研究人脸检测的成果,本文采取了大量的样本,分别用本文应用程序(以下称改进AdaBoost算法)和Android自带API 进行人脸检测,然后将两者的人脸检测性能进行对比。
图9 人脸跟踪示例图
图10 搜索框大小对检测结果的影响
改进AdaBoostAndroidAPI成功率95.05%88.41%漏检率3.26%8.72%误检率1.69%2.73%检测速率50.13ms48.56ms
由表1可知,改进的AdaBoost算法实现的人脸检测与Android API人脸检测相比,保证检测速度的同时取得了高达95.05%的检测成功率,在两种方法误检率差别不大的情况下,这主要得益于超低漏检率的贡献。
4结束语
通过改进的AdaBoost算法与OpenCV库的结合,本文在不使用外部网络终端的条件下实现了Android系统下的人脸检测与跟踪。大量的实验数据和测试数据表明本方法比Aandroid自带人脸检测系统取得了更好的效果,在检测的准确性和实时性两方面都取得了预期成果。相信随着Android嵌入式平台技术的高速发展和该领域研究人员的不断努力,Android人脸检测与跟踪能取得更好的研究成果。
参考文献
[1]杨元挺,李妹.基于嵌入式的自动人脸识别系统研究[J].桂林电子科技大学学报,2012,32(6):483-486.
[2]桑海峰,吴丹阳,王会.视频监控下的人脸跟踪与识别系统[J].计算机工程与应用,2014,50(12):175-179.
[3]方旭.基于BP神经网络人脸识别方法的研究与改进[J].电脑知识与技术:学术交流,2011(2): 862-863.
[4]Mingxing J,Junqiang D,Tao C,et al.An improved detection algorithm of face with combining adaboost and SVM[C].China: Control and Decision Conference(CCDC),2013.
[5]江伟坚,郭躬德,赖智铭.基于新 Haar-like 特征的 Adaboost 人脸检测算法[J].山东大学学报:工学版,2014,44(2):43-48.
[6]Li X,Zhai Y,Li X.Research and Implementation of face detection system on android smart phone[C].Xiamen: Proceedings of 2013 Chinese Intelligent Automation Conference,2013.
[7]安恒煊,张学习,李超,等.一种基于AdaBoost人脸检测算法在Android平台的实现[J].电子设计工程, 2014,22(8):126-130.
[8]李新,翟玉美,肖洪祥.Android手机中人脸检测算法的改进及实现[J].桂林理工大学学报,2014,34(1):175-179.
[9]周勇,张嘉林,王桂珍,等.Android平台下人脸识别系统的研究与实现[J].南京工程学院学报:自然科学版,2013,11(1):53-57.
[10]Viola P,Jones M.Rapid object detection using a boosted cascade of simple features[C].New York:IEEE Conference on Computer Vision and Pattern Recognition,2001.
Real-time Face Detection and Tracking Based on Android Platform
YUShiqiang,YINGJie
(SchoolofOptical-ElectricalandComputerEngineering,ShanghaiUniversityofShanghaifor
ScienceandTechology,Shanghai200093,China)
AbstractAiming at the low efficiency and high error rate from Android smartphone original face detection system, this paper proposes a method of transplanting OpenCV(Open Source Computer Vision Library) to Android platform, using improved AdaBoost algorithm combined with OpenCV Library to realize real-time face detection and tracking on embedded Android platform. The experiment achieved 95.05% detection accuracy rate and 50.13 ms average detection speed, it is more effective and practical than Android original face detection system at almost the same detection speed.
KeywordsAndroid; OpenCV; face detection; AdaBoost algorithm
收稿日期:2015- 10- 28
作者简介:于世强(1990-),男,硕士研究生。研究方向:数字图像处理。应捷(1973-),女,副教授,硕士生导师。研究方向:数字图像处理。
doi:10.16180/j.cnki.issn1007-7820.2016.07.023
中图分类号TP391.41
文献标识码A
文章编号1007-7820(2016)07-078-04