Haar特征计算过程【DataWhale学习记录】

0 前言

本文重点在于对4 haar特征值的一般性计算过程5 Haar的分类过程 7 积分图优化Haar特征计算效率进行了详细的介绍,也是比较有意思的部分。

但是由于本人水平有限,关于“利用并查集 合并 检测结果窗口”并没有得到介绍。

1 人脸检测的方法分类

目前人脸检测的方法主要有两大类:基于知识和基于统计。

基于知识的方法:主要利用先验知识将人脸看作器官特征的组合,根据眼睛、眉毛、嘴巴、鼻子等器官的特征以及相互之间的几何位置关系来检测人脸。主要包括模板匹配、人脸特征、形状与边缘、纹理特性、颜色特征等方法。

基于统计的方法:将人脸看作一个整体的模式——二维像素矩阵,从统计的观点通过大量人脸图像样本构造人脸模式空间,根据相似度量来判断人脸是否存在。主要包括主成分分析与特征脸、神经网络方法、支持向量机、隐马尔可夫模型、Adaboost算法等。

本文中介绍的Haar分类器方法,包含了Adaboost算法,稍候会对这一算法做详细介绍。所谓分类器,在这里就是指对人脸和非人脸进行分类的算法,在机器学习领域,很多算法都是对事物进行分类、聚类的过程。

2 Haar特征

目前最常用的还是Haar-like特征,描述图像的特征,多用于人脸检测、行人检测,等目标检测;Haar-like特征可以理解为卷积模板(如同prewitt、sobel算子,当然不完全一样),Haar-like特征模板内只有白色和黑色两种矩形,并定义该模板的特征值为白色矩形像素和减去黑色矩形像素和。Haar特征值反映了图像的灰度变化情况

Haar-like特征可以分为四类:线性特征、边缘特征、点特征(中心特征)、对角线特征;
也可以分成三类:边缘特征、线性特征(包含对角线特征)、点特征(中心特征)

特征分类图示
在这里插入图片描述

3 Haar分类器算法的步骤

Haar分类器 = Haar-like特征 + 积分图方法 + AdaBoost +级联;

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

  • 使用Haar-like特征做计算做检测。

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

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

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

4 一般的Haar特征求值过程

特征计算的流程示意图

从图像的左上角开始,设定固定大小的窗口从左至右,从上至下进行滑动覆盖相应像素点区域。
同时对于每一个窗口覆盖的像素点区域,设定固定大小的特征模板从左到右,从上至下进行滑动覆盖像素点区域。

其中

  • 特征模板也叫特征原型,它的称谓是相较于以它为基础,模板发生大小改变后的特征矩形而言的。

  • 特征原型在图像子窗口中扩展(平移伸缩)得到的特征称为“矩形特征”;矩形特征的值称为“特征值”。

假设一个特征大小为2×1的特征模板,和24×24的图像窗口
该特征模板可以水平滑动23步,垂直滑动24步,所以共有23×24个特征值。

而事实上,矩形特征值是由矩形模版类别、矩形位置和矩形大小这三个因素的函数。

因此当特征模板的大小和类别也发生变化的时候,一个图像得到的特征值的数量要暴增。
比如,在24*24像素大小的检测窗口内矩形特征数量可以达到16万个。如果还有新的模板加入,窗口的大小发生变动,这个特征数量还会增加。

至此,一般的Haar特征计算过程即是如此,一张图像,经过不同的模板滑动,不同模板的不同大小的矩形的滑动,可以得到N个特征值。

但是对于一般的Haar分类器来讲,特征计算只是一个小步骤,最终要经过某种算法比如AdaBoost算法来进行训练,以判别哪些矩形的特征是对分类器分类最有效的。

至此可以观察到:
(1)在检测窗口通过平移+缩放可以产生一系列Haar特征,这些特征由于位置和大小不同,分类效果也不同;

(2)通过计算Haar特征的特征值,可以有将图像矩阵映射为1维特征值,有效实现了降维。

5 Haar分类过程

5.1 AdaBoost的简介

