Matlab基于Viola-Jones算法的人脸检测(1)

时间:2023-02-22 09:40:46

本文参考了算法原文和网上的资料,是笔者自己对Viola-Jones算法的理解,可能会有些偏差,请读者指正。
Viola-Jones算法是基于人脸的haar特征值进行人脸检测的方法,整体框架分成三个部分:
1、提取目标的特征,作者提取的是haar特征
2、分类器学习的过程,训练弱分类器成为最优弱分类器,多个最优弱分类器组合形成强分类器
3、强分类器进行级联,提高检测的速度和准确率

首先讲一下haar特征:
VJ使用的haar特征仅与一个矩形区域内像素取值的和有关,其特征取值为白色区域对应图像的像素值之和减去黑色区域对应图像的像素值之和。
Matlab基于Viola-Jones算法的人脸检测(1)

那么haar特征是如何应用于人脸的呢?

Matlab基于Viola-Jones算法的人脸检测(1)

我们来看上面的三幅图像,比如中间一幅表示眼睛区域的颜色比脸颊区域的颜色深,右边一幅表示鼻梁两侧比鼻梁的颜色要深。同样,其他目标,也可以用一些矩形特征来表示。
上面图像中显示的矩形区域是放大之后的,为了看起来方便,实际上一副图像中这样的特征数量太多,其计算复杂性是个问题,为此作者引入引入积分图技术,使得其计算效率大大提高。那什么是积分图技术呢?

Matlab基于Viola-Jones算法的人脸检测(1)

积分图是一张与原图大小一致的图,其每个像素/点的取值为其原图左上角所有像素取值的和。假设积分图中某点x的取值记为i(x),当要计算矩形D的像素和时只需要使用i(p4)-i(p2)-i(p3)+i(p1)即可.有了这样一张积分图之后,要计算某一区域的像素和就简化为四个点的加减运算,大大简化了运算

第二部分是分类器学习的过程
VJ采用的目标检测框架是基于Adaboost的分类器学习方法, 其用此选择特征并训练分类器。
Adaboost目的是提升一个简单分类器的性能,其通过组合多个弱分类器得到一个强分类器。
那么什么是弱分类器呢?作者定义了弱分类器的数学结构如下:
Matlab基于Viola-Jones算法的人脸检测(1)
一个弱分类器由子窗口图像x,一个特征f,指示不等号方向的p和阈值组成。P的作用是控制不等式的方向,使得不等式都是<号,形式方便。
从数学结构上可以看出,当特征值小于阈值时,弱分类器输出为1,即判定为人脸,大于阈值时,判定为非人脸。由此可见训练最优弱分类器的关键就在于寻找合适的阈值,使该分类器对所有样本的判读误差最低。
分类器阈值计算:
计算所有训练样本的特征值,并将其从小到大排序。扫描一遍排好序的特征值,
对排好序的表中的每个元素,当选取当前任意元素的特征值作为阈值时,所得到的弱分类器就在当前元素处把样本分开。
也就是这个阈值对应的弱分类器将当前元素前的所有元素分类为人脸,而把当前元素后的所有元素分类为非人脸
举个例子来说,假如有五个样本,前两个为人脸,后三个为非人脸,√√×××。假如把第一个的特征值当成阈值,因为是从小到大排序的,根据弱分类器的数学结构,五个样本通过弱分类器后判定为×××××,这有一个误差①,再将第二个特征值当成阈值,五个样本通过弱分类器后判定为√××××,这有一个误差②,以此类推会有5个误差,从这五个里面找个一个误差最小的当成阈值,这样就训练好了一个最优的弱分类器。
强分类器的诞生需要T轮的迭代,具体操作如下:
1. 给定训练样本集S,共N个样本,其中X和Y分别对应于正样本和负样本; T为训练的最大循环次数;  
2. 归一化样本权重为1/N ,即为训练样本的初始概率分布;  
3. 第一次迭代训练N个样本,得到第一个最优弱分类器,
4. 提高上一轮中被误判的样本的权重;
5. 将新的样本和上次被分错的样本放在一起进行新一轮的训练。
6. 循环执行4-5步骤,T轮后得到T个最优弱分类器。
7.组合T个最优弱分类器得到强分类器,组合方式如下:
Matlab基于Viola-Jones算法的人脸检测(1)
这个公式相当于让所有弱分类器投票,再对投票结果按照弱分类器的错误率加权求和,将投票加权求和的结果与平均投票结果比较得出最终的结果。

第三部分是级联
级联强分类器的原则是,将若干个强分类器由简单到复杂排列,希望经过训练使每个强分类器都有较高检测率,而误识率可以放低,比如几乎99%的人脸可以通过,但50%的非人脸也可以通过,这样如果有20个强分类器级联,那么他们的总识别率为0.99^20 98%,错误接受率也仅为0.5^20 0.0001%。
Matlab基于Viola-Jones算法的人脸检测(1)

算法大概就是这样,下面是算法原文
http://download.csdn.net/detail/amazinguu/9555474

下篇文章讲讲算法在Matlab里面的实现