AdaBoost 人脸检测介绍(2) : 矩形特征和积分图

  本系列文章总共有七篇,目录索引如下:

  AdaBoost 人脸检测介绍(1) : AdaBoost身世之谜

  AdaBoost 人脸检测介绍(2) : 矩形特征和积分图

  AdaBoost 人脸检测介绍(3) : AdaBoost算法流程

  AdaBoost 人脸检测介绍(4) : AdaBoost算法举例

  AdaBoost 人脸检测介绍(5) : AdaBoost算法的误差界限

  AdaBoost 人脸检测介绍(6) : 使用OpenCV自带的 AdaBoost程序训练并检测目标

  AdaBoost 人脸检测介绍(7) : Haar特征CvHaarClassifierCascade等结构分析

2. 矩形特征和积分图

  AdaBoost,是英文”Adaptive Boosting”(自适应增强)的缩写,由Yoav Freund和Robert Schapire在1995年提出。它的自适应在于:前一个基本分类器分错的样本会得到加强,加权后的全体样本再次被用来训练下一个基本分类器。同时,在每一轮中加入一个新的弱分类器,直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数。

  AdaBoost算法到目前为止仍然是人脸检测的热门算法。本节主要介绍AdaBoost算法的原理,包括级联策略、积分图思想、矩形特征。

2.1 级联策略

  AdaBoost 是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器,即弱分类器,然后把这些弱分类器集合起来,构造一个更强的最终分类器。因此AdaBoost是一种基于级联分类模型的分类器。级联分类模型可以用下图表示:

  级联分类器就是将多个强分类器连接在一起进行操作。每一个强分类器都由若干个弱分类器加权组成,例如,有些强分类器可能包含10个弱分类器,有些则包含20个弱分类器,一般情况下一个级联用的强分类器包含20个左右的弱分类器,然后在将10个强分类器级联起来,就构成了一个级联强分类器,这个级联强分类器中总共包括200个弱分类器。因为每一个强分类器对负样本的判别准确度非常高,所以一旦发现检测到的目标位负样本,就不再继续调用下面的强分类器,减少了很多的检测时间。因为一幅图像中待检测的区域很多都是负样本,这样由级联分类器在分类器的初期就抛弃了很多负样本的复杂检测,所以级联分类器的速度是非常快的;只有正样本才会送到下一个强分类器进行再次检验,这样就保证了最后输出的正样本的伪正(false positive)的可能性非常低。

2.2 矩形特征

  P.Viola等在2001年提出一种基于Boosting方法的实时人脸检测系统,该系统的检测速度可以达到每秒15帧,实时检测速度及准确率表现优异,这是人脸检测从研究走向实用的一次质的飞跃。他们对人脸应用积分图方法计算矩形特征,用其得到的结果训练分类器。

2.2.1 Harr-like特征

  Harr-like特征是Viola等提出的一种简单矩形特征,因其类似于Harr小波而得名。它反映了图像局部的灰度化。影响AdaBoost检测训练算法速度很重要的两方面是特征的选取和特征值的计算。脸部的一些特征可以由矩形特征简单地描绘。如下图示范:

  上图中两个矩形特征,表示出人脸的某些特征。比如中间一幅表示眼睛区域的颜色比脸颊区域的颜色深,右边一幅表示鼻梁两侧比鼻梁的颜色要深。同样,其他目标,如眼睛等,也可以用一些矩形特征来表示。在给定有限的数据情况下,基于特征的检测能够编码特定区域的状态,而且基于特征的系统比基于像素的系统要快得多。

  矩形特征对一些简单的图形结构,比如边缘、线段,比较敏感,但是其只能描述特定走向(水平、垂直、对角)的结构,因此比较粗略。如上图,脸部一些特征能够由矩形特征简单地描绘,例如,通常眼睛要比脸颊颜色更深;鼻梁两侧要比鼻梁颜色要深;嘴巴要比周围颜色更深。

  对于一个 24×24 检测器,其内的矩形特征数量超过160,000个,必须通过特定算法甄选合适的矩形特征,并将其组合成强分类器才能检测人脸。

  常用的矩形特征有三种:两矩形特征、三矩形特征、四矩形特征,如图:

  由图表可以看出,两矩形特征反映的是边缘特征,三矩形特征反映的是线性特征、四矩形特征反映的是特定方向特征。

  Lienhart R.等对Haar-like矩形特征库作了进一步扩展,加入了旋转〖45〗^o角的矩形特征。扩展后的特征大致分为4种类型:边缘特征、线特征环、中心环绕特征和对角线特征:

  这些所谓的特征不就是一堆带条纹的矩形么,到底是干什么用的?我这样给出解释,将上面的任意一个矩形放到人脸区域上,然后,将白色区域的像素和减去黑色区域的像素和,得到的值我们暂且称之为人脸特征值,如果你把这个矩形放到一个非人脸区域,那么计算出的特征值应该和人脸特征值是不一样的,而且越不一样越好,所以这些方块的目的就是把人脸特征量化,以区分人脸和非人脸。为了增加区分度,可以对多个矩形特征计算得到一个区分度更大的特征值,那么什么样的矩形特征怎么样的组合到一块可以更好的区分出人脸和非人脸呢,这就是AdaBoost算法要做的事了。OpenCV的Haar分类器就是基于扩展后的特征库实现的。

  特征模板都是由两个或多个全等的矩形相邻组合而成,特征模板内有白色和黑色两种矩形。特征模板的特征值定义为:白色矩形像素和减去黑色矩形像素和。接下来,要解决两个问题:1)求出每个待检测子窗口中的特征个数;2)求出每个特征的特征值。

  子窗口中的特征个数即为特征矩形的个数。训练时,将每一个特征在训练图像子窗口中进行滑动计算,获取各个位置的各类矩形特征。在子窗口中位于不同位置的同一类型矩形特征,属于不同的特征。可以证明,在确定了特征的形式之后,矩形特征的数量只与子窗口的大小有关。在24×24的检测窗口中,矩形特征的数量约为160,000个。

