很早之前就做过一些关于人脸检测和目标检测的课题,一直都没有好好总结出来,趁着这个机会,写个总结,希望所写的内容能给研究同类问题的博友一些见解和启发!!博客里面涉及的公式太繁琐了,直接截图了。
转载请注明出处:http://blog.csdn.net/adong76/article/details/8121845
一 人脸检测之问题概述
人脸检测是CV领域的一个经典课题,很多学者对人脸检测做了深入的研究,但真正的分水岭却是在2001年viola等大神发表的那篇经典之作Rapid Object Detection using a Boosted cascade of simple features,这篇文献提出的每一个成果都极大的改进了人脸检测的效果和处理时间,使得人脸检测进入实用阶段。
在这里我想说下,网上或是一些人写的文章,将人脸检测和人脸识别两个概念混为一谈,人脸检测指的是在一系列背景图像中其中的人脸图像,至于这个人脸是谁的人脸,我们无须确定;而人脸识别,则是在有限人脸范围内,比如说现在一个部门有10个人,现在要做自动打卡签到,摄像机检测到一张人脸,需要判断这张人脸属于这10人中的哪一位的人脸,这个判断过程就是人脸识别过程。人脸检测和人脸识别应该属于两个问题,说白了人脸检测探讨的人脸的共同特征与非人脸的共同特征的差异性,人脸识别探讨的是不同类型的人脸之间的差异性。
opencv中现在已经有比较理想的人脸检测源码和xml文件,当然如果你只是要检测出人脸或是其它的特定目标,你可以直接利用OPENCV中的xml文件或者训练自己的xml文件,opencv分类器的训练这一块网上介绍的方法太多了,关于opencv训练器和检测器的博客,我会在另外一篇博客中写的,毕竟自己也在opencv中做过些工作,还是遇到了一些问题,希望可以和大家交流一下。opencv中的人脸检测模块,现在使用的特征有两种haar和LBP,关于这两种特征提取的方法,我在接下面的博客会详细介绍。
二 人脸检测之特征提取
特征提取是整个计算机视觉和模式识别最基本也是相当关键的一步,曾看到有位仁兄的说法,特征提取是CV领域最难的一部分。做过图像处理、模式识别的的人都知道,这个领域的很多问题都是在不停地找特征,然后根据这些特征做某种判决。对于目标检测来说,无论用什么办法,最终都是通过某些特征和某些方法来判决目标或是背景,这其实是一个信号检测的过程(信号检测与估计这门基础课还是蛮重要的,童鞋们有机会好好学下)。
好了,废话少说了,谈到人脸的特征,最先使用haar特征做人脸检测的还是2001年的viola,使用类似haar小波的矩形框来提取人脸图像的局部特征。Haar特征如下图:
图2-1 Viola使用的haar特征
上面的这些都是典型的矩形特征,后来Rainer Lienhart和Jochen Maydt用对角特征扩展haar特征,即haar-like特征
如图2-1所示:
图2-2 扩展的haar_like特征
矩形特征对一些简单的图形结构,比如边缘、线段比较敏感,但是其只能描述特定走向(水平、垂直、对角)的结构,因此比较粗略。图2-3为viola文献中给出人脸部分特征分析图,脸部一些特征能够由矩形特征简单地描绘,例如,通常,眼睛要比脸颊颜色更深;鼻梁两侧要比鼻梁颜色要深;嘴巴要比周围颜色更深。
图2-3 矩形特征人脸示例
给出了这么多的矩形特征,到底改如何使用了?下面介绍特征的计算方法和积分图。积分图(Integral Image)主要的思想是将图像从起点开始到各个点所形成的矩形区域像素之和作为一个数组的元素保存在内存中,当要计算某个区域的像素和时可以直接索引数组的元素,不用重新计算这个区域的像素和,从而加快了计算。积分图能够在多种尺度下,使用相同的时间来计算不同的特征,因此大大提高了检测速度。
图2-4 积分图
对于图像img中任意一点p(x,y),其积分图值f(x,y)为包含这个点左上角的所有像素灰度值之和,可以利用以下等式计算:
利用积分图计算特征值:一个区域的像素值,可以利用该区域的端点的积分图来计算,如图2-4所示,ii(1)表示区域A的像素值,ii(2)表示区域A+B的像素值,ii(3)表示区域A+C的像素值,ii(4)表示区域A+B+C+D的像素值。而区域D的像素值=ii(1)+ii(4)-ii(2)-ii(3),由此,可用积分图快速得到一个区域的像素值。图2-4 利用积分图计算特征值。
通过积分图可以方便地得出任意矩形区域的灰度和值,以Viola使用的haar特征为例。对于图2-5中的A, B这类特征,特征数值计算公式为:v=Sum(白) – Sum(黑),而对于C,D来说,计算公式如下:v=Sum(白)-2*Sum(黑),之所以将黑色区域像素和乘以2,是为了使两种矩形区域中像素数目一致,其它的haar特征计算方法类似。
图2-5 haar矩形特征计算
上面的这些矩形可以称为特征模板,特征模版可以在24X24的图像窗口内以“任意”尺寸、“任意’’放置,每一种形态称为一个特征。假设训练或检测窗口大小为Width x Height个像素,w , h分别为特征原型的长、宽,所示四种特征原型对应的w /h分别为:2/1,1/2,3/1,2/2。 假定图像的大小为24x24,那么Width=24,Height=24,改变各个模版的w和h的大小和位置就可以得到不同的矩形了,每一个矩形可以计算出一个特征值。这样计算出来的矩形特征数量多达160000个,这些特征联合起来就构成特征向量,构成了后面的分类器的输入组成部分。
关于24x24的图像中到底有多少个矩形特征,不同的计算方法给出的结果也不相同。以Width=24,Height=24为例,对于特征模版A而言,w的范围[2, 24],h的范围[1 , 24];对于特征模版B而言,h的范围[2, 24],w的范围[1 , 24];对于特征模版C而言,w的范围[1 24],h的范围[3 , 24];有些文献认为w=0,或是h=0,也即一些线条特征也包括进去,个人认为线条特征已经失去了原本的矩形特征在人脸上的意义,另外这样计算出来的特征数目相当庞大,实际很多特征基本上没有意义的,不但加重了后面的分类器的负担,也使得训练效率低下。关于有多少个特征的问题,我也曾今疑惑过,但我后来计算中舍弃了很多不必要的特征,减少了计算,也是加快了训练过程。
三 人脸检测之Adaboost训练
AdaBoost算法是一种分类器算法,是由Freund和Robert E.Schapire在1995年提出的,其基本思想是利用大量的分类能力一般的简单分类器(weaker classifier)通过一定方法叠加起来,构成一个分类能力很强的强分类器。理论证明,只要每个简单分类器分类能力比随机猜测要好,当简单分类器个数趋向于无穷时,强分类器的错误率将趋于零。AdaBoost用于人脸检测时,从人脸中抽取大量的一维简单特征。这些简单特征都有一定的人脸和非人脸区分性。最终系统使用数千个一维简单分类器,组合起来达到很好的分类效果。
现在常见的AdaBoost算法主要有Discrete AdaBoost,Real AdaBoostLogit AdaBoost,Gentle AdaBoost。关于这四种算法简单说明我引自 http://blog.sina.com.cn/s/blog_7632c6010100ydz2.html ,
Discrete AdaBoost是指,弱分类器的输出值限定在{-1,+1},和与之相应的权值调整,强分类器生成的AdaBoost算法;Real AdaBoost是指,弱分类器输出一个可能度,该值的范围是整个R, 和与之相应的权值调整,强分类器生成的AdaBoost算法。事实上,Discrete到Real的转变体现了古典集合到模糊集合转变的思想。
Logit和Gentle算法是由同一个人提出的,他认为adaboost实际上是一个寻优过程,然后用运筹学里的两种不同的寻优方法提出了logit和gentle,logit是自适应的牛顿法,gentle是用的牛顿步长法。作者认为,logit AdaBoost在每一轮中都使目标最优,会使训练样本的代表性下降。然后这位作者的这篇文章被几位大牛批了一遍具体见 Discussion of the Paper Additive Logistic Regression A Statistical View of Boosting by Jerome Friedman, Trevor Hastie and Robert Tibshirani
另外,值得一提的是:
1、2004年, Bo WU & Haizhou AI & Chang HUANG & Shihong LAO在Computer Society上发表文章Fast Rotation Invariant Multi-View Face Detection Based on Real AdaBoost.提出了使用Real Boost检测旋转人脸,获得了很好的效果。
2、2002年, Rainer Lienhart & Alexander Kuranov & Vadim Pisarevsky 在MRL Technical Report上
Empirical Analysis of Detection Cascades of Boosted Classifiers for Rapid Object Detection
通过实验得出结论,在人脸检测上Gentle AdaBoost的效果要好于 Discrete 和 Real,这也是Opencv里为什么要用Gentle的原因吧。
参看好多的博客些的AdaBoost,一般都是介绍Discrete AdaBoost算法,关于Discrete Adaboost算法请参看博客
http://blog.csdn.net/weixingstudio/article/details/7631241 , 我觉得介绍的比较详细,这里我主要讲我使用的Real Adaboost算法。
3.1 RealAdaBoost Classification Functions
3.1.1 RealAdaBoost概述
特征提取工作完成后,就要借助分类器合理利用这些特征选择出有效的特征,输出用于后期目标检测的参数。在模式识别领域,经典的分类方法有:PCA ANN ,贝叶斯, SVM, Adaboost。这些算法现在被广泛应用于目标的分类识别课题中。
3.1.2 Real AdaBoost算法的具体步骤如下:
在训练过程中涉及到弱分类器的选择过程,一个弱分类器就表示一个特征,能否选出这个这个弱分类器就决定于这个特征对于样本的区分性情况。那些区分性比较好的特征,在正负样本上会表现出明显的差异,就容易被选到,相应的弱分类器将被选中,这样最终的强分类器对待分类目标的判决就相当于多个特征判决。
四 人脸检测之检测人脸
4.1 cascade训练检测框架
通过上文论述的强分类器的训练过程后,就可以进行具体的目标分类检测,为了提高检测速度,Viola等人提出一种Cascade的级联检测器用于人脸检测,如图4-1示:
图 4-1 cascade训练检测示意图
五人脸检测演示
利用训练器可以训练出满足要求的人脸检测参数,利用这些参数就可以检测图像中的人脸了。效果如下: