Haar-like算法
当下的人脸检测主要为以下两种方法:
1.基于知识的检测方法:检测器官特征和器官之间的几何关系
2.基于「统计」的检测方法:像素相似性度量
基于知识的方法主要利用先验知识将人脸看作器官特征的组合,根据眼睛、眉毛、嘴巴、鼻子等器官的特征以及相互之间的几何位置关系来检测人脸。
基于统计的方法则将人脸看作一个整体的模式——二维像素矩阵,从统计的观点通过大量人脸图像样本构造人脸模式空间,根据相似度量来判断人脸是否存在。
本文主要介绍基于统计的检测方法Haar,Haar特征值反映了图像的灰度变化情况。通过改变特征模板的大小和位置,可在图像子窗口中穷举出大量的特征。
Haar分类器=Haar-like特征+AdaBoost算法+级联+积分图; 要理解Haar分类器,那么就需要理解构成它的每一部分。Haar-like特征:检测提供基础特征;积分图:为了加速特征的计算而使用的算法;AdaBoost:训练区分人脸与非人脸强分类器;级联:把强分类器级联在一起,提高准确率。
1.Haar-like特征
Haar-like是一种简单且高效的图像特征,其基于矩形区域相似的强度差异性Haar小波。w=白色区域像素之和-黑色区域像素之和得到的就是这个区域的一个特征值,这个特征值可以用来区分人脸与非人脸。当然,一个特征的区分度是很有限的。为了增加区分度,可以对多个矩形特征计算得到一个区分度更大的特征值,然而在一个窗口中怎样排列能够更好的体现人脸的特征,这是未知的所以需要AdaBoost算法去训练找到,在训练前需要将每种组合穷举出来,为了增加计算特征值的速度,使用了积分图。
Haar-like的特征矩形如下所示:
需要注意的是,当一次遍历结束后,窗口将在宽度或长度上成比例的放大,在重复之前的步骤,直到放大到最后最后一个比例。
设在宽度上可以放大的最大倍数为
,高度上可以放大的最大倍数为
,计算公式如下:
其中 Wi和hi使整个图像的宽高,Wwin和hwin是haar窗口的初始宽高,可以放大的倍数为
和
。
2.AdaBoost算法
一个弱分类器就是一个基本和上图类似的决策树,最基本的弱分类器只包含一个Haar-like特征,也就是它的决策树只有一层,被称为树桩(stump)。
弱分类器的训练即是找到一个分类阈值使其成为最优弱分类器。寻找的步骤:
- 对于每个特征f,计算所有训练样本的特征值,并按特征值大小排序。
- 扫描排序好的特征值,对排序好的每个元素,计算四个值。
- 全部人脸样本的权重之和t1;
- 全部非人脸样本的权重之和t0;
- 在此元素之前的非人脸样本的权重之和s0;
- 最终得到每个元素的分类误差r=min((s1+(t0-s0)),(s0+(t1-s1)))
- 寻找r值最小的元素作为最优阈值。
补充: 这最优的weak classifier是这么得来的,比如说对于特征A 我们用特征A对所有样本取特征值,然后根据特征值排序所有样本,可以想象,具有明显人脸特征的样本和具有明显非人脸特征的样本应该分别处于这个排序的两端,但肯定有一些样本 不是那么明显就能被A特征区分开,我们要做的是在其中取一个阈值。想象一个点在排好序的直线上滑动 滑动到某一个位置,使得我们能够最好的用特征A区分人脸和非人脸,也就是说,错误率最低,若得到这个阈值,则此时我们找到一个相对特征A的最优weak classifier。由此类推,对所有的特征都如法炮制。我们会得到对应于n个特征的n个最优weak classifier,从里面选一个最最优的,最后得出你想要的那个最优weak classifier。
强分类器的诞生需要T轮的迭代,具体操作如下:
- 给定训练样本集S,共N个样本,其中X和Y分别对应于正样本和负样本;T为训练的最大循环次数;
- 初始化样本权重为1/N ,即为训练样本的初始概率分布;
- 第一次迭代训练N个样本,得到第一个最优弱分类器。
- 提高上一轮中被误判的样本的权重;
- 将新的样本和上次分错的样本放在一起进行新一轮的训练。
- 循环执行4-5步骤,T轮后得到T个最优弱分类器。
- 组合T个最优弱分类器得到强分类器。
3.级联
通过组合多个强分类器来进一步处理图片信息,增加识别的准确率,级联的强分类器的复杂度逐渐增加来提高算法的识别准确度。
4.积分图
积分图是类似动态规划的方法,主要的思想是将图像从起点开始到各个点所形成的矩形区域像素之存在数组中,当要计算某个区域的像素和时可以直接从数组中索引,不需要重新计算这个区域的像素和,从而加快了计算。积分图求和公式如下:
其中 I(x,y)I(x,y) 表示图像 (x,y) 位置的像素值。积分图像可以采用增量的方式计算:
定义了积分图的概念,就可以很方便的计算任意区域内的像素和,如下图所示:
积分图数组初始化之后, 我们就得到了一张积分图:
为了计算某个矩形像素和,比如区域 Rd
内所有点的像素值之和(积分)可以表示为: