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

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

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

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

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

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

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

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

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

  

3. AdaBoost算法流程

  Adaboost是一种迭代方法,其核心思想是针对不同的训练集训练同一个弱分类器,然后把在不同训练集上得到的弱分类器集合起来,构成一个最终的强分类器。

3.1 弱分类器的训练及选取

  最初的弱分类器可能只是一个最基本的Haar-like特征,计算输入图像的Haar-like特征值,和最初的弱分类器的特征值比较,以此来判断输入图像是不是人脸,然而这个弱分类器太简陋了,可能并不比随机判断的效果好,对弱分类器的孵化就是训练弱分类器成为最优弱分类器,注意这里的最优不是指强分类器,只是一个误差相对稍低的弱分类器,训练弱分类器实际上是为分类器进行设置的过程。至于如何设置分类器,设置什么,我们首先分别看下弱分类器的数学结构。

h(x,f,p,θ)=f(x)={=1,    pf(x)<θ=0,    其他

其中f 为特征,θ为阈值,p指示不等号的方向,x该表一个检测子窗口。对每个特征f,训练一个弱分类器 h(x,f,p,θ),就是确定f的最优阈值,使得这个弱分类器 h(x,f,p,θ)对所有训练样本的分类误差最小。

  弱分类器训练的过程大致分为如下几步:

  1)对每个特征f,计算所有训练样本的特征值;

  2)将特征值排序;

  3)对排好序的每个元素计算:

    3.1)全部正例的权重和T+;

    3.2)全部负例的权重和T?;

    3.3)该元素前正例的权重和S+;

    3.4)该元素前负例的权重和S?.

  4)选取当前元素的特征值F(kj) 和它前面的一个特征值Fkj?1之间的数作为阈值,所得到的弱分类器就在当前元素处把样本分开 —— 也就是说这个阈值对应的弱分类器将当前元素前的所有元素分为人脸(或非人脸),而把当前元素后(含)的所有元素分为非人脸(或人脸)。该阈值的分类误差为:

e=min(S++(T??S?),S?+(T+?S+)).

于是,通过把这个排序表从头到尾扫描一遍就可以为弱分类器选择使分类误差最小的阈值(最优阈值),也就是选取了一个最佳弱分类器。

3.2 训练强分类器

  给定一个训练数据集 T=(x1,y1),(x2,y2),?,(xN,yN),其中实例空间x∈X,而实例空间 X∈Rn,  yi∈Y=?1,+1。AdaBoost算法的目的就是从训练数据中学习一系列弱分类器,然后将这些弱分类器组合成一个强分类器。AdaBoost算法流程如下:

  步骤1:首先,初始化训练数据的权值分布。每个训练样本初始都被赋予相同的权值:1/N。

    

D1=(w11,w12,?,w1i,?,w1N),   w1i=1/N,   i=1,2,?,N.

  步骤2:进行多轮迭代,用m=1,2,?,M 表示迭代的第多少轮。

    a). 使用具有权值分布Dm的训练数据集学习,得到基本分类器(选取让误差率最低的阈值来设计基本分类器):

Gm(x):X→{?1,+1}

    b). 计算Gm(x)在训练数据集上的分类误差率:

em=P(Gm(xi)≠yi)=∑i=1NwmiI(Gm(xi)≠yi)

     由上述式子可知,Gm(x)在训练数据集上的误差率em就是被Gm(x)误分类样本的权值之和。

    c). 计算Gm(x)的系数,αm表示Gm(x)在最终分类器中的重要程度(目的:得到基本分类器在最终分类器中所占的权重):

αm=12ln(1?emem)

     由上述式子可知,em≤1/2时,αm≥0,且αm随着em的减小而增大,意味着分类误差率越小的基本分类器在最终分类器中的作用越大。

    d). 更新训练数据集的权值分布(目的:得到样本的新的权值分布),用于下一轮迭代:

Dm+1=(wm+1,1,wm+1,2,?,wm+1,i,?,wm+1,N)

wm+1,i=wmiZm?exp(?αmyiGm(xi)),     i=1,2,?,N

     使得被基本分类器Gm(x)误分类样本的权值增大,而被正确分类样本的权值减小。就这样,通过这样的方式,AdaBoost方法能“重点关注”或“聚焦于”那些较难分的样本上。其中,Zm是规范化因子,使得Dm+1成为一个概率分布:

Zm=∑i=1Nwmiexp(?αmyiGm(xi))

  步骤3:组合各个弱分类器

f(x)=∑m=1MαmGm(x)

     从而得到最终的分类器,如下:

G(x)=sign(f(x))=sign(∑m=1MαmGm(x))

  简单来说,AdaBoost有很多优点:

  ● AdaBoost是一种有很高精度的分类器;

  ● 可以使用各种方法构建子分类器,AdaBoost算法提供的是框架;

  ● 当使用简单分类器时,计算出的结果是可以理解的。而且弱分类器构造极其简单;

  ● 简单,不用做特征筛选;

  ● 不用担心overfitting!

3.3 再次介绍弱分类器以及为什么可以使用Haar特征进行分类

  对于本算法中的矩形特征来说,弱分类器的特征值 f(x) 就是矩形特征的特征值。由于在训练的时候,选择的训练样本集的尺寸等于检测子窗口的尺寸,检测子窗口的尺寸决定了矩形特征的数量,所以训练样本集中的每个样本的特征相同且数量相同,而且一个特征对一个样本有一个固定的特征值。

  对于理想的像素值随机分布的图像来说,同一个矩形特征对不同图像的特征值的平均值应该趋于一个定值k。这个情况,也应该发生在非人脸样本上,但是由于非人脸样本不一定是像素随机的图像,因此上述判断会有一个较大的偏差。

 

  对每一个特征,计算其对所有的一类样本(人脸或者非人脸)的特征值的平均值,最后得到所有特征对所有一类样本的平均值分布。

 

  下图显示了20×20 子窗口里面的全部78,460 个矩形特征对全部2,706个人脸样本和4,381 个非人脸样本的特征值平均数的分布图。由分布看出,特征的绝大部分的特征值平均值都是分布在0 前后的范围内。出乎意料的是,人脸样本与非人脸样本的分布曲线差别并不大,不过注意到特征值大于或者小于某个值后,分布曲线出现了一致性差别,这说明了绝大部分特征对于识别人脸和非人脸的能力是很微小的,但是存在一些特征及相应的阈值,可以有效地区分人脸样本与非人脸样本。

所有矩形特征对所有图片的特征值平均数分布

