王斌,郭攀,张坤,黄乐
(长安大学信息工程学院,陕西西安710064)
随着计算机技术和数字信号处理技术的快速发展,计算机视觉技术逐渐应运而生,并得到了广泛的应用。OpenCV[1](Open Source Computer Vision Library)是由Intel提供的由一系列C函数和少量C++类构成的计算机视觉开源软件包,它拥有数百个可实现图像处理和计算机视觉方面的中、高层API,可以十分方便地搭建基于计算机视觉技术的静态图像和视频流处理软件平台,可作为二次开发的理想工具。由于基于Haar-like特征的AdaBoost人脸检测算法具有检测速度快、实时性强、鲁棒性好等优点,本文采用基于Haar-like特征的AdaBoost人脸检测算法和OpenCV相结合的方法在VC++6.0软件开发平台上分别对基于静态图像、摄像头视频和avi视频的人脸检测系统进行设计,实现了从静态图像中检测出人脸并标记出人脸位置、从摄像头视频中实时检测和标记出人脸的位置和从avi视频中提取检测出有人脸的帧并实时标记人脸,同时还实现了对标记后的人脸区域图像进行实时显示和存盘。
人脸检测的目的就是把静态图像或视频帧中的人脸区域和非人脸区域区分开。Viola等人提出的人脸检测方法是一种基于积分图、级联分类器和AdaBoost算法的方法,该方法可分为以下3个步骤实现[2]。
1)使用Haar-like特征表示人脸,并采用一种新的图像表示方式—“积分图”快速计算其特征值。
2)利用AdaBoost机器学习算法挑选出一些最能代表人脸的矩形特征(弱分类器)并按照加权投票的方式将弱分类器构造成一个强分类器。
3)将训练得到的若干个强分类器串联起来构造成一个级联结构的分类器,从而提高分类器的检测速度。
用一些简单的矩形特征来表示人脸特征,因其类似于Viola等人提出的Haar-like小波而得名[3]。常用的Haar-like特征有边缘特征、线性特征和中心特征,如图1所示。
图1 Haar-like特征Fig.1 Haar-like features
其中特征值是指图像上两个或者多个形状大小相同的矩形内部所有像素灰度值之和的差值,在系统中统一采用白色矩形区域所有像素灰度值之和减去黑色矩形区域所有像素灰度值之和[3]。例如,图1(b)的特征值是靠两边的矩形像素总和与中间矩形像素和的差值。也可根据实际情况扩展出多种新的Haar-like特征模板。
为了提高样本训练和人脸检测的速度,Viola等人提出了积分图的表示方法,这种方法可使矩形特征值得到快速计算。积分图的计算方法如公式(1)所示[4]:
其中I(x′,y′)为图像在点(x′,y′)处的像素值,ii(x,y)是计算后的积分图像。若采用递推公式[4](2)和(3),积分图只需遍历一次原图像所有点即可计算出来,其中s(x,y)为点(x,y)所在位置的列积分值,定义s(x,-1)=0,ii(-1,y)=0。
AdaBoost算法[5]是一种迭代算法,主要用于特征选择和训练分类器,其核心思想是针对不同的训练集训练同一个分类器(弱分类器),然后把这些在不同训练集上得到的弱分类器通过一定的方法集合起来,构成一个最终的强分类器。在该算法中不同的训练集是通过调整每个样本对应的权重来实现的。最开始的时候,每个样本的权重是相同的,在此样本分布下训练出一个弱分类器h1(x)。对于h1(x)分类错误的样本则加大其对应的权重,而对于h1(x)分类正确的样本则减小其对应的权重,从而把分类错误的样本突出出来,进而组合成一个新的样本分布。同时,根据分类错误的情况赋予h1(x)一个权重,表示该弱分类器的重要程度,分类错误的越少权重越大。在新的样本分布下,对其进行再次训练,得到弱分类器h2(x)及其权重。以此类推,经过T次循环训练得到T个弱分类器和T个对应的权重,然后把这T个弱分类器按照一定的权重叠加起来,得到最终的强分类器。
级联分类器是由多层强分类器级联而成的,也称之为级联检测器或瀑布型检测器。其每一层都是由AdaBoost算法训练得到的强分类器,第1层分类得到的正确结果触发第2层分类器的分类,第2层分类得到的正确结果再触发第3层分类器的分类,以此类推。这样疑似人脸窗口依次通过各层分类器,就确认为人脸。反之,如果被检测的窗口在某一层被判断为非人脸,就立即停止对该窗口的检测,开始进行下一个窗口的检测[5]。这种级联结构的分类器在设计时采用逐级复杂的原则来实现的,最初的几层强分类器比较简单,通常一层由一到几个弱分类器构成,这样可以快速排除掉那些明显不是人脸的子窗口,使后续检测目标越来越少,从而大大提高了检测速度。此外,为了实现搜索不同大小的目标区域,分类器被设计为可进行尺寸改变,这样可以避免直接对图像进行缩放变换,减小了计算工作量,也提高了检测速度。
级联分类器的制作可采用OpenCV自带的Haartraining程序训练实现,首先准备大量的正样本(人脸样本)和负样本(非人脸样本),然后利用OpenCV安装目录中的bin子目录下的createsamples.exe和haartraining.exe分别创建Sample和训练Sample,直到收敛为止,最后利用bin子目录下的performance.exe进行样本测试的训练,最终生成级联分类器XML文件[6]。为了快速开发出一套人脸检测系统,本文选取OpenCV自带的基于Haar-like特征的级联分类器haarcascade_frontalface_alt_tree.xml和haarcascade_profileface.xml进行实验。
采用VC++6.0搭建前台人机界面(如图2所示),该界面主要分为3个部分,分别是检测显示区、定位显示区和菜单区。检测显示区主要实现基于静态图像、摄像头视频和avi视频的人脸检测结果显示,定位显示区主要实现对标记后的人脸区域图像进行实时显示,菜单区主要实现基于静态图像、摄像头视频和avi视频的人脸检测与标记操作以及标记后的人脸区域图像的显示和存盘操作。
图2 人脸检测系统界面Fig.2 The interface of face detection system
基于静态图像的人脸检测流程如图3所示,大致可分为4个过程:1)加载训练好的级联分类器;2)将其转化为内部格式,以便被计算机识别处理;3)加载待检测的静态图像;4)检测出图像中的人脸区域并标记出人脸位置。
图3 基于静态图像的人脸检测流程图Fig.3 Flow chart of face detection based on static image
基于摄像头视频的人脸检测流程如图4所示,主要过程:1)检测并启动摄像头,如未安装摄像头将会发出警告并结束检测,因视频采集设备种类多和视频处理的实时性要求,本文采用了实时视频处理技术DirectX;2)加载已训练好的级联分类器并将其转化为内部格式;3)判断检测标志位,若为真,首先捕获当前一帧并创建该帧的图像,然后载入当前一帧图像,并对图像中的人脸区域进行检测和标记,最后判断保存标志位,此时若为真则保存标记的人脸区域图像并进入下一帧的检测,否则直接进入下一帧的检测;若检测标志位为假则结束检测。
图4 基于摄像头视频的人脸检测流程图Fig.4 Flow chart of face detection based on camera video
视频可以看成是一帧一帧的图像在时间上的排列,这样视频人脸检测可看作是对一组图像序列的连续检测,因此,基于avi视频的人脸检测和基于摄像头视频的人脸检测的流程基本上是一样的,不同之处是其不需要检测启动摄像头这一步,而是进行加载avi视频,所以其流程不再赘述。
计算机视觉类库OpenCV中用于人脸检测的主要函数为:
1)cascade=(CvHaarClassifierCascade*)cvLoad(cascade_name,0,0,0);该函数实现载入级联分类器的功能,其中cascade_name为级联分类器的路径。
2)cvGrabFrame(capture);和frame=cvRetrieveFrame(capture);这两个函数一起调用实现快速获取avi视频帧。其中capture=cvCaptureFromAVI(path);读取捕获avi视频。
3)CvMemStorage*storage=cvCreateMemStorage(0);该函数创建一个默认大小为64 kB的内存块并返回指向块首的指针。
4)CvSeq*faces=cvHaarDetectObjects(small_img,cascade,storage,1.1,2,0,cvSize(30,30));该函数的功能是使用训练好的级联分类器在图像中找到包含人脸目标的矩形区域,并将这些区域作为一序列的矩形框返回。
5)cvRectangle(img,LeftPoint,RightPoint,color,3,8,0);该函数实现对检测到的人脸区域用方框标记出来。
6)cvSaveImage(savepath+strcat(strCount,".bmp"),OutImage);该函数实现把标记的人脸区域图像保存为bmp格式的图像,其中OutImage=cvCreateImage(cvSize(120,120),8,3);创建头并分配120×120大小的图像数据空间。
7)获取到被检测图像之后需要进行包括图像色彩转换、图像大小变换和直方图均衡化等相关处理后方可进行后面的人脸检测。相关处理函数如下:cvCvtColor(img,gray,CV_BGR2GRAY);色彩转换。cvResize(gray,small_img,CV_INTER_LINEAR);图像大小变换。cvEqualizeHist(small_img,small_img);灰度图像直方图均衡化。
由微软公司提供的多媒体编程接口DirectX采用C++编程语言实现,遵循COM,可以更好的构建Windows系统的机器视觉平台。该接口可直接提供开发质量高、实时的应用程序所需要的各种资源。DirectX技术优点:1)为软件开发者提供硬件无关性,即可使系统不再依赖任何特定的视频采集设备;2)为硬件开发提供策略。基于摄像头视频的人脸检测部分主要使用DirectX SDK中的DirectShow组件实现视频的实时采集和处理,它采用一种叫Filter Graph的模型来管理整个数据流的处理过程,保持兼容VFW(Video For Windows)并且提供了更加优秀的接口。通过对OpenCV和DirectShow组件的实时视频采集情况进行对比,采用DirectShow组件处理摄像头视频效果更加流畅。DirectShow组件中用于打开摄像头和处理视频的主要函数如下:
CCameraDS camera;//定义摄像类变量camera.OpenCamera(0,false,320,240));//打开摄像头IplImage*pFrame=camera.QueryFrame();//获取视频帧
本文实现了对标记后的人脸区域图像进行实时显示和存盘的功能。因软件界面有限,在定位显示区最多可实时显示被标记的前7幅人脸区域图像,如图5所示。当需要保存被标记的人脸区域图像时,点击“保存定位图像”按钮并选取保存路径,即可实现存盘功能。
在Pentium T3200 2.0 GHz CPU,1 GB内存的笔记本电脑上进行实验。对于静态图像的人脸检测,实验样本是从互联网上搜集的46张彩色图像,最小尺寸为469×447,最大尺寸为1 936×1 288,共361个人脸,其中漏检25个,误检13个,总体检测效果良好,其中一张图像检测结果如图5所示。利用笔记本电脑上自带的30万像素的摄像头拍摄的实时视频进行人脸检测,视频处理流畅,检测结果完全满足实时性需求,其中一帧检测结果如图6所示。最后,分别对从互联网上下载的avi格式视频文件U-go-girl.AVI和kissingyou.AVI进行人脸检测,流畅度和实时性均能满足需求,需要注意的是在进行人脸检测前需要安装XviD解码器方可打开这两个avi视频文件,对U-go-girl.AVI文件其中一帧的检测结果如图7所示。在实验中发现,漏检的主要原因是人脸姿态偏转角度较大造成的,因此,分类器训练权重的更新规则需要进一步的改进和完善。在人脸检测中需要注意的是静态图像的像素和视频的清晰度都不能过高,当过高时人脸检测的实时性将会大大降低,同时检测率也会有所下降。
图5 基于静态图像的人脸检测结果Fig.5 Result of face detection based on static image
图6 基于摄像头视频的人脸检测结果Fig.6 Result of face detection based on camera video
图7 基于avi视频的人脸检测结果Fig.7 Result of face detection based on avi video
本文在简要阐述基于Haar-like特征的AdaBoost人脸检测算法原理基础上,利用由AdaBoost算法训练的人脸级联分类器在计算机视觉类库OpenCV和VC++6.0平台上进行软件编程设计人脸检测系统,分别实现了基于静态图像、摄像头视频和avi视频的人脸检测与标记以及标记后的人脸区域图像实时显示和存盘,并对检测结果进行了分析和讨论。实验结果显示,采用计算机视觉类库OpenCV实现基于AdaBoost算法的人脸检测,具有检测速度快、检测率高、实时性强等优点,且实现方法简单实用,可用于实现人脸识别与跟踪、运动分析及环境的实时监控等,有较好的开发和应用前景。
[1]陈胜勇,刘盛.基于OpenCV的计算机视觉技术实现[M].北京:科学出版社,2008.
[2]苏景龙,林天威,王科俊,等.视频流下的人脸检测与跟踪[J].应用科技,2011,38(3):5-11.
SU Jing-long,LIN Tian-wei,WANG Ke-jun,et al.Face detection and tracking in video[J].Applied Science and Technology,2011,38(3):5-11.
[3]花樱,彭宏京,顾佳玲.Boosting协方差特征的人脸检测方
法[J].计算机工程与应用,2010,46(18):186-189.
HUA Ying,PENG Hong-jing,GU Jia-ling.Face detection method by boosting covariance feature[J].Computer Engineering and Applications,2010,46(18):186-189.
[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]崔晓青.基于AdaBoost算法的人脸检测系统的研究与实现[D].长春:吉林大学计算机科学与技术学院,2008.
[6]徐麒,王继成.基于视频图像的人脸检测与统计[J].计算机与现代化,2010,(1):120-123.
XU Qi,WANG Ji-cheng.Real-time face detection and statistics based on video image[J].Computer and Modernization,2010(1):120-123.