AdaBoost的老祖宗可以说是机器学习的一个模型,它的名字叫PAC(Probably Approximately Correct)。

简单说来,PAC学习模型不要求你每次都正确,只要能在多项式个样本和多项式时间内得到满足需求的正确率,就算是一个成功的学习。

基于PAC学习模型的理论分析,Valiant牛提出了Boosting算法Boosting算法涉及到两个重要的概念就是弱学习和强学习

所谓的弱学习,就是指一个学习算法对一组概念的识别率只比随机识别好一点,所谓强学习,就是指一个学习算法对一组概率的识别率很高。

现在我们知道所谓的弱分类器和强分类器就是弱学习算法和强学习算法。弱学习算法是比较容易获得的,获得过程需要数量巨大的假设集合,这个假设集合是基于某些简单规则的组合和对样本集的性能评估而生成的,而强学习算法是不容易获得的

然而,Kearns 和Valiant 两头牛提出了弱学习和强学习等价的问题, 并证明了只要有足够的数据,弱学习算法就能通过集成的方式生成任意高精度的强学习方法。这一证明使得Boosting有了可靠的理论基础,Boosting算法成为了一个提升分类器精确性的一般性方法。

Boosting算法还是存在着几个主要的问题,其一Boosting算法需要预先知道弱学习算法学习正确率的下限即弱分类器的误差,其二Boosting算法可能导致后来的训练过分集中于少数特别难区分的样本,导致不稳定。针对Boosting的若干缺陷,Freund和Schapire牛于1996年前后提出了一个实际可用的自适应Boosting算法AdaBoost。

AdaBoost目前已发展出了大概四种形式的算法,Discrete AdaBoost(AdaBoost.M1)、Real AdaBoost、LogitBoost、gentle AdaBoost

5.2 最优弱分类器的孵化
5.2.1 弱分类器的简介

最初的弱分类器可能只是一个最基本的Haar-like特征,计算输入图像的Haar-like特征值,和最初的弱分类器的特征值比较,以此来判断输入图像是不是人脸,然而这个弱分类器太简陋了,可能并不比随机判断的效果好。

对弱分类器的孵化就是训练弱分类器成为最优弱分类器,注意这里的最优不是指强分类器,只是一个误差相对稍低的弱分类器,训练弱分类器实际上是为分类器进行设置的过程
在这里插入图片描述
一个弱分类器由子窗口图像x,一个特征f,指示不等号方向的p和阈值 θ \theta θ组成。P的作用是控制不等式的方向,使得不等式都是<号,形式方便。

5.2.2 弱分类器与决策树的联系

而阈值与决策树相关。
举个最简单的决策树例子,假设我们使用三个Haar-like特征f1,f2,f3来判断输入数据是否为人脸,可以建立如下决策树:
在这里插入图片描述
一个弱分类器就是一个基本和上图类似的决策树最基本的弱分类器只包含一个Haar-like特征,也就是它的决策树只有一层,被称为树桩(stump)。

其中,最重要的就是如何决定每个结点判断的输出,要比较输入图片的特征值和弱分类器中特征,一定需要一个阈值,当输入图片的特征值大于该阈值时才判定其为人脸。

训练最优弱分类器的过程实际上就是在寻找合适的分类器阈值,使该分类器对所有样本的判读误差最低。

5.2.3 最优弱分类器的计算过程

(以下内容有的内容简化了,没有具体解释,但是我想大家应该从中能够较为具象地明白最优弱分类器的计算过程。)

  1. 对于每个特征 f,计算所有训练样本的特征值,并将其排序。
  • 扫描一遍排好序的特征值,对排好序的表中的每个元素,计算下面四个值:

  • 全部人脸样本的权重的和t1;

  • 全部非人脸样本的权重的和t0;

  • 在此元素之前的人脸样本的权重的和s1;

  • 在此元素之前的非人脸样本的权重的和s0;

  1. 最终求得每个元素的分类误差
    在这里插入图片描述

在表中寻找r值最小的元素,则该元素作为最优阈值有了该阈值,我们的第一个最优弱分类器就诞生了。

5.2.4 强分类器的产生

强分类器的诞生需要T轮的迭代,具体操作如下:

  1. 给定训练样本集S,共N个样本,其中X和Y分别对应于正样本和负样本; T为训练的最大循环次数;

  2. 初始化样本权重为1/N ,即为训练样本的初始概率分布;

  3. 第一次迭代训练N个样本,得到第一个最优弱分类器,步骤见2.2.2节

  4. 提高上一轮中被误判的样本的权重;

  5. 将新的样本和上次本分错的样本放在一起进行新一轮的训练。

  6. 循环执行4-5步骤,T轮后得到T个最优弱分类器

  7. 组合T个最优弱分类器得到强分类器,组合方式如下:
    在这里插入图片描述
    在这里插入图片描述

对于该公式的理解,用文字描述即是:相当于让所有弱分类器投票,再对投票结果按照弱分类器的错误率加权求和,将投票加权求和的结果与平均投票结果比较得出最终的结果

5.2.5 级联分类器的产生

我们看到了通过AdaBoost算法辛苦的训练出了强分类器然而在现实的人脸检测中只靠一个强分类器还是难以保证检测的正确率,这个时候,需要一个豪华的阵容,训练出多个强分类器将它们强强联手,最终形成正确率很高的级联分类器这就是我们最终的目标Haar分类器。

图片输出大量的子窗口图像,这些子窗口图像经过筛选式级联分类器会不断地被每一个节点筛选,抛弃或通过,结构如下图示:
在这里插入图片描述
级联强分类器的策略是,将若干个强分类器由简单到复杂排列,希望经过训练使每个强分类器都有较高检测率,而误识率可以放低,比如几乎99%的人脸可以通过,但50%的非人脸也可以通过,**这样如果有20个强分类器级联,那么他们的总识别率为0.99^20 98%,错误接受率也仅为0.5^20 0.0001%。**这样的效果就可以满足现实的需要了。

但是如何使每个强分类器都具有较高检测率呢,为什么单个的强分类器不可以同时具有较高检测率和较高误识率呢?

一般的来说,AdaBoost训练出来的强分类器一般具有较小的误识率,但检测率并不很高,一般情况下,高检测率会导致高误识率,这是强分类阈值的划分导致的。

要提高强分类器的检测率既要降低阈值,要降低强分类器的误识率就要提高阈值,这是个矛盾的事情

据参考论文的实验结果,增加分类器个数可以在提高强分类器检测率的同时降低误识率,所以级联分类器在训练时要考虑如下平衡,一是弱分类器的个数和计算时间的平衡,二是强分类器检测率和误识率之间的平衡。

5.2.6 Haar分类器的检测体系

至今为止我们好像一直在讲分类器的训练,实际上Haar分类器是有两个体系的,训练的体系,和检测的体系。

那么训练级联分类器的目的就是为了检测的时候,更加准确,这涉及到Haar分类器的另一个体系,检测体系。

经过上面的介绍我们通过最优弱分类器并联成为强分类器,强分类器串联成为级联分类器,得到比较好的分类器。接下来是检测分类器性能的过程

检测体系是以现实中的一幅大图片作为输入,然后对图片中进行多区域,多尺度的检测,所谓多区域,是要对图片划分多块,对每个块进行检测

由于训练的时候用的照片一般都是20*20左右的小图片,所以对于大的人脸,还需要进行多尺度的检测,多尺度检测机制一般有两种策略

  • 一种是不改变搜索窗口的大小,而不断缩放图片,这种方法显然需要对每个缩放后的图片进行区域特征值的运算,效率不高。
  • 另一种方法,是不断初始化搜索窗口size为训练时的图片大小,不断扩大搜索窗口,进行搜索,解决了第一种方法的弱势

如此:
首先,通过滑动窗口,得到一个图像的一维N个特征值的特征向量。
然后,通过级联分类器中并联的最优弱分类器的的阈值,选择性抛弃部分的特征,而后通过级联分类器的多个强分类器的串联,使得分类准确率得到提升。