(横坐标是按特征值平均值排序后的特征编号)

  为了更好地说明问题,我们从78,460 个矩形特征中随机抽取了两个特征A和B,这两个特征遍历了2,706 个人脸样本和4,381 个非人脸样本,计算了每张图像对应的特征值,最后将特征值进行了从小到大的排序,并按照这个新的顺序表绘制了分布图如下所示:

  可以看出,矩形特征A在人脸样本和非人脸样本中的特征值的分布很相似,所以区分人脸和非人脸的能力很差。下面看矩形特征B在人脸样本和非人脸样本中特征值的分布:

 可以看出,矩形特征B的特征值分布,尤其是0点的位置,在人脸样本和非人脸样本中差别比较大,所以可以更好的实现对人脸分类。

 有关特征A和B的一些统计数据如下表:

  特征 A 和特征 B 的表现大相径庭。

  特征 A 对人脸和非人脸样本的特征值为0的点几乎处于相同位置(46.5%,51.5%),且都在所有特征的中间范围 (-5%)。这说明矩形特征 A对于人脸和非人脸几乎没有分辨能力。

 

  特征 B 对非人脸样本的分布,符合我们的预想,特征值为 0的点处于所有特征的中间范围(59.4%),这说明特征 B也“ 看不到” 非人脸的特点。但是对于人脸样本,特征 B 表现了很一致的倾向性,93.4%的特征在 0 点的一侧,与非人脸样本的相差 34%。这说明特征 B 能够相当可靠地分辨人脸和非人脸。

 

  上述的分析说明,确实存在优势的矩形特征,能够在一定的置信范围内区分人脸和非人脸。由于是使用统计的方法计算人脸图像和非人脸图像的差别,因此最后得到的区分阈值,也只能是在某个概率范围内准确地进行区分。

  由上述的分析,阈值 θ 的含义就清晰可见了。而方向指示符 p 用以改变不等号的方向。一个弱学习器(一个特征)的要求仅仅是:它能够以稍低于50%的错误率来区分人脸和非人脸图像,因此上面提到只能在某个概率范围内准确地进行区分就已经完全足够。按照这个要求,可以把所有错误率低于50% 的矩形特征都找到(适当地选择阈值,对于固定的训练集,几乎所有的矩形特征都可以满足上述要求)。每轮训练,将选取当轮中的最佳弱分类器(在算法中,迭代T 次即是选择T 个最佳弱分类器),最后将每轮得到的最佳弱分类器按照一定方法提升(Boosting)为强分类器。

  [同步本人网易博客的文章] AdaBoost 人脸检测介绍(3) : AdaBoost算法流程

时间: 2024-08-01 10:10:48

AdaBoost 人脸检测介绍(3) : AdaBoost算法流程的相关文章

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

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

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

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

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

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

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

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

最简单的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

Adaboost算法详解(haar人脸检测)

Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器).Adaboost算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值.将修改过权值的新数据集送给下层分类器进行训练,最后将每次得到的分类器最后融合起来,作为最后的决策分类器. 算法概述 1.先通过对N个训练样本的学习得到第一个弱分类器: 2.将分错的样本和其他的新数据

C++开发人脸性别识别教程(4)——OpenCv的人脸检测函数

这个项目主要包含三部分:人脸检测.特征提取.性别分类: 这篇博客中我们重点介绍OpenCv的人脸检测函数.这篇博客我们先不提MFC,而是在win32控制台下编写一段人脸检测的程序. 一.开启摄像头 我们先讲解如何通过摄像头来采集图像,这听起来更有实际意义. 1.新建工程并配置OpenCv(注意工程类型选择win32控制台应用程序): 2.包含头文件 OpenCv2.x版本包含头文件非常方便,一句话搞定: #include <opencv2\opencv.hpp> using namespace

转载——Adaboost 算法 人脸检测原理

对人脸检测的研究最初可以追溯到 20 世纪 70 年代,早期的研究主要致力于模板匹配.子空间方法,变形模板匹配等.近期人脸检测的研究主要集中在基于数据驱动的学习方法,如统计模型方法,神经网络学习方法,统计知识理论和支持向量机方法,基于马尔可夫随机域的方法,以及基于肤色的人脸检测.目前在实际中应用的人脸检测方法多为基于 Adaboost学习算法的方法. Viola人脸检测方法是一种基于积分图. 级联检测器和AdaBoost 算法的方法,方法框架可以分为以下三大部分:    第一部分,使用Harr-

基于AdaBoost算法——世纪晟结合Haar-like特征训练人脸检测识别

  AdaBoost?算法是一种快速人脸检测算法,它将根据弱学习的反馈,适应性地调整假设的错误率,使在效率不降低的情况下,检测正确率得到了很大的提高.   系统在技术上的三个贡献: 1.用简单的Haar-like矩形特征作特征,可快速计算 2.基于AdaBoost的分类器设计 3.采用了Cascade(分级分类器)技术提高检测速度 人脸的特征表示方法--Haar-like矩形特征   矩形特征的值是所有白色矩形中点的亮度值的和减去所有灰色矩形中点的亮度值的和,所得到的差 具体特征可以用一个五元组