APP下载

基于openCV的人脸检测系统的设计

2012-02-15陈志恒姜明新

电子设计工程 2012年10期
关键词:级联人脸分类器

陈志恒,姜明新

(大连民族学院 辽宁 大连 116600)

随着计算机与数字信号处理技术的高速发展,人脸检测技术在众多领域得到广泛应用。人脸检测技术是指在视频或图像中检测出现人脸位置、大小的过程。作为人脸信息处理中的一项关键技术,人脸检测技术已经超出了其它人脸识别模式的应用范畴,在视频处理,图像处理,身份验证,安全监测等方面有着重要的应用价值。随着计算机语言算法的发展,近年来出现了大量的人脸检测的算法,其中,能够较好的解决人脸的检测速度与检测效果的算法,是在2001年由Paul Viola和Michael Jones首先提出的Adaboost算法。openCV[1]是由Intel提供的一系列包括C与C++的提供计算机视觉和图像处理的开源软件包,它为视频或图像处理搭建了很好的软件平台。本系统就是基于openCV,利用Adaboost算法设计的一个简单的人脸检测系统,该系统能够快速、准确的检测到图像或视频中的人脸。

1 AdaBoost人脸检测算法

对人脸检测的研究最初可以追溯到20世纪 70年代,早期的研究方向与现在的研究方向与方法不同。目前在实际中应用的人脸检测方法较为普遍的是基于 Adaboost算法的方法。

Viola的人脸检测方法是一种基于积分图、级联分类检测器和Adaboost算法的方法,方法框架可以分为以下3大步骤:

1)使用Haar-like特征表示人脸,使用“积分图”实现特征数值的快速计算;

2)使用Adaboost算法挑选出一些最能代表人脸的矩形特征(弱分类器),按照加权投票的方式将弱分类器构造为一个强分类器;

3)将得到的若干强分类器串联组成一个级联结构的层叠分类器,训练得到的强级联结构能有效地提高分类器的检测速度。

1.1 Haar-like特征

haar特征是基于灰度图,首先通过大量的具有比较明显的haar特征(矩形)的物体图像用模式识别的方法训练出分类器,分类器是个级联的,每级都以大概相同的识别率保留进入下一级的具有物体特征的候选物体,而每一级的子分类器则由许多haar特征构成(由积分图像计算得到,并保存下位置),有水平的、竖直的、倾斜的,并且每个特征带一个阈值和两个分支值,每级子分类器带一个总的阈值。识别物体的时候,同样计算积分图像为后面计算haar特征做准备,然后采用与训练的时候有物体的窗口同样大小的窗口遍历整幅图像,以后逐渐放大窗口,同样做遍历搜索物体;每当窗口移动到一个位置,即计算该窗口内的haar特征,加权后与分类器中haar特征的阈值比较从而选择左或者右分支值,累加一个级的分支值与相应级的阈值比较,大于该阈值才可以通过进入下一轮筛选。当通过分类器所有分类级的时候说明这个物体以大概率被识别。常用的Haar-like特征有线性特征,边缘特征,中心特征。

图1 Harr-like特征Fig.1 Harr-like features

特征值是指图像上两个或者多个形状大小相同的矩形内部所有像素灰度值之和的差值,例如在边缘特征中,特征值的计算公式为:

1.2 积分图

由于训练样本通常有近万个,并且矩形特征的数量非常庞大,如果每次计算特征值都要统计矩形内所以像素之和,将会大大降低训练和检测的速度。因此引入了一种新的图像表示方法——积分图像特征的特征值计算法,该方法只与此特征矩形的端点的积分图有关,所以不管此特征矩形的尺度变换如何,特征值的计算所消耗的时间都是常量。这样只要遍历图像一次,就可以求得所有子窗口的特征值。积分图[2]定义为:

其中 I(x′,y′)为图像在点(x′,y′)处的像素值。 为了节约时间,减少重复计算,则图像I的积分图可按如下递推公式计算:

这样就可以进行任意矩形区域内像素积分运算。由图像的积分图可快速地计算图像中任意矩形内所有像素灰度积分。如图2所示,点1的积分图像的值为(其中Sum为求和):

图2 特征和计算Fig.2 The sum of features

同理,点2、点3、点4的积分图像分别为:

矩形区域D内的所有像素灰度积分可由矩形端点的积分图像值得到:

1.3 Adaboost算法基本原理

Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。其算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。将修改过权值的新数据集送给下层分类器进行训练,最后将每次训练得到的分类器最后融合起来,作为最后的决策分类器。使用Adaboost分类器可以排除一些不必要的训练数据特征,并将关键放在关键的训练数据上面。