其中,在区域放大的过程中会出现同一个人脸被多次检测,这需要进行区域的合并,这里不作探讨,可以参考文章haar+adaboost结合讲解(偏重实际)

如果这个地方,读者并没有得到整体的大概的了解,那一定是我的原因,请详细看文章:浅析人脸检测之Haar分类器方法

6 Haar特征值归一化处理

6.1 特征值的含义

首先,需要设定一个场景感受一下特征值的含义
我们选取MIT人脸库中2706个大小为20*20的人脸正样本图像,计算如下图所示的Haar特征:
在这里插入图片描述
其中,左边对应的人眼区域,右边无具体意义。
在这里插入图片描述
可以看到,图中2个不同Haar特征在同一组样本中具有不同的特征值分布,左边特征计算出的特征值基本都大于0(对样本的区分度大),而右边特征的特征值基本均匀分布于0两侧(对样本的区分度小)。所以,正是由于样本中Haar特征值分布不均匀,导致了不同Haar特征分类效果不同。显而易见,对正负样本区分度越大的特征分类效果越好,即红色曲线对应图中的的左边Haar特征分类效果好于右边Haar特征。

从上图我们可以发现,仅仅一个12*8大小的Haar特征计算出的特征值变化范围从-2000~+6000,跨度非常大。这种跨度大的特性不利于量化评定特征值,所以需要进行“归一化”,压缩特征值范围。

6.2 特征值归一化处理

假设当前检测窗口中的图像像素为i(x,y),当前检测窗口为w∗h大小(例如上图中为20*20大小),OpenCV采用如下方式“归一化”
(方便起见,直接copy了。)
在这里插入图片描述

7 积分图优化Haar特征计算效率

上文解释到经过Haar计算会得到超级多的特征值,那么如何快速的计算这些值,就成了优化工作的一部分。

答案是积分图

积分图并不像我们想象的难,恰恰相反,非常简单。

对于一个灰度图像I而言,其积分图也是一张与I尺寸相同的图,只不过该图上任意一点(x,y)的值是指从灰度图像I的左上角与当前点所围成的举行区域内所有像素点灰度值之和,有点耳熟吧。类似于图像直方图与图像累积直方图的关系,这里只不过是二维的图像。

构造过程如下图所示:
积分图的构造过程
积分图能够加速计算的原因就在于,它只需要知道此特征矩形的四个端点,通过固定的加减法公式就可以得到特征值

具体的计算过程示例如下:

上面已经知道,一个区域的像素值的和,可以由该区域的端点的积分图来计算。由前面特征模板的特征值的定义可以推出,矩形特征的特征值可以由特征端点的积分图计算出来。以A矩形特征为例,如下图,使用积分图计算其特征值:
在这里插入图片描述
该矩形特征的特征值,由定义,为区域A的像素值减去区域B的像素值。
区域A的像素值:
i i ( 5 ) + i i ( 1 ) − i i ( 2 ) − i i ( 4 ) ii(5) + ii(1) - ii(2) - ii(4) ii(5)+ii(1)ii(2)ii(4)
区域B的像素值:
i i ( 6 ) + i i ( 2 ) − i i ( 5 ) − i i ( 3 ) ii(6) + ii(2) - ii(5) - ii(3) ii(6)+ii(2)ii(5)ii(3)
所以:该矩形特征的特征值
i i ( 5 ) + i i ( 1 ) − i i ( 2 ) − i i ( 4 ) − [ i i ( 6 ) + i i ( 2 ) − i i ( 5 ) − i i ( 3 ) ] ii(5) + ii(1) - ii(2) - ii(4) - [ii(6) + ii(2) - ii(5) - ii(3)] ii(5)+ii(1)ii(2)ii(4)[ii(6)+ii(2)ii(5)ii(3)]

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

参考文章
【图像处理】计算Haar特征个数

第九节、人脸检测之Haar分类器

haar+adaboost结合讲解(偏重实际)

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

  • 1
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值