2.2.2 特征模板个数

  特征模板可以在子窗口内以“任意”尺寸“任意”放置,每一种形态称为一个特征。找出子窗口所有特征,是进行弱分类训练的基础。

2.2.2.1 子窗口内的条件矩形

  如图所示一个 m x m大小的子窗口,可以计算在这么大的子窗口内存在多少个矩形特征。

  以 m×m 像素分辨率的检测器为例,其内部存在的满足特定条件的所有矩形的总数可以这样计算:

  对于 m×m 子窗口,我们只需要确定了矩形左上顶点 A(x1,y1) 和右下顶点 B(x2,y2),即可以确定一个矩形;如果这个矩形还必须满足下面两个条件(称为 (s,t) 条件,满足 (s,t) 条件的矩形称为条件矩形):

  1)x 方向边长必须能被自然数 s 整除(能均等分成 s 段);

  2)y 方向边长必须能被自然数 t 整除(能均等分成 t 段);

则这个矩形的最小尺寸为 s×t 或 t×s,最大尺寸为 [m/s]*s×[m/t]*t 或 [m/t]*t×[m/s]*s;其中[ ]为取整运算符。

2.2.2.2 条件矩形的数量

  我们通过下面两步就可以定位一个满足条件的矩形:

  1)确定 A(x1,y1):x1∈1,2,?,m?s,m?s+1,y1∈1,2,?,m?t,m?t+1 ;

  2)确定 A 点后,B 点只能在图中阴影内(包括边缘)取值,因此有:

x2∈X=x1+s?1,x1+2s?1,?,x1+ps?1,

 

y2∈Y=y1+t?1,〖y〗1+2t?1,?,y1+qt?1,

其中 p=[(m?x1+1)/s],q=[(m?y1+1)/t] ,并且|X|=p,|Y|=q。

  由上分析可知,在m×m 子窗口中,满足 (s,t) 条件的所有矩形的数量为:

  实际上,(s,t) 条件描述了矩形的特征,下面列出了不同矩形特征对应的 (s,t) 条件:

  所以 m×m 子窗口中所有5种特征模板的特征总数量 Ωm ,就是分别满足5个(s,t)条件的矩形特征的数量的总和,即:

Ωm=Ωm(1,2)+Ωm(2,1)+Ωm(1,3)+Ωm(3,1)+Ωm(2,2)

  特别地,由于特征模板 1 和 2、3 和 4 具有旋转对称性,则可以进一步简化为:

Ωm=2Ωm(1,2)+2Ωm(1,3)+Ωm(2,2)

  下面以24×24子窗口为例,具体计算其特征总数量:

  下面列出了,在不同子窗口大小内,特征的总数量:

2.2.2.3 再次讨论Harr特征个数

  最早的Haar特征由Papageorgiou C.等提出(《A general framework for object detection》),后来Paul Viola和Michal Jones提出利用积分图像法快速计算Haar特征的方法(《Rapid object detection using a boosted cascade of simple features》)。之后,Rainer Lienhart 和 Jochen Maydt用对角特征对Haar特征库进行了扩展(《An extended set of Haar-like features for rapid object detection》)。OpenCV的Haar分类器就是基于扩展后的特征库实现的。在该论文中,作者提出了Harr特征个数的公式:

XY(W+1?w(X+1)/2)(H+1?h(Y+1)/2)