Adaboost算法中不同的训练集是通过调整每个样本对应的权重来实现的。开始时,每个样本对应的权重是相同的,即其中 n为样本个数,在此样本分布下训练出一弱分类器。对于分类错误的样本,加大其对应的权重;而对于分类正确的样本,降低其权重,这样分类错的样本就被突出出来,从而得到一个新的样本分布。在新的样本分布下,再次对弱分类器进行训练,得到弱分类器。依次类推,经过 T次循环,得到 T个弱分类器,把这T个弱分类器按一定的权重叠加(boost)起来,得到最终想要的强分类器。

Adaboost[3]的具体算法如下:

设输入 的 n 个 训练 样本为:{(x1,y1),(x2,y2)......(xn,yn)},其中xi是输入的训练样本,yi∈{0,1}分别表示正样本和负样本,其中正样本数为l,负样本数为m。n=l+m,具体步骤如下:

1)初始化每个样本的权重;

2)对每个 t=1,...,T(T 为弱分类器的个数)

①把权重归一化为一个概率分布:

如此使得ωt为一个概率分布。

② 对每个特征f,训练一个弱分类器hj,计算对应所有特征的弱分类器的加权错误率

③ 选取最佳的弱分类器ht(拥有最小错误率):θt

④按照这个最佳弱分类器,调整权重:

其中θi=0表示被正确的分类,ei=1表示被错误的分类,当错误分类时:

3)最后的强分类器为:

1.4 级联分类器

级联分类器是由多个强分类器级联而成的,其中,每一层均有Abadoost算法训练得到的强分类器构成,第一层分类器得到疑似人脸的正确结果后,触发第二层进行分类,当第二层分类器得到疑似人脸的正确结果后,触发第三层进行分类,依次类推,最后确定疑似人脸的图像就确认为人脸。反之,当触发到某一层时,分类器得到的结果是非人脸时,就立即停止对图像的检测。级联分类器的结构类似于金字塔,如图3所示,通过级联分类器,可以很对人脸做出检测。由于本系统较为简单,所以只用到了4级强分类器构成级联分类器。

图3 金字塔结构Fig.3 The structure of Pyramid

2 人脸检测系统

2.1 系统界面

基于VC++6.0搭建的人机界面,如图4所示,该系统主要由3个部分组成,视频成像区,检测区,和菜单区。视频成像区主要是基于摄像头获取的图像进行显示,检测区主要是基于视频头中的人脸和静态图像中的人脸的检测,并在左上方显示出检测到的人脸的图像,菜单区是主要实现基于摄像头视频和静态图像中人脸检测的操作。在视频成像区下方,有 detect(检测)选项和 run(开始)选项。

图4 人脸检测系统界面Fig.4 The interface of face detection system

2.2 人脸检测的软件实现方法简介

2.2.1 系统流程

该系统可分为两个模块,静态图像人脸检测和视频图像中的人脸检测。

基于静态图像的人脸检测流程大致可分为4个过程(如图5所示):1)加载已经训练好的分类器;2)将其转化为计算机可以识别的内部格式;3)加载该图片以进行检测;4)显示检测结果到检测区。

图5 基于静态图像的人脸检测流程Fig.5 Flow chart of face detection based on static image

基于视频图像的人脸检测主要流程为:1)摄像头提取图像;2)加载已训练好的级联分类器并将图像其转化为内部各式;3)判断检测标志位,若为真,首先捕获当前一帧并创建该帧图像,然后载入当前一帧图像,并对图像的人脸区域进行检测,反之,结束检测;4)将检测到的结果显示到检测区。

2.2.2 openCV人脸检测主要函数

openCV软件包中提供了丰富的基于图像和视频处理的视觉类库[4],该系统主要用到的函数[5]有:

1)cascade=(CvHaarClassifierCascade*)cvLoad (cascade_name,0,0,0); 该函数试下去呢载入级联分类器的功能,其中,cascade_name为级联分类器的路径。

2)CvMemStorage*storage=cvCreateMemStorage(0);该函数创建一个默认大小为64 kB的内存块并返回指向块首的指针。

3)CvSeq*faces=cvHaarDetectObjects(small_img,cascade,storage,1.1,1,0,cvSize(40,40));该函数的功能是使用训练好的级联分类器在图像中找到包含人脸目标的矩形区域,并将这个区域作为一个矩形框返回。

4)cvRectangle(img,LeftPoint,RightPoint,color,2,7,0);该函数实现对检测到的人脸区域用方框标记出来。

5)获得被检测到的人脸后,要对图像进行包括图像色彩转换、图像大小变换和直方图均衡化等相关处理,方可把检测到的人脸显示在检测区中。相关的函数包括:cvCvtColor(img,gray,CV_BGR2GRAY); 该函数是对图像进行色彩转换。 cvResize(gray,small_img,CV_INTER_LINEAR);该函数是对图像的大小进行变换。cvEqualizeHist(small_img,small_img);该函数的作用是对灰度图像直方图的均衡化。

