机器学习: Viola-Jones 人脸检测算法解析(二)
2016-12-28 14:56
435 查看
上一篇博客里,我们介绍了VJ人脸检测算法的特征,就是基于积分图像的矩形特征,这些矩形特征也被称为Haar like features, 通常来说,一张图像会生成一个远远高于图像维度的特征集,比如一个 24×24 的图像,会生成162336个矩形特征。在实时的人脸检测应用中,不可能把所有的特征都用上,所有需要做特征选择,这篇博客里,我们将要介绍AdaBoost的训练方法和基于AdaBoost的层级分类器。
h(x)=sign⎛⎝∑j=1Mαjhj(x)⎞⎠
h(x) 就是一个”强”分类器,而 hj(x) 就是”弱”分类器,hj(x) 其实是一个简单的阈值函数:
hj(x)={−sj,sj,iffj<θjotherwise
θj 就是阈值,sj∈{−1,1} 以及系数 αj 都由训练的时候确定。结合维基百科和IJCV上的文章 Robust Real-Time Face Detection , 训练算法的具体流程如下:
给定一组N 个训练样本(xi,yi), 其中含有m 个正样本, l 个负样本, 如果 xi 是人脸图像,则 yi=1, 否则 yi=−1,
对每一个训练样本 i 赋予一个初始的权值: wi1=1/N
假设一张图像会产生M 个特征,对于每一个特征 fj, j=1,2,...M
1) 对权值重新归一化 wij=wij∑Nt=1wtj
2) 遍历训练集中每个样本特征fj,寻找最优的 θj, sj 使其分类误差最小即: θj,sj=argminθ,s∑Ni=1wijϵij,
其中 ϵij={01ifyi=hj(xi,θj,sj)otherwise
3) 更新下一个特征的权值: wj+1,i=wj,i⋅β1−eij, 如果样本xi 被正确识别则ei=0,否则ei=1. βj=ϵj1−ϵj
遍历所有的特征, 可以得到最终的分类器 h(x)=sign(∑Mj=1αjhj(x)) , αj=log1βj
在层级分类器架构中,每一层次含有一个”强”分类器,所有的矩形特征被分成几组,每一组都包含部分矩形特征,这些矩形特征用在层级分类器的每一阶段,层级分类器的每一阶段都会判别输入的区域是不是人脸,如果肯定不是,那么这个区域会被立即舍弃掉,只有那些被判别为可能是人脸的区域才会被传入下一阶段用更为复杂的分类器进一步的判别。其流程图如下所示:
![](https://img-blog.csdn.net/20161228093456333?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWF0cml4X3NwYWNl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
从上图可以看出,所有的局部区域 (sub-windows) 会用比较简单的特征表示,如下图所示。下面的两种特征可以达到100%的检测率,但是也会产生很多的 false positive,一般来说是 50%的FP rate。但是这两种特征对 negative 区域的识别非常高效,所以层级分类器的第一层基本都是用这两种特征加上一个”强”分类器先将大量的negative 区域剔除。对于 false positive 的处理,有赖于后面阶段更多的特征及分类器。
![](https://img-blog.csdn.net/20161228093747225?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWF0cml4X3NwYWNl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
层级分类器的总的识别率D或者false positive F, 是每一层的分类器的识别率 d 和 false postivie f 的乘积,即:
D=∏i=1Kdi
F=∏i=1Kfi
我们利用AdaBoost 训练分类器的时候,目标函数是分类误差,分类误差不能同时反映检测率与false positive rate, 我们可以通过改变阈值的方法来调整检测率与false positive rate, 一般来说,高阈值的分类器的检测率以及false positive rate 都会比较低,而低阈值的分类器的检测率及false positive rate都很高。此外,测试更多的特征将使得分类器提高识别率同时降低false positive rate, 但是测试更多的特征,也会耗费更多的时间。所以一个层级分类器,将综合考虑以下几个因素:
层级分类器的层次,即需要多少个分类器;
每一层分类器需要测试的特征数 ni;
每一层分类器的阈值。
IJCV 的文章提到的算法如下图所示:
![](https://img-blog.csdn.net/20161228142603594?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWF0cml4X3NwYWNl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
一开始需要定义每一层分类器的最大 false positive rate f, 以及最小的检测率 d, 并且需要定义一个全局的 false positive rate Ftarget , 训练的过程中,逐渐增加特征数,利用AdaBoost 进行训练,训练好之后,利用validation set 计算 Fi 和 Di, 逐渐降低第 i 个分类器的阈值,直到当前的层级分类器的检测率不低于 d×Di−1, 然后清空负样本集, 利用当前的层级分类器在数据集上做测试,将所有的 false detections 作为负样本传入下一层分类器的训练。
只有层级分类器的总得 false positive rate Fi 高于设定的 Ftarget,就要增加一层分类器。而后面层的负样本都是由前面分类器产生的 false positive 样本。
在IJCV的文章里,VJ 分类器最后一共是38层,并且含有 6060个特征。 作者给出了前面7层的特征数:
2->10->25->25->50->50->50
参考来源:
https://en.wikipedia.org/wiki/Viola%E2%80%93Jones_object_detection_framework
Viola, Jones: Robust Real-Time Face Detection, IJCV 2001
AdaBoost 分类
AdaBoost 可以同时进行特征选择与分类器训练,简单来说,AdaBoost 就是将一系列的”弱”分类器通过线性组合,构成一个”强”分类器。如下所示:h(x)=sign⎛⎝∑j=1Mαjhj(x)⎞⎠
h(x) 就是一个”强”分类器,而 hj(x) 就是”弱”分类器,hj(x) 其实是一个简单的阈值函数:
hj(x)={−sj,sj,iffj<θjotherwise
θj 就是阈值,sj∈{−1,1} 以及系数 αj 都由训练的时候确定。结合维基百科和IJCV上的文章 Robust Real-Time Face Detection , 训练算法的具体流程如下:
给定一组N 个训练样本(xi,yi), 其中含有m 个正样本, l 个负样本, 如果 xi 是人脸图像,则 yi=1, 否则 yi=−1,
对每一个训练样本 i 赋予一个初始的权值: wi1=1/N
假设一张图像会产生M 个特征,对于每一个特征 fj, j=1,2,...M
1) 对权值重新归一化 wij=wij∑Nt=1wtj
2) 遍历训练集中每个样本特征fj,寻找最优的 θj, sj 使其分类误差最小即: θj,sj=argminθ,s∑Ni=1wijϵij,
其中 ϵij={01ifyi=hj(xi,θj,sj)otherwise
3) 更新下一个特征的权值: wj+1,i=wj,i⋅β1−eij, 如果样本xi 被正确识别则ei=0,否则ei=1. βj=ϵj1−ϵj
遍历所有的特征, 可以得到最终的分类器 h(x)=sign(∑Mj=1αjhj(x)) , αj=log1βj
层级分类器
在一张正常的图像中,包含人脸的区域只占整张图像中很小的一部分,如果所有的局部区域都要遍历所有特征的话,这个运算量非常巨大,也非常耗时,所以为了节省运算时间,应该把更多的检测放在潜在的正样本区域上。所以有了层级分类器的概念,层级分类器就是为了将任务简化,一开始用少量的特征将大部分的negative 区域剔除,后面再利用复杂的特征将 false positive 区域剔除。在层级分类器架构中,每一层次含有一个”强”分类器,所有的矩形特征被分成几组,每一组都包含部分矩形特征,这些矩形特征用在层级分类器的每一阶段,层级分类器的每一阶段都会判别输入的区域是不是人脸,如果肯定不是,那么这个区域会被立即舍弃掉,只有那些被判别为可能是人脸的区域才会被传入下一阶段用更为复杂的分类器进一步的判别。其流程图如下所示:
从上图可以看出,所有的局部区域 (sub-windows) 会用比较简单的特征表示,如下图所示。下面的两种特征可以达到100%的检测率,但是也会产生很多的 false positive,一般来说是 50%的FP rate。但是这两种特征对 negative 区域的识别非常高效,所以层级分类器的第一层基本都是用这两种特征加上一个”强”分类器先将大量的negative 区域剔除。对于 false positive 的处理,有赖于后面阶段更多的特征及分类器。
层级分类器的总的识别率D或者false positive F, 是每一层的分类器的识别率 d 和 false postivie f 的乘积,即:
D=∏i=1Kdi
F=∏i=1Kfi
我们利用AdaBoost 训练分类器的时候,目标函数是分类误差,分类误差不能同时反映检测率与false positive rate, 我们可以通过改变阈值的方法来调整检测率与false positive rate, 一般来说,高阈值的分类器的检测率以及false positive rate 都会比较低,而低阈值的分类器的检测率及false positive rate都很高。此外,测试更多的特征将使得分类器提高识别率同时降低false positive rate, 但是测试更多的特征,也会耗费更多的时间。所以一个层级分类器,将综合考虑以下几个因素:
层级分类器的层次,即需要多少个分类器;
每一层分类器需要测试的特征数 ni;
每一层分类器的阈值。
IJCV 的文章提到的算法如下图所示:
一开始需要定义每一层分类器的最大 false positive rate f, 以及最小的检测率 d, 并且需要定义一个全局的 false positive rate Ftarget , 训练的过程中,逐渐增加特征数,利用AdaBoost 进行训练,训练好之后,利用validation set 计算 Fi 和 Di, 逐渐降低第 i 个分类器的阈值,直到当前的层级分类器的检测率不低于 d×Di−1, 然后清空负样本集, 利用当前的层级分类器在数据集上做测试,将所有的 false detections 作为负样本传入下一层分类器的训练。
只有层级分类器的总得 false positive rate Fi 高于设定的 Ftarget,就要增加一层分类器。而后面层的负样本都是由前面分类器产生的 false positive 样本。
在IJCV的文章里,VJ 分类器最后一共是38层,并且含有 6060个特征。 作者给出了前面7层的特征数:
2->10->25->25->50->50->50
参考来源:
https://en.wikipedia.org/wiki/Viola%E2%80%93Jones_object_detection_framework
Viola, Jones: Robust Real-Time Face Detection, IJCV 2001
相关文章推荐
- 机器学习: Viola-Jones 人脸检测算法解析(一)
- haar 人脸检测算法 Viola Jones Face Detector
- Viola-Jones人脸检测--Harr特征 推荐
- 笔记_人脸检测框架(Viola-Jones Objects detection framwork)
- Viola-Jones人脸检测--AdaptBoost特征选择
- Viola-Jones人脸检测
- 人脸检测:Viola-Jones
- Viola&Jones的人脸检测说起 分类: 计算机视觉(转载) 2014-08-08 16:46 155人阅读 评论(0) 收藏
- 畅所欲言第1期 - 从Viola&Jones的人脸检测说起
- cvpr读书笔记[1]:VJ人脸检测框架。Viola-Jones Objects detection framwork
- 畅所欲言第1期 - 从Viola&Jones的人脸检测说起
- 从Viola&Jones的人脸检测说起
- 从Viola&Jones的人脸检测说起
- 使用OpenCV进行人脸检测(Viola-Jones人脸检测方法)
- 从Viola&Jones的人脸检测说起
- Viola&Jones的人脸检测说起
- cvpr读书笔记[1]:VJ人脸检测框架。Viola-Jones Objects detection framwork
- AdaBoost中利用Haar特征进行人脸识别算法分析与总结2——级联分类器与检测过程 .
- 移植OpenCV的AdaBoost人脸检测算法到DM6467
- AdaBoost人脸检测训练算法 (中)