APP下载

一种基于AdaBoost人脸检测算法在Android平台的实现

2014-03-28安恒煊张学习李超陈文辉邹兵

电子设计工程 2014年8期
关键词:特征值人脸矩形

安恒煊,张学习,李超,陈文辉,邹兵

(1.广东工业大学自动化学院,广东广州510006;2.北京航天航空大学北京100191)

人脸检测技术是对输入的图像进行检测并判断是否包含人脸,并且能够准确返回人脸出现的位置的一种计算机自动检测技术[1],目前的人脸检测技术主要分为两大类,一类是基于几何特征的人脸检测方法,另外一类是基于统计理论的检测方法。基于几何特征的人脸检测方法又可分为3种:基于先验知识方法、基于特征不变方法、基于模板的方法。传统的android人脸检测技术,是通过基于特征不变的方法来实现的,根据已知的形态学相关知识找出人脸的特征如眼睛、鼻子、嘴等相关区域,然后再进行人脸判断[2]。根据已知的形态学来来检测人脸,比如通过定位双眼位置来检测人脸。指定双眼来检测人脸存在主观问题,如人戴眼镜多数情况下会影响人脸检测的效果。而王延江等利用肤色特征方法将图像分割成多个候选区域[5],然后对分割出来的候选区域使用小波分解以提取出相关人脸特征并进行分析,然后根据分析结果来判断该区域是否包含人脸信息,此方法在复杂的环境下易出现很大的漏检率。Viola P等[3-4]于2001年提出的基于Boosting方法是一个实时人脸检测系统。他们首先用“积分图”提高了图像特征计算的速度,增加了系统运行效率。然后采用了AdaBoost方法对提取的特征值进行选择,形成了多个弱分类器并按照各个分类器的权重组合成一个最终得强分类器,这样能适应多种复杂的环境,检测效果好,OpenCV现提供C、C++、Python通用编程接口,其开放性和实用性得到了大量从事计算机视觉研究和软件开发人员的青睐[5-6]。本文将基于OpenCV开发的基于统计理论AdaBoost算法成功的移植到了Android系统中,经过测试,取得了较好的效果。

1 AdaBoost人脸检测算法

在计算机视觉的目标检测中,主要都是基于如下图所示的过程[7]:

图1 视觉目标检测过程Fig.1 Visual target detection process

在上面的过程中,特征提取和分类器分类是整个检测过程的核心部分。图像的采集一般都是通过传感器等设备获得原始图片,然后经过预处理,预处理的目的是为了更好地进行特征提取,而特征提取中,首先要考虑提取什么样的特征,接着需要考虑使用何种分类算法将特征分开并进行分类,特征选取和特征计算在AdaBoost人脸检测算法占有重要地位,这也决定了AdaBoost算法的运行速度[8-9]。

1.1 特征与特征值计算

基于像素的人脸检测的算法计算成本较高,Haar特征是基于"块"的特征,能够降低计算成本,本文主要采用Haar特征,用来进行特征提取,并且采用积分图的方式来计算特征值,由于采用了积分图,能够在常规时间算出每一个特征值,运算效率大大增加。

1.1.1 矩形特征

矩形特征值的定义为两个不同矩形区域像素和之差,有以下常见的3种特征类型:2-矩形特征、3-矩形特征、4-矩形特征[10],分别对应如下各图,如图。

图2 矩形特征模板Fig.2 Rectangular feature templates

根据上述定义,上图2中的A,B,D的特征值计算公式:

C图较于A,B,D不同,计算如下:

在上式(1)(2)中,将黑色区域像素和乘以2,主要是为了使两种矩形区域中像素数目一致。在进行特征提取时,可以通过改变特征模板的大小与所处的位置,就可以获取很多的特征值。单个矩形特征的计算是非常简单与快速的[11]。由于需要各类原型特征模板及多种尺度在图像区域的各个位置进行计算,从而导致了特征数量的总量相当大,这势必会带来非常大的计算量。假设W,H分别为图像窗口的宽度和高度,X=[W/w],Y=[H/h],那么对于矩形特征的原型,其特征数量的计算如下:

根据公式,在人脸检测过程中,一个2424的图像窗口,特征总数可以超过110 000多个。这将导致后续的检测速度很慢,所以Viola等人提出来积分图的概念。

1.1.2 积分图

Viola等人在2004年提出了积分图的概念[12],加快了矩形特征值的计算速度。积分图像的定义为:某个像素点的积分图为图像原点到该点的矩形区域内的所有像素值之和。另外,在计算积分图的时候,所使用的像素值为图像的灰度值,如果图像为彩色图像,则需要对彩色图像进行灰度变换。

矩形的积分图像公式定义如下:

图3 垂直矩形积分图像Fig.3 Vertical rectangular integral image

其中I(x′,y′)为图像在点(x′,y′)处的灰度值,图像I的积分图可以使用递推公式计算:

其中s(x,y)表示为列积分,其意义表示的是图形点(x,y)及其在y方向上所有图像点的灰度值之和。可以肯定为:

在使用积分图的表示方法下,特征值的计算只和图像的端点有关。所以不管特征矩阵的位置如何,只要遍历图像一次,就可以求得所有图像子窗口的特征值。

2 AdaBoost分类器

目前在实际中应用的人脸检测方法多为基于AdaBoost学习算法的方法。该方法在检测人脸时实时性比较强,检测率也比较高。本文主要采用AdaBoost算法在Android系统上实现人脸检测。

AdaBoost算法是由Freund和Schapire在1995年提出来的[13],其核心思想是通过训练获得多个弱分类器,然后把弱分类器按照一定的权重加权构成强分类器。下面是AdaBoost算法过程:

给定样本图像集合(x1,y1),(x2,y2),…,(xn,yn),其中x表示所取样本的空间,而y表示每个样本所对应值,n表示样本的个数。在该系统中y的值代表正负样本,其中yi=1表示正样本,yi=0表示负样本。

1)初始化m个正样本以及l个负样本的权重。每个正样本的权值在初始都一样每个负样本的权重为

2)设置循环迭代次数T。

3)对每一轮迭代t=1,…,T都做以下步骤:

①首先归一化权重,使得所有权重能够符合相应的概率分布,

②然后针对特征值j训练其分类器hj。并把计算其评价误差,即该分类器对样本进行正确分类与错误分类加权和,其公式如下:

③然后从其中选择出具有最小加权分类误差的分类器ht,其对应的加权分类误差为εt。

④然后对每个样本都进行更新权重的操作,其公式如下:

参数的含义为:当样本xi被分类器ht正确分类时,参数ei=0,而若其被错误分类时

4)最终将输出强分类器,其公式为:

3 系统实现

本实验是在Android模拟器上面开发,并且进行真机的人脸检测,所以首先需要介绍Android应用的开发工具等,在训练好分类器后,就需要使用该分类器来进行系统的实现。人脸检测的模块主要是设置分类器,然后获取图像数据,并向底层传递,底层图像进行图像数据的判断,并返回人脸检测信息。

图4 人脸检测流程图Fig.4 The flow chart of face detection

3.1 系统开发环境搭建

由于Android的上层开发工具是Java语言,在Windows xp系统下,需要配置三个Java开发工具:Eclipse IDE,Java JDK和Android SDK。Opencv是面向C接口的,这里就牵涉到了Java与C/C++的混合编程了,这里借助Android NDK编写本地代码,Android NDK需要在Linux环境下运行,故本文采用Ubuntu9.1系统开发环境。本系统所使用的软件资源如下:

系统环境:Ubuntu9.1,OpenCV

SDK:Android SDK2.3.1

NDK:Android NDK

开发环境:Eclipes3.5+JDK2.0+Android ADT

开发环境搭建步骤:

1)下载安装java SDK,版本为SDK1.6。

2)下载Android NDK,并配置NDK开发环境。

3)配置Eclipse开发环境,下载并解压Eclipse3.5,设置好开发环境后,下载Android ADT插件。

3.2 OpenCV编译移植

在Opencv的3个cv,cvaux,cxcore的功能模块中,与图像界面相关的模块是highgui模块,如果需要将Opencv编译到Android中,需要用到Android中的NDK,Android NDK是一个交叉编译工具,开发者自己需要根据实际情况手动编译Android.mk文件。这里采用GCC对Android ndk实行交叉编译,GCC需要在Linux环境下运行,故本文采用Ubuntu 9.1,NDK版本为android-ndk-r4-linux。编译时需要手动配置androi.mk,其文件格式如下:

LOCAL_PATH:=$(call my-dir)

include$(CLEAR_VARS)

LOCAL_MODULE:=OpenCV

LOCAL_SRC_FILES:=

cxalloc.cpp

cxarithm.cpp

cxarray.cpp

cxcmp.cpp

cxconvert.cpp

cxcopy.cpp

cxdatastructs.cpp

cxdrawing.cpp

cxdxt.cpp

cxerror.cpp

cximage.cpp

cxjacobieigens.cpp

cxlogic.cpp

cxlut.cpp

include$(BUILD_SHARED_LIBRARY)

其中,里面的LOCAL_MODULE关键字是指开发者最后生成的一个LOCAL_SRC_FILES,在Linux系统下,键入./ndk命令后,在工程目录下会自动产生一个/libs/armeabi的文件夹,编译时的.so文件就放入这个文件夹中。

3.3 人脸样本创建

在人脸检测中,样本的选择对于创建分类器有非常大的影响,如果选取的样本足够丰富,对于训练的结果就比较好。如果选取不当,就会严重影响后面的检测效果。训练样本分为正例样本和反例样本,其中正例样本是指待检测的目标样本(如人脸或者手势)反例样本可以指其他任意的图片,在本系统中,使用的是MIT人脸库,其中样本总数为7 087个,人脸样本数有2706个,而非人脸样本数有4 381个。在MIT样本库中的人脸样图像尺寸为20×20像素,在正样本集合中都是正面的人脸,而且还有同一个人在不同光照条件下的样本。非人脸样本尺寸和人脸样本相同,是从图像中随机自动截取的。如图5,负样本来自任意图片,这些图片都没有包含目标特征,如图6人脸正样本包括基本的目标特征。

图5 人脸负样本Fig.5 Face the negative samples

图6 人脸正样本Fig.6 Face the positive samples

4 实验结果及分析

本实验通过与android自带的人脸库进行比较,系统的自带的人脸检测类FaceDetector,该类主要是采用模板匹配的方法,通过双眼来检测人脸的位置,但是无法检测到人的嘴和侧脸信息,并且戴上眼镜会影响检测效果,通过对系统FaceDetector进行单人脸检测,发现检测率也不是很高,而且当戴上眼镜时,根本无法检测到人脸。

图7 Android系统人脸检测Fig.7 The Android system face detection

本系统主要是通过输入静态图片进行人脸检测,并查看系统检测检测效果。本系统的简单背景下单人脸图片检测如图8。对比系统检测如图8,人脸检测只检测到了人脸的一部分,本系统人脸检测完全检测到人脸。

图8 本系统人脸检测Fig.8 The face detection system

对有眼镜的图片,检测率也比较高。当人戴眼镜时,系统检测检测不出人脸,而本系统对戴眼镜的人脸也能够检测得到。

图9 戴眼镜的人脸检测Fig.9 Face detection with a pair of glasses

本系统与系统自带的人脸检测用MIT人脸库进行对比检测,检测结果如下表,通过MIT人脸库的测试以及自制图片的测试,通过158张626个人脸进行检测,本系统达到91.69%的人脸检测率。对比与Android系统自带的人脸检测功能,本系统有非常大的改进,能够适用于多种应用环境。

表1 两系统检测比较Tab.1 The two system s test comparison

5 结论

目前的人脸检测大多数是基于PC机处理,而本文中将AdaBoost算法成功移植到Android平台上,达到了较高的检测水平。使得AdaBoost算法实现了跨平台应用。经过实验证明,AdaBoost算法在Android平台上,比Android系统自带的人脸检测,检测效率高,能适用多种复杂环境。

[1] 梁路宏,艾海舟,徐光祜,等.人脸检测研究综述[J].计算机学报,2002,25(5):449-458.LIANG Lu-hong,AI Hai-zhou,XU Guang-you,et al.A survey of human face detection[J].Chinese Journal of Computers,2002,25(5):449-458.

[2] P Graf,et al.Locating Faces and Facial Parts[J].Proc.1st Int’l Workshop Automatic Face and Gesture Recognition,1995:41-46.

[3] Viola P,Jones MJ.Rapid Object Detection using a Boosted Cascade of Simple Features[J].Computer Vision and Pattern Recognition,2001(1):8-14.

[4] Viola P,Jones MJ.Robust Real-Time Face Detection.InternationalJournalofComputerVision.2004,57(2):137-154.

[5] Gray Bradski,Adrian Kaebler.Learning OpenCV:Computer Visionwith theOpenCVLibrary[M].USA:OReillymedia,2008.

[6] Willow Garage.OpenCV wiki[EB/OL].[2012-05](2012-07-01).http://opencv.willowgarage.com/wiki/Welcome.

[7] Vadakkepat De Silva L C,et a1.Multimodal Approach to Human-Face Detection and Tracking[J].IEEE Transactions on Industrial Electronics,2008,55(3):385-393.

[8] 黄超,谢康林,杜平.基于AdaBoost的快速人脸跟踪算法[J]计算机工程,2000,0(z1):373-374.HUANG Chao,XIE Kang-lin,DU Ping.A fast face tracking algorithm based on powerfhl adaboost[J].Computer Engineering,2000,30(z1):373-374.

[9] 千海川,张立明.一种新的AdaBoost快速训练算法[J].复旦学报,2004,43(1):27-33.QIAN Hai-chuan,ZHANG Li-ming.A novel fast training algorithm for adaboost[J].Journal of Fudan University,2004,43(1):27-33.

[10] E Osuna,Freund,and F.Girosi Training Support Vector Machines:An Application toFaceDetection[C]//Proc.IEEEConf.Computer Vision and Pattern Recognition,1997:130-136.

[11] B.Heiselet,T Serre,MPontil,et al.Component-based Face Detection[C]//Proc IEEE Computer Society Conference on Computer Vision and Pattern Recognition,2001:657-662.

[12] Viola P.,Jones M.J.Robust Real-Time Face Detection International[J].Journal of Computer Vision,2004,57(2):137-154.

[13] Meynet J,Popovici V,Thiran J P.Face detection with boosted Gaussian features.Pattern.Recognition,2007(40):2283-2291.

猜你喜欢

特征值人脸矩形
一类内部具有不连续性的不定Strum-Liouville算子的非实特征值问题
一类带强制位势的p-Laplace特征值问题
有特点的人脸
一起学画人脸
单圈图关联矩阵的特征值
两矩形上的全偏差
化归矩形证直角
三国漫——人脸解锁
从矩形内一点说起
基于商奇异值分解的一类二次特征值反问题