码迷,mamicode.com
首页 > 其他好文 > 详细

基于Boost方法的人脸检测(1):整体思路

时间:2016-04-30 14:23:05      阅读:337      评论:0      收藏:0      [点我收藏+]

标签:



先推荐大家看着两篇:

[2] Viola P, Jones M J. Robust Real-Time Face Detection[J]. International Journal of Computer Vision, 2004, 57(2):137-154.
[3] http://www.cnblogs.com/ello/archive/2012/04/28/2475419.html
[4] http://blog.csdn.net/xiaowei_cqu/article/details/7670703


二、Haar分类器的浅入浅出

之所以是浅入浅出是因为,我暂时深入不能,只是根据其他人的总结,我加以梳理归纳,用自己的理解阐述出来,难免会有错误,欢迎指正。

Haar分类器算法的要点如下:

① 使用Haar-like特征做检测。

② 使用积分图(Integral Image)对Haar-like特征求值进行加速。

③ 使用AdaBoost算法训练区分人脸和非人脸的强分类器。

④ 使用筛选式级联把强分类器级联到一起,提高准确率。

2.1 Haar-like特征你是何方神圣?

一看到Haar-like特征这玩意儿就头大的人举手。好,很多人。那么我先说下什么是特征,我把它放在下面的情景中来描述,假设在人脸检测时我们需要有这么一个子窗口在待检测的图片窗口中不断的移位滑动,子窗口每到一个位置,就会计算出该区域的特征,然后用我们训练好的级联分类器对该特征进行筛选,一旦该特征通过了所有强分类器的筛选,则判定该区域为人脸。

那么这个特征如何表示呢?好了,这就是大牛们干的好事了。后人称这他们搞出来的这些东西叫Haar-Like特征。

下面是Viola牛们提出的Haar-like特征。

技术分享 

下面是Lienhart等牛们提出的Haar-like特征。

技术分享 

技术分享 

技术分享 

这些所谓的特征不就是一堆堆带条纹的矩形么,到底是干什么用的?我这样给出解释,将上面的任意一个矩形放到人脸区域上,然后,将白色区域的像素和减去黑色区域的像素和,得到的值我们暂且称之为人脸特征值,如果你把这个矩形放到一个非人脸区域,那么计算出的特征值应该和人脸特征值是不一样的,而且越不一样越好,所以这些方块的目的就是把人脸特征量化,以区分人脸和非人脸。

为了增加区分度,可以对多个矩形特征计算得到一个区分度更大的特征值,那么什么样的矩形特征怎么样的组合到一块可以更好的区分出人脸和非人脸呢,这就是AdaBoost算法要做的事了。这里我们先放下积分图这个概念不管,为了让我们的思路连贯,我直接开始介绍AdaBoost算法。








【图像处理】利用积分图像法快速计算Haar特征

由于Haar特征是矩形中黑色区域所有像素值的和减去白色区域所有像素值的和。在之前(《计算Haar特征个数》)我们看到,24*24的图片中,有115984个特征,远远大于其像素个数。如果计算每个特征的像素和,计算量会非常大,而且很多次运算是重复的。

Paul Viola提出一种利用积分图像法快速计算Haar特征的方法(《Rapid object detection using a boosted cascade of simple features》)。简单说来,就是先构造一张“积分图”(Integral image),也叫Summed Area Table,之后任何一个Haar矩形特征都可以通过查表的方法(Look Up Table)和有限次简单运算得到,大大减少了运算次数。

将矩形表示为:技术分享

其中,x,y表示起点坐标,w,h表示宽,高,a表示角度。

矩形内像素值之和表示为:技术分享

0°矩形特征


构造积分图像Summed Area Table

技术分享
积分图像中,每个点存储是其左上方所有像素之和:
技术分享
其中I(x,y)表示图像(x,y)位置的像素值。
积分图像可以采用增量的方式计算:
技术分享
初始边界:SAT(-1,y)=SAT(x,-1)=SAT(-1,-1)=0
所以,只需要对整张图像遍历一次就可以求得这张图的积分图像。

计算Haar矩形特征

如图所示:

技术分享

利用积分图计算可计算矩形区域内像素和:

技术分享


所以,无论矩形r的尺寸大小,只需查找积分图像4次就可以求得任意矩形内像素值的和。


45°Rotated矩形特征


构造旋转积分图像Rotated SummedArea Table

 技术分享

旋转积分图中,每个点存储是其左上方延伸出的45°区域范围内所有像素之和:

技术分享

RSAT(x,y)也采用增量方计算得到:

技术分享

初始边界:RSAT(-1,y)=RSAT(x,-1)=RSAT(x,-2)=0
          RSAT(-1,-1)=RSAT(-1,-2)=0

公式具体示意如下图:

技术分享


计算Haar矩形特征

同样的方式,可推出每个矩形内像素和的计算公式:

技术分享
*图太难画了,不清楚的自己在草稿纸上试试吧~

同样的,无论旋转矩形r的尺寸大小,只需要查找积分图像4次就可以求得任意矩形内像素值得和。



(转载请注明作者和出处:http://blog.csdn.net/xiaowei_cqu 未经允许请勿用于商业用途)













基于Boost方法的人脸检测报告
摘要 1
一、数据及工具说明 1
二、实验方法 2
2.1、提取训练样本 2
2.2、提取测试样本 2
2.3、提取特征和特征值 2
2.4、训练弱分类器 2
2.5、训练强分类器 3
2.6、进行人脸检测 3
三、结果分析 4
四、结论与讨论 5
五、参考文献 5


摘要:人脸检测是图像处理领域最基本的任务之一。在学术界和工业界,关于人脸检测的研究非常多,而且技术非常成熟。本次试验采用基于Boost的方法,通过提取图像的haar特征,对每一个特征构建一个弱分类器,然后组成强分类器,最后通过组合多个分类器的效果,实现人脸检测。该方法在训练集上的准确度能够达到80%左右,通过对FDDB数据库中的2002年07月份的80个图像进行测试,发现多数正面的人脸都能够识别出来,准确率大概能达到63.04%,召回率大概在72.5%。


一、数据及工具说明
数据:本次试验采用FDDB的数据集,其中训练集从“FDDB-fold-01-ellipseList.txt”和“FDDB-fold-02-ellipseList.txt”中切割而成,测试集通过合并2002年07月份的80个图像构成。
外部库:本次试验主要采用c++和python两种语言相结合的方式实现,使用到的外部库包括,图像处理库opencv;数据预处理库pandas;科学计算库numpy。
二、实验方法
2.1、提取训练样本
主要文件参考“exampleGeneration.cpp”,大概思路是:
1、从FDDB的数据集的“FDDB-fold-01-ellipseList.txt”和“FDDB-fold-02-ellipseList.txt”中提取正样本,根据指示的椭圆人脸位置,换算成正方形人脸位置(方法是,椭圆长轴加椭圆短轴的和处以2,作为正方形边长),然后resize到25*25的大小,同时转换成灰度图存储(还有一些小细节这里省略,详细看代码)。
2、在同样的数据源上提取负样本,方法是,沿着每个图片的边缘随机切25*25的图片,这里面会有少量的人脸部分,不过不影响。
2.2、提取测试样本
测试集通过合并2002年07月份的80个图像构成,这里需要注意,要把07/19/big下面的文件移动到ImgTest_2002_07文件夹下,只要一层文件夹。
2.3、提取特征和特征值
主要文件参考“featureGeneration.cpp”,大概思路是:
1、生成特征:通过人为指定(x,y,w,h)值,产生所需要的特征,具体特征采用了haar特征中的三层结构。这里需要注意,之所以认为指定,是因为这样能够考虑到大多数位置,而随机筛选位置可能产生重复的特征,所以最终选择人为指定的方式。
2、计算每个样本的积分图:积分图能够加快特征值的计算,而不用每计算一个特征值就扫描一次图片。
3、计算特征值:采用了haar特征中的三层结构,这里采用上面加下面减中间的方式计算特征值。
2.4、训练弱分类器
主要文件参考“AdaBoost.py”,注意,这里采用python去实现的,大概思路是:对每一个特征,生成一个弱分类器。具体的,对于每一个特征的每一个取值,计算以该取值为阈值正负样本的分类正确性(这里需要考虑两个方向,大于该阈值和小于该阈值,从两者中取最大的正确率最为标准),然后再将所有取值中,正确性最大的那个值作为分类的阈值标准,同时记录方向。所以,一个弱分类器的结构大概是【threshold, errorNum, 0 or 1(flag)】。
2.5、训练强分类器
主要参考文件“AdaBoost.py”下面的“MyAdaBoost(data, WeakClfInfo)”函数。大概和AdaBoost完全一样:
1、初始化每个样本的权重为1/N。
2、对每一个弱分类器:
a)在所有样本上计算加权分类错误率:delta=errorWeight/totalWeight
b)将加权分类错误率转变成delta=math.sqrt((1-delta)/delta)
c)根据delta更新每个样本的权重
i.正确样本:dataWeight[i]/=delta
ii.错误样本:dataWeight[i]*=delta
d)更新每个弱分类器的权重:WeakClfInfo[j][4]=math.log(delta)
3、返回组合后的强分类器。
2.6、进行人脸检测
主要参考文件“myFaceDetection.cpp”,大概思路是:
1、加载训练好的分类器。
2、加载所要检测的图片。
3、对每个要检测的图片:
a)首先提取该图片的积分图
b)然后指定一个检测起始点(x,y)、检测窗口大小(w,h)、窗口滑动步长step
c)将图片依次应用到训练好的分类器上检测当前窗口是不是人脸:
d)如果有一个分类器说不是,那就拒绝该窗口;否则人为该该窗口中的图片是人脸,画出相应的人脸保存图片即可


三、结果分析
strClfNum=2:
weakClfNum=40 ==> 0.798351648352, sum(preds)=743
weakClfNum=30 ==> 0.793406593407, sum(preds)=746
weakClfNum=20 ==> 0.800549450549, sum(preds)=811
strClfNum=1:
weakClfNum=60 ==> 0.806593406593, sum(preds)=830******
weakClfNum=50 ==> 0.80989010989, sum(preds)=844******
weakClfNum=40 ==> 0.814285714286, sum(preds)=784******
weakClfNum=30 ==> 0.817582417582, sum(preds)=832******randomStrClf-1-30
weakClfNum=30 -2 ==> 0.814835164835, sum(preds)=869******randomStrClf-1-30-2
weakClfNum=20 ==> 0.812087912088, sum(preds)=850******
weakClfNum=10 ==> 0.814285714286, sum(preds)=856******randomStrClf-1-10
weakClfNum=10 ==> 0.814835164835, sum(preds)=891******randomStrClf-1-10-2
strClfNum=1, weakClfNum=170 ==> 0.817032967033, sum(preds)=869******
strClfNum=1, weakClfNum=180 ==> 0.815934065934, sum(preds)=863******
strClfNum=1, weakClfNum=190 ==> 0.817032967033, sum(preds)=865******
strClfNum=1, weakClfNum=200 ==> 0.813736263736, sum(preds)=861******
strClfNum=1, weakClfNum=210 ==> 0.815384615385, sum(preds)=842******
strClfNum=1, weakClfNum=220 ==> 0.813186813187, sum(preds)=814******


上面是部分在训练集上的准确度,可以看到基本上可以达到80%左右。
在测试集的结果参考“ResultImgMyFD/*”,这里举几个典型的例子:
  
我们发现:多数正面的人脸都能够识别出来;通过人工计算(对,我是一个一个数的,不过只有80个样本),准确率大概能达到63.04%,召回率大概在72.5%(由于我的台式机坏了,只好在笔记本上跑,所以提取的样本和特征比较少,可能效果不是很好,哭脸)。
四、结论与讨论
本次试验采用基于Boost的方法,通过提取图像的haar特征,对每一个特征构建一个弱分类器,然后组成强分类器,最后通过组合多个分类器的效果,实现人脸检测。实验证明该方法能够识别出多数正面人脸,准确率大概能达到63.04%,召回率大概在72.5%(可能效果不是很好)。
有以下几个感悟:
1)积分图是个有效的方法,对于实时监测非常重要。
2)Boost方法效果确实很强大,众人拾柴火焰高。
3)另外,由于训练数据较少,特征也比较少,所以效果不是很好;相信随着数据量的增大和特征的相应增多,效果会有所提高。
五、参考文献
[1] 课件第六讲-Tut-6-Boost.pdf
[2] Viola P, Jones M J. Robust Real-Time Face Detection[J]. International Journal of Computer Vision, 2004, 57(2):137-154.
[3] http://www.cnblogs.com/ello/archive/2012/04/28/2475419.html
[4] http://blog.csdn.net/xiaowei_cqu/article/details/7670703












基于Boost方法的人脸检测(1):整体思路

标签:

原文地址:http://blog.csdn.net/mmc2015/article/details/51286121

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!