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

先推荐大家看着两篇:

[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

时间: 2024-08-23 11:55:30

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

基于Haar特征Adaboost人脸检测级联分类

基于Haar特征Adaboost人脸检测级联分类,称haar分类器. 通过这个算法的名字,我们能够看到这个算法事实上包括了几个关键点:Haar特征.Adaboost.级联.理解了这三个词对该算法基本就掌握了. 1        算法要点 Haar分类器 = Haar-like特征 + 积分图方法 + AdaBoost +级联: Haar分类器算法的要点例如以下: a)        使用Haar-like特征做检測. b)       使用积分图(IntegralImage)对Haar-like

基于python+opencv的人脸检测+

人脸检测分为两种:一种是基于知识的,一种是基于深度学习的.深度不会学习 人脸识别属于目标检测,主要涉及两个方面: ①先对检测的物体进行概率统计,从而知道待检测对象的一些特征,建立其目标的检测模型 ②用得到的模型来匹配输入的图像,如果有匹配则则输出匹配的区域,否则什么也不做. 我们看到的图片和计算机不一样,计算机看到的是一串串数字矩阵,图片由多个像素组成,拿我们熟悉的RGB图像来说,每个像素又有红绿蓝三个通道,假如每个像素的单个通道由uint8类型字符组成,那么三通道的像素便会有24位,这是我们常

浅析人脸检测之Haar分类器方法:Haar特征、积分图、 AdaBoost 、级联

浅析人脸检测之Haar分类器方法 一.Haar分类器的前世今生 人脸检测属于计算机视觉的范畴,早期人们的主要研究方向是人脸识别,即根据人脸来识别人物的身份,后来在复杂背景下的人脸检测需求越来越大,人脸检测也逐渐作为一个单独的研究方向发展起来. 目前的人脸检测方法主要有两大类:基于知识和基于统计. Ø  基于知识的方法:主要利用先验知识将人脸看作器官特征的组合,根据眼睛.眉毛.嘴巴.鼻子等器官的特征以及相互之间的几何位置关系来检测人脸. Ø  基于统计的方法:将人脸看作一个整体的模式——二维像素矩

OpenFace库(Tadas Baltrusaitis)中基于Haar Cascade Classifiers进行人脸检测的测试代码

Tadas Baltrusaitis的OpenFace是一个开源的面部行为分析工具,它的源码可以从 https://github.com/TadasBaltrusaitis/OpenFace 下载.OpenFace主要包括面部关键点检测(facial landmard detection).头部姿势估计(head pose estimation).面部动作单元识别(facial action unit recognition).人眼视线方向估计(eye gaze estimation). 编译T

基于Haar特征的Adaboost级联人脸检测分类器

基于Haar特征的Adaboost级联人脸检测分类器,简称haar分类器.通过这个算法的名字,我们可以看到这个算法其实包含了几个关键点:Haar特征.Adaboost.级联.理解了这三个词对该算法基本就掌握了. 1        算法要点 Haar分类器 = Haar-like特征 + 积分图方法 + AdaBoost +级联: Haar分类器算法的要点如下: a)        使用Haar-like特征做检测. b)       使用积分图(IntegralImage)对Haar-like特

浅谈人脸检测之Haar分类器方法

我们要探讨的Haar分类器实际上是Boosting算法(提升算法)的一个应用,Haar分类器用到了Boosting算法中的AdaBoost算法,只是把AdaBoost算法训练出的强分类器进行了级联,并且在底层的特征提取中采用了高效率的矩形特征和积分图方法,这里涉及到的几个名词接下来会具体讨论. 在2001年,Viola和Jones两位大牛发表了经典的<Rapid Object Detection using a Boosted Cascade of Simple Features>和<R

人脸识别系列之人脸检测--训练基于肤色特征的检测

前言: 基于特征的方法是利用人脸的先验知识导出的规则进行人脸检测. 一般来说,常用的特征包括人脸和人脸器官典型的边缘和形状特征(如人脸轮廓.虹膜轮廓.嘴唇轮廓等).纹理特征(纹理是在图上表现为灰度或颜色分布的某种规律性,这种规律性在不同类别的纹理中有其不同特点,人脸有其特定的纹理特征).颜色特征(人脸肤色特征,目前主要有RGB,HSV,YCbCr,YIQ,HIS等彩色空间模型被用来表示人脸的肤色,从而进行基于颜色信息的人脸检测方法的研究). 人脸检测的方法: 基于规则/知识方法 – 人脸模式的变

人脸检测之Haar-like,Adaboost,级联(cascade)

0:写在前面的话 写在前面的牢骚话,作为一个非主流工程师,我专业与目前工作都与这些知识相隔十万八千里,所以,我所学习和实现的完全是因为兴趣,目前还研究学习的很浅,谈不上高深,所以还是要继续努力学习.希望和大家多交流,也欢迎伪大牛,假专家板砖伺候,也希望真大牛多指点(真大牛不会啰嗦一堆来显得他知道的多,哈哈),总之,本人还在菜鸟阶段,欢迎指教.0.0本文如有错误请及时留言指出,博主会在第一时间修改,确保不会对其他读者产生副作用. 1:人脸检测与识别 人脸识别系统主要包括四个组成部分,分别为:人脸图

OpenCV&amp;Qt学习之四——OpenCV 实现人脸检测与相关知识整理

开发配置 OpenCV的例程中已经带有了人脸检测的例程,位置在:OpenCV\samples\facedetect.cpp文件,OpenCV的安装与这个例子的测试可以参考我之前的博文Linux 下编译安装OpenCV. 网上能够找到关于OpenCV人脸检测的例子也比较多,大多也都是基于这个例程来更改,只是多数使用的是OpenCV 1.0的版本,而OpenCV2.0以后由于模块结构的更改,很多人并没有将例程运行起来.如果是新版的OpenCV跑旧的例程,编译运行出错的话,需要确保: #include