6)对于视频图像的人脸检测来说,还需要从电脑上的摄像头读取视频,openCV提供很好的实时视频采集,cvCapture*cvCaptureFromCAM (int 1);该函数的功能是对摄像头(个数为1)打开进行定义。

2.3 制作级联分类器

制作分类器[6]需要制作正样本文件和负样本文件。负样本可以来自于任意的图片,但这些图片不能包含目标特征。负样本由背景描述文件来描述。背景描述文件是一个文本文件,每一行包含了一个负样本图片的文件名(基于描述文件的相对路径),该文件创建方法如下:采用Dos命令生成样本描述文件。具体方法是在Dos下的进入你的图片目录,比如我的图片放在D:facedetect egdata中,则:按Ctrl+R打开Windows运行程序,输入 cmd,打开DOS命令窗口,输入 d:回车,再输入cd D:facedetect egdata进入图片路径,再次输入dir/b>negdata.dat,则在图片路径下生成一个negdata.dat文件,打开该文件将最后一行的negdata.dat删除,这样就生成了负样本描述文件。对于正样本文件,通常的做法是先把所有正样本裁切好,并对尺寸做规整。由于HaarTraining训练时输入的正样本是vec文件,所以需要使用openCV自带的CreateSamples程序,将准备好的正样本转换为vec文件。正、负样本创建之后,接下来要训练分类器,这个过程是由haartraining程序来实现的。该程序源码由openCV自带,且可执行的程序在openCV安装目录的bin目录下。训练结束后,会在目录data下生成一些子目录,即为训练好的分类器。用performance.exe进行样本的测试训练,最终生成xml文件。

3 测试结果

在个人用的笔记本电脑上进行视频图像中的人脸检测和图片中的人脸检测的测试,得到程序测试图如图6和图7所示。结果表明,基于openCV的简单的人脸检测系统,可以快速的从视频或静态图像中检测到人脸,在检测区将人脸用方框标记,并在检测区左上方显示出检测到的人脸。

图6 基于摄像头视频的人脸检测结果Fig.6 Result of face detection based on camera video

4 结束语

文中简要阐述了在Adaboost人脸检测算法的基础上,采用级联分类器的方法检测动态视频和静态图像中人脸,在检测区对人脸进行标记,并对结果进行了分析。分析结果显示,采用计算机视觉类库openCV实现基于Adaboost算法的人脸检测,具有检测速度快,检测结果准确,实时性强等优点,且实现的方法简单实用。文中所阐述的基于openCV的简单人脸检测系统可用于其他人脸识别与实时监控的软件系统开发。

图7 基于静态图片的人脸检测结果Fig.7 Result of face detection based on static image

[1]Ary Bradski,Adrian Kaebler.学习OpenCV[M].北京:清华大学出版社,2009.

[2]黄文杰,陈斌.一种快速图像处理的积分方法[J].计算机应用,2005,25(1):266-268.HUANG Wen-jie,CHEN Bin.A fast image process of integration method[J].Computer Applications,2005,25 (1):266-268.

[3]崔晓青.基于AdaBoost算法的人脸检测人系统的研究与实现[D].长春:吉林大学计算机科学与技术学院,2008.

[4]郭磊,王秋光.Adaboost人脸检测算法研究及OpenCV实现[J].哈尔滨理工大学学报,2009,14(5):123-126.GUO Lei,WANG Qiu-guang.Research of face detection based on Adaboost algorithm and openCV implementation[J].Journal of Harbin University of Science and Technology,2009,14(5):123-126.

[5]陈胜勇,刘胜.基于OpenCV的计算机视觉技术实现[M].北京:科学出版社,2008.

[6]唐徙文,曾义.人脸检测级联分类器快速训练算法[J].计算机仿真,2007,24(12):324-327 TANG Xi-wen,ZENGYi.An improved algorithm for constructing cascade classifier based on adaboost[J].Computer Simulation,2007,24(12):324-327.

猜你喜欢

级联人脸分类器
有特点的人脸
一起学画人脸
三国漫——人脸解锁
基于实例的强分类器快速集成方法
级联LDPC码的STBC-OFDM系统
加权空-谱与最近邻分类器相结合的高光谱图像分类
结合模糊(C+P)均值聚类和SP-V-支持向量机的TSK分类器
基于级联MUSIC的面阵中的二维DOA估计算法
长得象人脸的十种动物
基于LLE降维和BP_Adaboost分类器的GIS局部放电模式识别