基于adaboost算法的人脸检测_关于人脸那点事——基于Adaboosting的人脸检测(二)...

640c1d424565a149c0dbb9b42ab4cfb1.png

一、OpenCV中的Haar分类器

在2001年,Viola和Jones发表了经典的《Rapid Object Detection using a Boosted Cascade of Simple Features》和《Robust Real-Time Face Detection》,论文中基于Adaoosting算法,使用类haar特征对人脸进行检测,并对Adaboosting得到的强分类器级联,进而可以较准确的完成人脸检测,论文中的检测器也被称为Viola-Jones检测器。之后Rainer Lienhart和Jochen Maydt发表了文章《An Extended Set of Haar-like Features for Rapid Object Detection》,文章使用了对角特征,对Viola-Jones检测器进行了扩展,这篇文章的算法,也正是OpenCV收录的Haar分类器。

二、Haar分类器的原理

(一)OpenCV中的haar特征

  1. haar特征的种类:

OpenCV中有三类haar特征(5种BASIC特征,3种Core特征,6种Titled特征),如下图:

2b73e9db5c3eddfdf31adc13ad8b9e2f.png
图2.1 haar特征种类

图中的黑色区域的权重为-1,白色区域权重为1。三、如何训练

2. haar特征的统计

在OpenCV的haar分类器中,默认使用的BASIC特征。我们以x3类haar特征为例,介绍如何生成haar特征。

c3b22c3a1ac3f87b2e1d80166db664b0.png
图2.2 haar特征计算

如图所示,红色框为检测区域,我们计算检测区域的haar特征。由基础的x3特征,沿x方向和y方向放大,并且在每次放大以后在检测区域内平移,会生成x3系列特征值。

假设x3特征的宽和高为w、h,检测区域的宽和高为W、H,则在x方向和y方向最大放大系数X、Y为:

产生的特征数量为:

计算时,按照x方向产生的特征数量、y方向产生的特征数量,然后相乘起来即可得到上式结果。举个例子,检测窗口为60*60时,w=3, h=1,W=H=60,一共产生1079700个子特征。

3. haar特征的计算

应用某种haar特征模板生成haar特征值时,haar特征值=整个区域像素和*权重+黑色区域像素和*权重。例如x3特征中,整个像素和的权重为1,黑色区域的权重为-3。权重的设计原则为保证白色和与黑色区域的权重和为0。

按照上述方式计算的haar特征值的范围非常大,因此在使用时,需要把haar特征值进行标准化,这里介绍OpenCV中标准化haar特征的方法:

(1)假设检测窗口为(w*h),计算(w-2)*(h-2)的图像区域的灰度值的和与平方和:

(2)计算平均值:

(3)计算标准化因子:

(4)标准化后的特征为:

4. 弱分类器和强分类器

一个完整的弱分类器包含:(1)若干haar特征和每个haar特征有一个阈值;(2)若干个leftValue和若干个rightValue。

如下图所示,是一个深度为2的弱分类器结构。

a3ba92754d19d97f3d9746d317663b99.png
图2.3 深度为2的弱分类器

具体为:计算第一个haar特征的特征值的haar1,与阈值t1相比,如果haar1大于t1,则输出rightValue2;若haar1小于t1,则比较haar2与t2,若haar小于t2,输出leatValue,否则输出rightValue1。

强分类器是由若干个弱分类器组成的,一个强分类器里面的弱分类器相互独立。强分类器的值是弱分类器的直接求和,当强分类器的值大于强分类器的阈值时,才认为是一个目标,否则认为检测窗口不包含目标。

5. 级联分类器

强分类器是由弱分类器“并联”构成的,而级联分类器是由强分类器级联组成的。当一个检测框可以通过所有的强分类器,才认为该检测窗口包含了目标。

三、介绍训练方法

利用OpenCV的训练分类器工具,可以训练haar分类器。具体方式如下:

  1. 编译生成分类器工具。在编译OpenCV时,编译选项中BUILD_opencv_apps选上。如下图所示。

2062131a8e03424a01e192373b3161e5.png
图3.1 OpenCV编译选项

编译后,在build/bin目录下面生成的opencv_createsamples和opencv_traincascade两个可执行文件是我们需要的。

2. 准备正负样本。一般情况下,正样本与负样本比例小于1:5是比较合理的。使用opencv_createsamples生成用于训练的正样本文件(后缀为.vec)

da497651c4b89c3863dea9cfdf31a6dd.png
图3.2 createsamples参数含义

-info:用来描述正样本图片信息的文件,格式一般是txt格式。txt文件中每一行的格式为"xxx.jpg 1 0 0 20 20",每一行包含3块内容,第一个是图片的绝对路径,第二个是图片中目标数量,第三块是每一个目标框的位置(x,y,w,h)。

-vec:是生成的用于训练的正样本文件。

-num:是正样本的数量。

-show:生成过程中,是否显示每个样本。

-w:每一个正样本的宽。这个值要跟后面训练时的w值保持一致。

-h:每一个正样本的高。这个值要跟后面训练时的h值保持一致。

其他的几个参数“-img、-bg、-bgcorlor”等,是使用现有正样本进行数据增广时会用到的,一般使用默认值即可。

3. 使用opencv_traincascade训练分类器。训练时的参数列表如下图:

0ae49239262f740e0efd12c742be41ba.png
图3.2 训练分类器的参数列表

-data:最终生成的参数文件,以及一些中间的文件。

-vec:存放用opencv_createsamples生成的正样本的文件。

-bg:用来存放负样本的文件,一般格式为txt。txt文件的每一行存放了一张图片的绝对路径。

-numPos:正样本的数量,一般小于等于真实正样本的数量。

-numNeg:负样本的数量,一般小于等于真实负样本的数量。

-numStatges:级联分类器的级数。

-stageType:强分类器的类别,目前只支持BOOST。

-featureType:训练分类器使用的特征种类,一般包括HAAR、LBP、HOG,默认使用HAAR特征,人脸检测HAAR特征最好。

-w和-h:样本的宽和高,要跟opencv_createsamples生成文件时的参数值保持一致。

-bt:AdaBoosting的类别,OpenCV包含DAB(Discrete AdaBoost),RAB(Real AdaBoost),LB(LogitBoost)与GAB(Gentle AdaBoost),默认使用GAB。

-minHitRate:设置的训练目标召回率。

-maxFalseAlarmRate:最大虚警率,影响弱分类器的阈值,表示每个弱分类器将负样本误分为正样本的比例,一般默认值为0.5。

-weightTrimRate:0-1之间的阈值,影响参与训练的样本,样本权重更新排序后(从小到大),从前面累计权重小于(1-weightTrimRate)的样本将不参与下一次训练,一般默认值为0.95

-maxDepth:弱分类器的最大深度,默认为1,一般不超过2。

-maxWeakCount:每一个强分类器包含的弱分类器的数量,默认为100。

四、使用分类器进行分类

OpenCV在data目录下,提供了已经训练好的若干分类器,基于提供的分类器,提供了一份demo code,链接为:

AmazingRoad/AdaboostingFaceDetection​github.com
9d8a98b5606e1d7a382a80e889986734.png

写在后面的话:

参考文章:https://blog.csdn.net/mnydxk/article/details/81034302。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于adaboost算法人脸检测通常使用弱分类器作为基本分类器,并通过迭代的方式逐步增加分类器的权重,从而得到更好的分类性能。具体来说,adaboost算法通过以下步骤进行人脸检测: 1. 准备训练数据集:首先,需要准备包含人脸和非人脸样本的训练数据集。这些样本应具有代表性,覆盖不同的人脸和非人脸情况。 2. 特征选择:adaboost算法需要选择一组弱分类器用于人脸检测。通常情况下,会选择一些简单但能区分人脸和非人脸特征,如Haar-like特征。 3. 初始化权重:对于训练数据集中的每个样本,初始化一个权重,表示该样本在训练过程中的重要性。这些权重最初设置为相等值。 4. 迭代训练:通过迭代的方式,依次训练一系列弱分类器。在每一轮迭代中,选择一个最佳的弱分类器,即能最大程度地提高分类性能的分类器。 5. 更新权重:根据上一步选择的最佳分类器的分类结果,更新每个样本的权重。被错误分类的样本权重会增加,而正确分类的样本权重会减少。这样,下一轮迭代中,弱分类器将更加关注被错误分类的样本。 6. 集成分类器:将每个弱分类器按照其权重进行集成,得到最终的人脸检测器。通过将所有弱分类器的分类结果进行加权求和,可以得到对于新样本的分类结果。 7. 检测人脸:使用以上训练得到的人脸检测器对新的图像进行检测。通过在图像上滑动窗口,采用不同尺寸和位置的窗口进行分类判断,从而实现人脸的检测。 总而言之,基于adaboost算法人脸检测通过迭代训练一系列弱分类器,并将它们集成为强分类器,从而达到更高的人脸检测准确度。这种算法人脸识别与图像处理领域有着广泛的应用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值