基于OpenCV的人脸识别算法研究摘要:通过对基于Adaboost人脸检测算法的研究,利用该算法与计算机视觉类库openCV进行人脸检测系统的设计,实现了对出现在视频或图像中的人脸检测。
此外,在VC++6.0环境下实现了对一个简单的人脸检测系统软件的界面开发,该系统对人脸检测的速度较快,检测结果较为准确,可以作为其他人脸检测或人脸模式识别的系统的开发基础。
关键词:人脸检测;openCV;Adaboost;系统Face detection system design based on openCVAbstract: According to the research of Adaboost algorithm of Face Detection,people made use of the algorithms and computer vision class library openCV for the design of face detection system and achieved the target of detecting faces showing up in videos and pictures. What’s more,in the environment of VC++6.0,it achieved the development of simple Face Detection. The speed of Face Detection is very fast and the test results are accurate. It can be used as the development foundation of other face detection or face pattern recognition system.Key words: face detection;openCV;Adaboost;system1.引言随着计算机与数字信号处理技术的高速发展,人脸检测技术在众多领域得到广泛应用。
人脸检测技术是指在视频或图像中检测出现人脸位置、大小的过程。
作为人脸信息处理中的一项关键技术,人脸检测技术已经超出了其它人脸识别模式的应用范畴,在视频处理、图像处理、身份验证、安全监测等方面有着重要的应用价值。
随着计算机语言算法的发展,近年来出现了大量的人脸检测的算法,其中能够较好的解决人脸的检测速度与检测效果的算法,是在2001年由Paul Viola和Michael Jones首先提出的Adaboost算法。
openCV是由Intel 提供的一系列包括C与C++的提供计算机视觉和图像处理的开源软件包,它为视频或图像处理搭建了很好的软件平台。
本系统就是基于openCV利用Adaboost算法设计的一个简单的人脸检测系统#该系统能够快速&准确的检测到图像或视频中的人脸。
2.AdaBoost人脸检测算法对人脸检测的研究最初可以追溯到20世纪70年代,早期的研究方向与现在的研究方向与方法不同。
目前在实际中应用的人脸检测方法较为普遍的是基于Adaboost算法的方法。
Viola的人脸检测方法是一种基于积分图、级联分类检测器和Adaboost算法的方法,方法框架可以分为以下3大步骤:1)使用Haar-like特征表示人脸,使用“积分图”实现特征数值的快速计算;2)使用Adaboost算法挑选出一些最能代表人脸的矩形特征(弱分类器),按照加权投票的方式将弱分类器构造为一个强分类器;3)将得到的若干强分类器串联组成一个级联结构的层叠分类器,训练得到的强级联结构能有效地提高分类器的检测速度。
2.1 Haar-like特征haar特征是基于灰度图,首先通过大量的具有比较明显的haar特征(矩形)的物体图像用模式识别的方法训练出分类器,分类器是个级联的,每级都以大概相同的识别率保留进入下一级的具有物体特征的候选物体,而每一级的子分类器则由许多haar特征构成(由积分图像计算得到,并保存下位置),有水平的、竖直的、倾斜的,并且每个特征带一个阈值和两个分支值,每级子分类器带一个总的阈值。
识别物体的时候,同样计算积分图像为后面计算haar特征做准备,然后采用与训练的时候有物体的窗口同样大小的窗口遍历整幅图像,后逐渐放大窗口,同样做遍历搜索物体;每当窗口移动到一个位置,即计算该窗口内的haar 特征,加权后与分类器中haar特征的阈值比较从而选择左或者右分支值,累加一个级的分支值与相应级的阈值比较,大于该阈值才可以通过进入下一轮筛选。
当通过分类器所有分类级的时候说明这个物体以大概率被识别。
常用的Haar-like 特征有线性特征,边缘特征,中心特征。
图1 Harr-like特征2.2积分图由于训练样本通常有近万个,并且矩形特征的数量非常庞大,如果每次计算特征值都要统计矩形内所以像素之和,将会大大降低训练和检测的速度。
因此引入了一种新的图像表示方法——积分图像特征的特征值计算法,该方法只与此特征矩形的端点的积分图有关,所以不管此特征矩形的尺度变换如何,特征值的计算所消耗的时间都是常量。
这样只要遍历图像一次,就可以求得所有子窗口的特征值。
积分图[2]定义为:其中I(x′,y′)为图像在点(x′,y′)处的像素值。
为了节约时间,减少重复计算,则图像I的积分图可按如下递推公式计算:这样就可以进行任意矩形区域内像素积分运算。
由图像的积分图可快速地计算图像中任意矩形内所有像素灰度积分。
如图2所示,点1的积分图像的值为(其中Sum为求和):图2特征和计算同理,点2、点3、点4的积分图像分别为:矩形区域D内的所有像素灰度积分可由矩形端点的积分图像值得到:2.3 Adaboost算法基本原理Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。
其算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。
将修改过权值的新数据集送给下层分类器进行训练,最后将每次训练得到的分类器最后融合起来,作为最后的决策分类器。
使用Adaboost分类器可以排除一些不必要的训练数据特征,并将关键放在关键的训练数据上面。
Adaboost算法中不同的训练集是通过调整每个样本对应的权重来实现的。
开始时,每个样本对应的权重是相同的,即其中n为样本个数,在此样本分布下训练出一弱分类器。
对于分类错误的样本,加大其对应的权重;而对于分类正确的样本,降低其权重,这样分类错的样本就被突出出来,从而得到一个新的样本分布。
在新的样本分布下,再次对弱分类器进行训练,得到弱分类器。
依次类推,经过T次循环,得到T个弱分类器,把这T个弱分类器按一定的权重叠加(boost)起来,得到最终想要的强分类器。
Adaboost的具体算法如下:设输入的n个训练样本为:{(x1,y1),(x2,y2)......(xn,yn)},其中xi 是输入训练样本,yi∈{0,1}分别表示正样本和负样本,其中正样本数为l,负样本数为m。
n=l+m,具体步骤如下:初始化每个样本的权重;对每个t=1,...,T(T为弱分类器的个数)①把权重归一化为一个概率分布:如此使得ωt为一个概率分布。
②对每个特征f,训练一个弱分类器hj,计算对应所有特征的弱分类器的加权错误率③选取最佳的弱分类器ht(拥有最小错误率):θt④按照这个最佳弱分类器,调整权重:其中θi=0表示被正确的分类,ei=1表示被错误的分类,当错误分类时:3)最后的强分类器为:其中2.4级联分类器级联分类器是由多个强分类器级联而成的,其中,每一层均有Abadoost算法训练得到的强分类器构成,第一层分类器得到疑似人脸的正确结果后,触发第二层进行分类,当第二层分类器得到疑似人脸的正确结果后,触发第三层进行分类,依次类推,最后确定疑似人脸的图像就确认为人脸。
反之,当触发到某一层时,分类器得到的结果是非人脸时,就立即停止对图像的检测。
级联分类器的结构类似于金字塔,如图3所示,通过级联分类器,可以很对人脸做出检测。
由于本系统较为简单,所以只用到了4级强分类器构成级联分类器。
3人脸检测的软件实现方法简介3.1.1系统流程该系统可分为两个模块,静态图像人脸检测和视频图像中的人脸检测。
基于静态图像的人脸检测流程大致可分为4个过程(如图5所示):1)加载已经训练好的分类器;2)将其转化为计算机可以识别的内部格式;3)加载该图片以进行检测;4)显示检测结果到检测区。
基于视频图像的人脸检测主要流程为:1)摄像头提取图像;2)加载已训练好的级联分器并将图像其转化为内部各式;3)判断检测标志位,若为真,首先捕获当前一帧并创建该帧图像,然后载入当前一帧图像,并对图像的人脸区域进行检测,反之,结束检测;4)将检测到的结果显示到检测区。
3.1.2 openCV人脸检测主要函数openCV软件包中提供了丰富的基于图像和视频处理的视觉类库[4],该系统主要用到的函数有: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提供好的实时视频采集,cvCapure*cvCaptureFromCAM(int 1);该函数的功能是对摄像头(个为1)打开进行定义。