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

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

7. Haar特征CvHaarClassifierCascade等结构分析

  在调用OpenCV中的级联分类器对目标进行分类时,都会将一个训练好的分类器(一个训练好的.xml文件)读入到一个CvHaarClassifierCascade结构中,如下:
      CvHaarClassifierCascade *face_cascade = NULL;
      face_cascade = (CvHaarClassifierCascade *)cvLoad( “haarcascade_frontalface_alt.xml”, 0, 0, 0 );
  那么这个CvHaarClassifierCascade结构体里面的内容都有哪些呢?这些内容又是如何跟Haar特征对应起来的呢? 首先让我们看看CvHaarClassifierCascade结构体的定义:

AdaBoost 人脸检测介绍(7) : Haar特征CvHaarClassifierCascade等结构分析_第1张图片

  ● flag,还不是很清楚,在debug模式下,flags的值为 1112539136,很诡异;
  ● count,表示整个级联分类器中强分类器的数量;
  ● orig_window_size,表示的是在训练时用的正样本的尺寸,OpenCV中的尺寸是20x20;
  ● real_window_size,待检测窗口大小,这个参数需要用户自己设置;
  ● scale,特征块缩放的比例,这个参数需要用户自己设置;
  ● stage_classifier,强分类器指针,指向一个强分类器数组,之前的count值是多少,那么此处强分类器就有多少个;
  ● hid_cascade,隐形HAAR级联分类器,据说创建隐形分类器的原因是提高HAAR级联分类器内部处理的效率。
  
  下面给出在debug模式下加载haarcascade_frontalface_alt.xml分类器之后,CvHaarClassifierCascade结构体各变量的情况:

AdaBoost 人脸检测介绍(7) : Haar特征CvHaarClassifierCascade等结构分析_第2张图片

  下面我们来看看第六个强分类器结构体:

AdaBoost 人脸检测介绍(7) : Haar特征CvHaarClassifierCascade等结构分析_第3张图片

  ● count,表示该强分类器中,弱分类器的数量,即该强分类器由多少个弱分类器组成;
  ● threshold,叠加分类器的阈值(这个我也不知道);
  ● classifier,是一个指针,指向的是一个弱分类器数组,之前的count是多少,此处的弱分类器就有多少;
  ● 后面3个暂时不清楚… …
  接下来再看看弱分类器的结构:

AdaBoost 人脸检测介绍(7) : Haar特征CvHaarClassifierCascade等结构分析_第4张图片

  ● count,在opencv里,发现始终都是1,自己想了想,因为这个结构体记录的是一个弱分类器,自然弱分类器的个数就是1了;
  ● haar_feature,也是一个指针,指向一个特征结构体CvHaarFeature,这个结构体中记录的内容是弱分类器的类型(包括该haar-like特征的位置,大小,以及种类,这个结构体会在下面给出,再细说);
  ● threshold,就是弱分类器中那个判别函数中的阈值 θ

这里写图片描述

  ● left和right,不是很清楚;
  ● alpha,就是这个弱分类器的权重(每一个强分类器都是由多个弱分类器按照各自的权重进行表决而得到的)。

  最后让我们看看Haar特征的结构:

AdaBoost 人脸检测介绍(7) : Haar特征CvHaarClassifierCascade等结构分析_第5张图片

  ● titled,0表示该特征是标准的haar-like特征,1表示旋转45°后的特征;
  ● rect,结构体数组,每个结构体中包括一个矩形和一个权重,这个数组的大小是CV_HAAR_FEATURE_MAX(3)(此处可能有2~3个矩形,这里的矩形等看了下面的解释就知道了),这个矩形和权重有什么用呢?
  在debug模式下,查看第一个弱分类器数组内各元素的值,如图:

AdaBoost 人脸检测介绍(7) : Haar特征CvHaarClassifierCascade等结构分析_第6张图片

  通过上面的图,我们可以把三个rect画出来(第三个rect元素全为0,表示没有用到):

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

  由图可见,第一个矩形rect[0]表示的是A+B区域,第二个矩形rect[1]表示的是B区域。此时再看一看每个元素的权重weight,结合积分图的概念,发现第一个矩形的积分图乘以其权重加上第二个积分图乘以其权重,恰好得到下述结果:

(A+B)(1)+B2=BA

看到这个公式,大家都不会陌生,这正是VJ论文中给出的众多Haar-like模板中的其中一个模板的计算方法(此处不知如何表达,大家将就,看懂就行)。

为了将debug模式下弱分类器数组内各元素的值与分类器xml文件的数据对应起来,让我们打开haarcascade_frontalface_alt.xml文件,找到与第一个弱分类器对应的各数据:

AdaBoost 人脸检测介绍(7) : Haar特征CvHaarClassifierCascade等结构分析_第8张图片

  可以看到xml文件中rect数组的数据跟debug模式下得到的数据是一致的!
  我们继续考察第二个弱分类器的特征部分,其特征参数如下:

AdaBoost 人脸检测介绍(7) : Haar特征CvHaarClassifierCascade等结构分析_第9张图片

数组的第三个元素依然都是0,对其绘图:

AdaBoost 人脸检测介绍(7) : Haar特征CvHaarClassifierCascade等结构分析_第10张图片

第一块矩形区域是 A+B+C ,第二块矩形区域是 B ,积分图乘以权重,再相加,可得:

(A+B+C)(1)+B3=2BAC

也是Haar-like特征模板之一。 我们在xml文件中查看第二个弱分类器的各项数据:

AdaBoost 人脸检测介绍(7) : Haar特征CvHaarClassifierCascade等结构分析_第11张图片

仍然可以看到xml文件中rect数组的数据跟debug模式下得到的数据是一致的!
我们在xml文件中找了一个第三个rect元素权重不为0的例子,如下图:

AdaBoost 人脸检测介绍(7) : Haar特征CvHaarClassifierCascade等结构分析_第12张图片

将上述数据用图形表示出来就是:

AdaBoost 人脸检测介绍(7) : Haar特征CvHaarClassifierCascade等结构分析_第13张图片

将每个矩形乘以相应的权重可得:

(A+B+C+D)(1)+2B+2C=B+C(A+D)

这个就是我们前面提到的四矩阵特征,也是Haar-like特征模板之一。
  从以上三个例子以及查看xml文件可以发现一个重要特征:组成Haar特征的三个矩形的面积与权值的乘积之和为零!从Opencv的源码中也可以发现这一个特征,具体代码可见haar.cpp中函数cvSetImagesForHaarClassifierCascade(…) 的最后几行代码,如下图:

AdaBoost 人脸检测介绍(7) : Haar特征CvHaarClassifierCascade等结构分析_第14张图片

参考文献:

[1] 宋春雷,王龙等、学习理论与鲁棒控制、控制理论与应用、Vol 17(5), 633-636, 2000/10
[2] Valiant L.G.、A Theory of the Learnable、Communications of the ACM、Vol 27 (11), 1134-1142, 1984/11
[3] Kearns M.、The Computational Complexity of Machine Learning、Cambridge: MIT Press, 1990
[4] Kearns M.,Valiant L. G.、Cryptographic Limitations on Learning Boolean Formulae and Finite Automata、Journal of the ACM, 41(1):67-95, 1994/01
[5] Schapire R. E.、The Strength of Weak Learnability、Machine Learning, 1990, 5(2):197-227
[6] Drucker H.,Schapire R. E.,Simard P.、Boosting Performance in Neural Networks、International Journal of Pattern Recognition and Artificial Intelligence, 1993, 7(4):705-719
[7] Freund Y.、Boosting a Weak Learning Algorithm by Majority、Information and Computation, 1995, 121(2):256-285
[8] 基于AdaBoost算法的人脸检测——赵楠(北京大学,本科毕业论文)
[9] 博客:【图像处理】计算Haar特征个数
[10] 博客:浅析人脸检测之Haar分类器方法
[11] 博客:Adaboost 算法的原理与推导(读书笔记)
[12] 博客:AdaBoost人脸检测算法
[13] 博客:如何用OpenCV自带的adaboost程序训练并检测目标
[14] 博客:xml文件转换
[15] 博客:移植OpenCV的AdaBoost人脸检测算法到DM6467
[16] 博客:OpenCV中CascadeClassifier类实现多尺度检测源码解析
[17] 博客:OpenCV原理解读之HAAR+Adaboost

[同步本人网易博客的文章] AdaBoost 人脸检测介绍(7) : Haar特征CvHaarClassifierCascade等结构分析

你可能感兴趣的:(人脸检测)