人脸检测之Haar分类器
一:Haar分类器相关内容
人脸检测两类:基于知识、基于统计;
基于知识:模板检测、人脸特征、形状与边缘、纹理特征、颜色特征;
基于统计的人脸检测(ML):主成分分析与特征脸、神经网络、支持向量机(SVM)、Adaboost算法;
分类器:此处指对人脸非人脸分类的算法。
- 分类与聚类的区别:
1.分类:已经物体类别总数的识别方式,训练的数据含有标签,属于监督学习。
2.聚类:类别总数不确定,训练数据没有标签,属于无监督学习。
- Haar分类器、Boosting算法、Adaboost算法的关系:
Haar分类器 = Haar-like特征 + 积分图方法 + AdaBoost + 级联;Boosting算法是一种针对提高分类器精确度的算法。Adaboost是对Boosting算法的一种优化,对其的提升。Haar分类器是Adaboost的一种应用。
二.Haar分类器简介
2.1Haar-like特征:
假设在人脸检测时我们需要有这么一个子窗口在待检测的图片窗口中不断的移位滑动,子窗口每到一个位置,就会计算出该区域的特征,然后用我们训练好的级联分类器对该特征进行筛选,一旦该特征通过了所有强分类器的筛选,则判定该区域为人脸。
- 两种常见的Haar-like特征:
特征值 = 白色区域的像素和 — 黑色区域的像素和。
由此计算出的特征值,人脸和非人脸应该有所不同,以做出区分。
Adaboost用于选出适合的矩形特征。
2.AdaBoost如实道来
PAC模型:(机器学习模型)Valiant认为“学习"是模式明显清晰或模式不存在时仍能获取知识的一种“过程”,并给出了一个从计算角度来获得这种“过程"的方法,
这种方法包括:
(1)适当信息收集机制的选择;
(2)学习的协定;
(3)对能在合理步骤内完成学习的概念的分类。
PAC学习的实质就是在样本训练的基础上,使算法的输出以概率接近未知的目标概念。
PAC学习模型是考虑样本复杂度(指学习器收敛到成功假设时至少所需的训练样本数)和计算复杂度(指学习器收敛到成功假设时所需的计算量)的一个基本框架,成功的学习被定义为形式化的概率理论。
弱学习:一个学习算法的识别率只比岁及识别好一点。
强学习:一个学习算法的识别率很高。由这两种算法分别形成的是弱分类器和强分类器。
Boosting算法的理论基础:弱学习算法能通过集成(级联)的办法生成任意精确度的强学习算法。
2.2.2弱分类器的得到
最初弱分类器太简陋,需要对其优化成为最优弱分类器,即使得误差相对较低。训练的过程即是对分类器设置的过程。
- 弱分类器的数学结构:
X:子窗口图像; f:一个特征;p:指示不得好的方向;theta:阈值。
- 分类和回归的区别:
1. 分类:预计结果只有两种可能(是、否,0-1)使用的概念;
2. 回归:预计结果可能为实数(房价,患者)。就是对预计结果的区分。
- 人脸检测弱分类器,建立如下决策树:通过三个Haar-like特征判断输入是否是人脸。
注释:每个非叶子节点代表一种判断;每个路径代表一种判断的输出;每个叶子节点代表一种类别,作为最终的判断结果。
重点:如何决定每个节点的判断输出,比较输入图片的特征值和弱分类器的特征,与阈值作比较。
训练实质:寻找合适的分类器阈值,使分类器对所有样本的判断误差最低。
- 操作过程:
(1)对于每个特征 f,计算所有训练样本的特征值,并将其排序。
扫描一遍排好序的特征值,对排好序的表中的每个元素,计算下面四个值:
全部人脸样本的权重的和t1;
全部非人脸样本的权重的和t0;
在此元素之前的人脸样本的权重的和s1;
在此元素之前的非人脸样本的权重的和s0;
(2)最终求得每个元素的分类误差。表中r值最小的元素为最优阈值。
2.2.3弱分类器的化蝶飞
此处主要将讲弱分类器如何迭代成为强分类器,通过对弱分类器的训练,组合多个最优弱分类器得到强分类器。
2.3强分类器的级联
Haar分类器的两个体系:训练体系和检测体系。训练体系即如何训练得到一个强分类器。一个强分类器不能保证正确率,所以对其进行级联得到正确率较高的分类器。
检测体系:输入一幅大的图片进行多区域、多尺度检测。
多区域检测:将图片划分为多块,对每个块进行检测。
多尺度检测:1.不改变搜索窗口大小,不断缩放图片;2.不断初始化搜索窗口size,不断扩大搜索窗口进行搜索。
- 结构如下:
2.4级联分类器的训练
分类器级联流程:
由Adaboost训练出的强分类器:较小的误识率、检测率不高。
强分类阈值的划分会导致,高检测率会导致高误识率。
所以人脸识别中存在一个矛盾:提高检测率需要降低阈值,降低误识率要提高阈值。所以采用级联强分类器的方法。
- 级联强分类器:
1. 每个强分类器由较高的检测率,误识率放低。
2. 例如:99%的人脸可以通过,50%的人脸也可以通过。20个级联,总识别率 = 0.9
的20次方 = 98%,误识率 = 0.5的20次方 = 0.0001%。
- 模型建立:
1. 设K:一个级联检测器的层数;D:该级联分类的检测率;F:该级联分类器的误识率;di:第i层强分类器的检测率;fi:第i层强分类器的误识率。
2. D,F即为一个级联分类器达到的值,所以通过训练每层的d和f值达到目标。以满足d^K = D;f^K = F。
- 伪代码如下:
1)设定每层最小要达到的检测率d,最大误识率f,最终级联分类器的误识率Ft;
2)P=人脸训练样本,N=非人脸训练样本,D0=1.0,F0=1.0;
3)i=0;
4)for : Fi>Ft
++i;
ni=0;
Fi=Fi-1;
for : Fi>f*Fi-1
++ni;
利用AdaBoost算法在P和N上训练具有ni个弱分类器的强分类器;
衡量当前级联分类器的检测率Di和误识率Fi;
for : di<d*Di-1;
降低第i层的强分类器阈值;
衡量当前级联分类器的检测率Di和误识率Fi;
N = Φ;
利用当前的级联分类器检测非人脸图像,将误识的图像放入N;
- 分类器生成及使用
一个高准确率的级联分类器的主要生成步骤如下:
1.大量样本集合,特征值的提取
2.通过adaboost 训练多个弱分类器并迭代为强分类器
3.多层级联强分类器,得到最终的级联分类器
训练完成后得到结果以xml形式保存,得到分类器文件,opencv可以直接加载分类器文件,并给出了API。
相关博客:
http://blog.youkuaiyun.com/jscese/article/details/54409627
http://www.cnblogs.com/ello/archive/2012/04/28/2475419.html
http://blog.youkuaiyun.com/jscese/article/details/52954208