其中, W×H为窗口大小,w×h为矩形特征大小,X=?W/w?,Y=?H/h?表示矩阵特征在水平和垂直方向能放大的最大比例系数。

  对于旋转45°的矩形特征(如1c和1d),w、h 表示如下图所示:

其计算公式为:

XY(W+1?z(X+1)/2)(H+1?z(Y+1)/2),       z=w+h.

Remark: 我觉得对于旋转45°的矩形个数计算公式中,除了z值变化外,X 和Y的值也应该变为:X=?W/z?,Y=?H/z?。

  下面是我理解的计算过程,跟前一节条件矩形数量的计算类似:

  1)对于某固定大小的特征矩形,在窗口内计算其可滑动的次数。

  2)对于某一特征,特征本身可在水平和垂直两个方向分别缩放。

  清楚这两点,我们就可以很容易的写出计算特征个数的代码:

  由以上的代码,我们很容易推导出论文中提到的Harr特征个数公式,证明如下:

  对于45°特征,由于Rainer Lienhart定义的w、h与原矩阵含义不同,即实际滑动的矩阵框为(w+h)×(w+h)。所以只要用如下方式调用原函数即可:GetHarrLikeCount(W, H, w+h, w+h)。

  运行结果如下:

  将此结果跟论文比较,结果基本一致。论文中的结果如下:

2.3 积分图

2.3.1定义

  一个简单的微积分类比:如果我们要经常计算 ∫baf(x)dx ,那我们会先计算F(x)=∫f(x)dx,那么∫baf(x)dx=F(b)?F(a),见下图:

积分图的含义与此类似。2001年,Viola等提出积分图(Integral Image)概念,其目的是为了快速的计算分类器所需的矩形特征。定义一副图像的像素灰度为 I(x,y),则对于图像内一点 A(x,y),定义其积分图SAT(x,y)为:

SAT(x,y)=∑x′≤x,y′≤yI(x′,y′) ,

其中 I(x′,y′) 为点 (x′,y′) 处原始图在此点的颜色值;对于灰度图,其值为 0 ~ 255。对于彩色图像,是此点的颜色值。

要得到一幅输入图像的积分图像,只需逐点扫描原图像一次,就可计算出来。即:

s(x,y)=s(x,y?1)+I(x,y)

SAT(x,y)=SAT(x?1,y)+s(x,y)

其中 s(x,y) 表示点 (x,y) 在 y 方向的所有原始图像之和,称为“列积分和”,可以定义为:

s(x,y)=∑y′≤yI(x,y′)

并定义 s(x,0)=0, SAT(0,y)=0。

2.3.2利用积分图计算矩形特征值

  一个区域的像素值,可以利用该区域端点的积分图来计算,如下图所示:

区域 D 的像素值,可以利用 1、2、3、4 点的积分图来计算。在上图中,我们用 SAT1 表示区域A的像素值,SAT2 表示区域 A+B 的像素值,SAT3 表示区域 A+C 的像素值,SAT4 表示区域A+B+C+D 的像素值,由此可得:

区域D的像素值=SAT4+SAT1?SAT2?SAT3.

因此,由积分图可以快速得到一个区域的像素值。

2.3.3计算特征模板的特征值

由上一节已经知道,一个区域的像素值,可以由该区域端点的积分图来计算。由前面特征模板的特征值的定义可以推出,矩形特征的特征值可以由特征端点的积分图计算出来。以“两矩形特征”中的第二个特征为例,如下图,使用积分图计算其特征值:

![这里写图片描述](http://img.blog.csdn.net/20160920103450957)

该特征模板的特征值,由定义知,为区域 A 的像素值减去区域 B 的像素值。由上节知:

区域A的像素值=SAT5+SAT1?SAT2?SAT4,

区域B的像素值=SAT6+SAT2?SAT5?SAT3.

因此该特征模板的特征值为:

SAT5+SAT1?SAT2?SAT4–(SAT6+SAT2?SAT5?SAT3)=

(SAT5?SAT4)+(SAT3?SAT2)?(SAT2?SAT1)?(SAT6?SAT5).

所以特征模板的特征值,只与特征矩形端点的积分图有关,而与图像的坐标无关。通过计算特征矩形端点的积分图,再进行简单的加减运算,就可以得到特征值。正因为如此,特征的计算速度大大提高,也提高了目标的检测速度。

2.3.4计算旋转45°的矩形特征

  在旋转积分图中,每个点存储的是其左上方〖45〗^o区域范围内所有像素之和:

RSAT(x,y)=∑y′≤y,y′≤y?|x?x′|I(x′,y′)

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

RSAT(x,y)=RSAT(x?1,y?1)+RSAT(x+1,y?1)?RSAT(x,y?2)+I(x,y)+I(x,y?1).

初始边界:

RSAT(?1,y)=RSAT(x,?1)=RSAT(x,?2)=RSAT(?1,?1)=RSAT(?1,?2)=0.

同步本人网易博客文章AdaBoost 人脸检测介绍(2) : 矩形特征和积分图

时间: 2024-08-23 23:24:46

AdaBoost 人脸检测介绍(2) : 矩形特征和积分图的相关文章

AdaBoost 人脸检测介绍(3) : AdaBoost算法流程

本系列文章总共有七篇,目录索引如下: AdaBoost 人脸检测介绍(1) : AdaBoost身世之谜 AdaBoost 人脸检测介绍(2) : 矩形特征和积分图 AdaBoost 人脸检测介绍(3) : AdaBoost算法流程 AdaBoost 人脸检测介绍(4) : AdaBoost算法举例 AdaBoost 人脸检测介绍(5) : AdaBoost算法的误差界限 AdaBoost 人脸检测介绍(6) : 使用OpenCV自带的 AdaBoost程序训练并检测目标 AdaBoost 人脸

AdaBoost 人脸检测介绍(1) : AdaBoost身世之谜

0. 引言 学习和使用AdaBoost算法来研究人脸检测有好几个月了,一直以来想对AdaBoost的算法和原理做一个总结,在网上也参考了很多牛人的博客和看了一些专业论文,总是觉得总结的不够全面和详细,因此想对AdaBoost的来龙去脉做一个详细的总结,对算法里涉及到的原理,自己经过细致考证和推理,给出了详细的理论证明和代码验证,而不仅仅是停留在只知结果而不知推理的层面上.因此需要花不少时间来总结和写下自己在AdaBoost道路上学习和研究的心路历程!在后面会给出所有的参考文献,对网上众多的未曾谋

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

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

Haar特征、积分图、Adaboost算法、分类器训练

一.Haar-like特征 Haar特征值反映了图像分度变化的情况. Haar-like特征最早是由Papageorgiou等应用于人脸表示,Viola和Jones在此基础上,使用3种类型4种形式的特征. Haar特征分为三类:边缘特征.线性特征.中心特征和对角线特征,组合成特征模板.特征模板内有白色和黑色两种矩形,并定义该模板的特征值为白色矩形像素和减去黑色矩形像素和.Haar特征值反映了图像的灰度变化情况.例如:脸部的一些特征能由矩形特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜

Haar特征与积分图

转自:http://blog.csdn.net/weixingstudio/article/details/7631241 Haar特征与积分图 1. Adaboost方法的引入 1.1 Boosting方法的提出和发展 在了解Adaboost方法之前,先了解一下Boosting方法. 回答一个是与否的问题,随机猜测可以获得50%的正确率.如果一种方法能获得比随机猜测稍微高一点的正确率,则就可以称该得到这个方法的过程为弱学习:如果一个方法可以显著提高猜测的正确率,则称获取该方法的过程为强学习.1

关于ADABOOST人脸检测负样本的选取

其他人脸检测方法,负样本需要的数量我不清楚,但是ADABOOST所需负样本数量非常之大.在训练层数后期,当最大误警率很低,如2*10-5次方,同时参与训练的负样本为4000时,那么需要的负样本就要2*10^8.解决的方法是自举.但自举最重要的是负样本本身的尺寸一定要足够大1000*1000.同时针对不同应用场景,我们需要不同的负样本.比如车内的人脸检测,负样本本身就要体现出车内分人脸的特性,湖水 蓝天之类的就没有任何区分效果.这在下面的Q&A中也有体现. Viola-Jones' AdaBoos

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

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

目标检测之积分图---integral image 积分图2

前面在图像处理一栏中涉及到boxfilter 的时候,简单介绍过积分图,就是每个像素点是左边和上边的累加和,这样的话可以方便均值和方差,以及直方图统计的相关运算,这里再次结合网络资源重新单独对积分图做专门的介绍. 积分图的概念最早是由Paul Viola等人提出的,并被应用到实时的对象检测框架中.对于一个灰度图像而言,其积分图也是一张图,只不过这个图跟普通的灰度图,彩色图稍有不同.这是因为,一般我们说的灰度图.彩色图,都是相机拍摄到的真实物体在某个时刻的真实画面.而积分图虽然也可以理解为一张图,

最简单的ADABOOST人脸检测例程。COPY运行,前提是你配置好OpenCV环境

#include "cv.h" #include "highgui.h" #include "stdio.h" void main() { IplImage* img = NULL; IplImage* cutImg = NULL; CvMemStorage* storage = cvCreateMemStorage(0); //CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade