haar adaboost可以检测unity 静态物体体吗

机器学习_基于adaboost和haar like特征的人脸识别
基于adaboost做人脸识别的一篇论文
PAUL VIOLA
Robust Real-Time Face Detection
Rapid object detection using a boosted cascade of simple features
基于adaboost做人脸识别的一篇论文
PAUL VIOLA
其中谈到使用haar like特征,参考这篇论文
Rainer Lienhart and Jochen Maydt 的
在整个读论文的过程中,通过如下资源,理清了论文中的很多知识点:
1.haar like原型特征与特征矩阵
在使用haar like特征做人脸识别时,介绍了3类的haar 原型特征:
在论文中提到,将feature放到图像上,黑色矩形像素值的和减去白色矩形像素值的和得到一个特征值,该特征值就是haar特征,使用该特征值计算弱分类器的
的阈值。但是需要注意的是此处的feature,并非简单的指上边的几个原型特征,而是通过在检测子窗口(一般为24x24像素)左右、上下平移,伸缩变换这些原型
特征得到的子窗口。一个特征原型在子窗口中伸缩大小不同,或者位置不同,就得到一个不同的feature,如下图:
论文作者在一个检测子窗口中画了两个变换后的原型矩阵,他这样做是为了节省论文版面同时展示0°、45°两种原型特征在子窗口中的摆放,实际上每个子窗
口只放一个原型特征形成一个feature。
一个0°型原型特征可以得到的feature个数:
一个45°型原型特征可以得到的feature个数:
关于公式怎么来的,可能要细心推导一下,不过中心思想就是,
1、对于某特定大小的特征,在窗口内滑动计算。
也就是1(a)特征大小为2*1,对于24*24的图像。水平可滑动23步,垂直滑动24步,所以共有23*24个特征。
2、对于一个特征,特征本身沿水平、竖直方向分别缩放。
还看特征1(a),特征大小为2*1,则延水平方向可放大为:4*1,6*1,8*1,…,24*1;竖直方向可放大为:2*1,2*2,2*3,…,2*24。
即每个特征有XY种放大方式。(!放大的矩形特征并限制保持2:1的比例!)
这部分我是参考
这篇博客弄懂的,其中它写了个程序来计算feature个数。
最终的得到的feature总数(在24x24窗口中)为:
2.图像积分图:
图像积分图的意义在于可以快速得到图像中任意矩形中的像素和,从而可以计算feature的特征值。
计算过程参考Rapid object detection using a boosted cascade of simple features、An Extended Set of Haar-like Features for Rapid Object Detection 论文,
这篇博客。
3.adaboost训练识别器过程:
在Rapid object detection using a boosted cascade of simple features这篇论文中,给出训练过程如下
其中boosting步骤的第三步,对于每个feature训练一个弱分类器,选择误分率最小的弱分类器。每个弱分类为如下公式所示:
其中x为图像的24x24的子窗口。
但是这篇论文并没有给出弱分类器阈值的计算方法,在 Robust Real-Time Face Detection这篇论文中,作者给出boost步骤后,
补了一段训练弱分类器方法:
4.决策树中连续变量的阈值
决策树算法中,通过计算信息熵和信息增益(或增益比)的决定各个决策节点的构造关系,具体算法参考《机器学习》这本书中关于
决策树的介绍,或者通过 (侧重连续变量的阈值计算),(侧重信息熵、信息增益)这两篇博客。
在第一篇博客中,对于golf数据集
按照如下步骤计算,其中E.g 中使用info表示信息熵不规范,应该为Entropy公式。
1.信息熵公式
2.信息增益
同时可以参考stackoverflow中关于adaboost阈值的讨论
csdn论文资源:
参考的博客地址:
人脸检测 中文博客:
/ello/archive//2475419.html
决策树 连续值节点阈值的计算:
http://fangdonghao1029./blog/static//
决策树 熵、信息增益的计算:
/biyeymyhjob/archive//2605208.html
haar特征数计算:
http://blog.csdn.net/xiaowei_cqu/article/details/8216109
stackoverflow关于adaboost弱分类器阈值的讨论:
/questions/9777282/the-best-way-to-calculate-the-best-threshold-with-p-viola-m-jones-framework
opencv doc 物体检测 http://docs.opencv.org/modules/objdetect/doc/cascade_classification.html
版权声明:本文内容由互联网用户自发贡献,本社区不拥有所有权,也不承担相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至: 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
用云栖社区APP,舒服~
【云栖快讯】浅析混合云和跨地域网络构建实践,分享高性能负载均衡设计,9月21日阿里云专家和你说说网络那些事儿,足不出户看直播,赶紧预约吧!&&
阿里云机器学习是基于阿里云分布式计算引擎的一款机器学习算法平台。用户通过拖拉拽的方式可视化的操作组件来进行试验,...
是基于语音识别、语音合成、自然语言理解等技术,为企业在多种实际应用场景下,赋予产品“能听、会说、懂你”式的智能人...
基于全网公开发布数据、传播路径和受众群体画像,利用语义分析、情感算法和机器学习,分析公众对品牌形象、热点事件和公...
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
MaxCompute75折抢购
Loading...OpenCV学习记录(二):自己训练haar特征的adaboost分类器进行人脸识别 - hongbin_xu的博客 - CSDN博客
OpenCV学习记录(二):自己训练haar特征的adaboost分类器进行人脸识别
上一篇文章中介绍了如何使用OpenCV自带的haar分类器进行人脸识别()。
这次我试着自己去训练一个haar分类器,前后花了两天,最后总算是训练完了。不过效果并不是特别理想,由于我是在自己的笔记本上进行训练,为减少训练时间我的样本量不是很大,最后也只是勉强看看效果了。网上有关的资料和博客可以说很多了,只要耐心点总是能成功的。
采集样本:
首先要训练,就得有训练集。网上有很多国外高校开源的库可供下载:
1、卡耐基梅隆大学图像数据库()
2、MIT人脸数据库()
3、ORL人脸数据库()
由于是国外的网站,可能需要翻墙,所以下载可能会有些麻烦。这里给出了我在网上收集的训练集,正样本为20*20的人脸图片,负样本为50*50的背景图片。样本集下载地址:。
准备工作:
在指定目录中放入以下所提到的文件夹及文件。
将正样本放在pos文件夹中,负样本放在neg文件夹中,xml文件夹存放后面训练过程中产生的数据模型,最后opencv会将其转换生成一个xml文件,也就是最终的分类器。
从OpenCv安装目录中查找出如下两个exe可执行文件。
opencv_createsamples.exe:用于创建样本描述文件,后缀名是.vec。专门为OpenCV训练准备,只有正样本需要,负样本不需要。
opencv_haartraining.exe:是OpenCV自带的一个工具,封装了haar特征提取以及adaboost分类器训练过程。
一般来说,正负样本数目比例在1:3的时候训练结果比较好,但是不是绝对。由于每个样本的差异性不同等因素,所以没有绝对的比例关系。但是负样本需要比正样本多,因为原则上说负样本的多样性越大越好,我们才能有效降低误检率,而不仅仅是通过正样本的训练让其能识别物体。为了节约时间,我选了1500个正样本和4500个负样本。
获取样本路径列表:
打开Windows下的命令行窗口,进入指定目录下。
1、建立正样本的描述文件:
首先进入pos文件夹中,输入:
dir /b & pos.txt
在当前pos目录下生成一个pos.txt记录所有图片的名称。
打开记事本,去除pos.txt最后一行的pos文件夹;
将所有jpg替换成 jpg 1 0 0 20 20。这里1表示当前图片重复出现的次数是1, 0 0 20 20表示目标图片大小是矩形框从(0,0)到(20,20)。
2、建立负样本的描述文件:
接下来重新进入neg文件夹,输入:
dir /b & neg.txt
之后,生成neg.txt文件,这里负样本不做其他修改。
3、使用opencv_createsamples.exe建立训练需要的参数列表:
Windows控制台进入指定目录下,我们之前已经在目录下放了opencv_createsamples.exe文件,在控制台下输入opencv_createsamples.exe可以得到各参数信息:
在当前目录下输入如下指令:
opencv_createsamples.exe -vec pos.vec -info pos\pos.txt -bg neg\neg.txt -w 20 -h 20 -num 1500 ;
当前目录下,产生了pos.vec文件。
简要介绍指令:
-vec pos.vec:指定生成的文件,最终生成的就是pos.vec;
-info pos\pos.txt:目标图片描述文件,在pos\pos.txt;
-bg neg\neg.txt:背景图片描述文件,在neg\neg.txt;
-w 20:输出样本的宽度,20;
-h 20:输出样本的高度,20;
-num 1500:要产生的正样本数量,1500;
训练模型:
Windows控制台进入指定目录下,我们之前已经在目录下放了opencv_haartraining.exe文件,在控制台下输入opencv_haartraining.exe可以得到各参数信息:
输入如下指令进行训练:
opencv_haartraining.exe -vec pos.vec -bg neg\neg.txt -data xml -w 20 -h 20 -mem 1024 -npos 1000 -neg 3000 -nstages 2 -nsplits 5
简要介绍指令:
-vec pos.vec:正样本文件名;
-bg neg\neg.txt:背景描述文件;
-data xml:指定存放训练好的分类器的路径名,也就是前面建立的xml文件夹;
-w 20:样本图片宽度,20;
-h 20:样本图片高度,20;
-mem 1024:提供的以MB为单位的内存,很明显,这个值越大,提供的内存越多,运算也越快;
-npos 1000:取1000个正样本,小于总正样本数;
-neg 3000:取3000个负样本,小于总负样本数;
-nstages 2:指定训练层数,层数越高耗时越长;
-nsplits 5:分裂子节点数目, 默认值 为2;
其他参数:
-minhitrate:最小命中率,即训练目标准确度;
-maxfalsealarm:最大虚警(误检率),每一层训练到这个值小于0.5时训练结束,进入下一层训练;
-sym或者-nonsym:脸是否垂直对称,若是,则选前者,且可以加快训练速度。
输入指令之后就是等待了,最后可以看到结果如下:
这里我的层数太少了,导致训练结果不是很好,一般要增加到15~20层才能有较好的效果。
中间可能遇到的问题:
可能在训练的过程中,过了很长时间但是却一直停留在某一层不动,上网查找解决办法如下:增大负样本数目,增大负样本之间的变化! 增加负样本,然后重新接着训练,注意更改负样本的数目。
详细说明可以查看:
参考链接:
我的热门文章Computer vision(15)
OpenCV(8)
本博客涉及到的资源:
训练和检测工具:
分类器xml文件:
adaboost训练和源代码:
更新总结:
& & & &在开始阅读之前,建议先把这几个用到的资料先下载了,有不少网友想要训练的代码,我没有直接提供,所以也不必私信我提供代码了。如果非要弄懂整个过程的话,有两种途径。一种是通过cmake
查看源代码(事实上本工具也是通过这种途径得到的),另一种就是下载adaboost训练和测试的源代码然后自己可以选择自己想要的特征,这对于想做特征融合的网友是比较有帮助的,的介绍可以通过点击查看。
& & & &本文章的目的是让所有在数字图像处理零经验的同学可以快速实现运动目标跟踪。
& & & & & & & & & & & & & & & & & & & & & &Haar Adaboost 检测自定义目标(视频车辆检测算法代码)
& & & &opencv自带了一个人脸识别用到的分类器,我们直接使用就行了。但是很多人想到要跟踪其他东西,例如说,手,杯子,篮球,汽车,那怎么办?其实很简单,只要按照一下步骤一步一步做,很容易就可以做到了。运动目标识别,用上这个工具,貌似都不是什么难事。(好像在卖广告了。。)回到正题,本文用的是haar+adaboost的方法。
目标检测分为三个步骤:
1、 样本的创建
2、 训练分类器
3、 利用训练好的分类器进行目标检测。
一.样本的创建:& &&
训练样本分为正例样本和反例样本。正例样本是指待检目标样本(例如可乐瓶,汽车,人脸等),反例样本指其它任意图片,所有的样本图片都被归一化为同样的尺寸大小(例如,20x20)。反例样本可以来自于任意的图片,但这些图片不能包含目标特征。& &
&正样本:& &&
1.先准备正样本图片。
进入路径tools\temp\positive\rawdata(我的路径是F:\tools\temp\positive\rawdata,你按照你自己的路径对应的改过来就行了),然后在里面放入含有正样本的图片。当然了,正样本数目要要足够大,一般要是1000以上吧。注意,图片要用BMP格式,如果你手头上的图片不是BMP格式的话,只需要用图片处理软件转一下就行了。如下图所示:
2.截图目标区域。
正样本图片有了,然后双击F:\tools\temp\positive下的objectmarker.exe,开始截图目标区域,有readme文件已经说明了,也就是说,每次截图完要按一次空格键保存区域,多目标的图片可以接着继续截图,按下回车键可以跳到写一张图片:
The following keys are used:
&Enter& save added rectangles and show next image
&ESC& exit program
&Space& add rectangle to current imageany other key clears rectangle drawing only
这个过程要持续下去不能中断,不然的话就无法产生相应的文件了,所以在样本太多的情况下,可以先分组,大约100张图片放进去rawdata中去,这样子如果有什么意外的话,损失也就100张图的时间而已。只需要最后把几个文件合成一个大文件,效果就一样了。最后可以在F:\tools\temp\positive下生成info.txt文件。
rawdata/.BMP 1 11 5 100 78& &&
这里,rawdata/.BMP表示文件的相对路径;&
&&1 表示有一个目标(如果图片中有两个目标的话,截两次图,这里就是2了,以此类推;
&&11 5 表示目标矩形框起点坐标;
&&100 78 表示目标矩形框的宽和高。
3.正样本描述文件vec文件的创建。
& & 已经把目标的情况记录了放在txt文件里,接下来就编辑F:\tools下的samples_creation.bat文件,因为正样本数是8个(我这里是8个),所以改成createsamples.exe -info positive/info.txt -vec data/vector.vec -num 8 -w 24 -h 24这句话的-num 后面写个8就行了,后面的-w 和 -h 说的是图片resize成的大小,根据你的需要自己改。之后会在F:\tools\temp\data下面生成vector.vec文件,这个就是向量描述文件了。
到此,正样本的操作已经完成了,不用打开vec文件,因为这个要专门的软件才可以打开的。&&
负样本:& &
&1.准备负样本图片。
到F:\tools\temp\negative下,把负样本图片放进去。一般来说,负样本要比正样本数目多很多。为什么呢?因为负样本表示的是随机情况,只要有大量随机样本的情况下,才可以充分表示与正样本相反的情况,大约2-5倍吧,也不能太多,不然的话花费的时间太长,分类效果可能反而不好,因为比例偏移太严重了
2.负样本描述文件的生成。
打开F:\tools\temp\negative下的create_list.bat文件,可以自动生成描述文件。如果没有找到这个create_list.bat批出处理文件,就自己在这个目录下新建一个,内容就一句话:dir
/b *.BMP &infofile.txt,然后保存。
infofile.txt文件内容如下为例(注意负样本也是bmp文件):
.............
到此,负样本的操作结束。 &&
二.进入训练阶段:
& &打开F:\tools下的haarTraining.bat,开始训练了(注意:下载到的训练和测试工具里haarTraining.bat文件内容不一定适合你的实际情况,注意按照下面的参数说明修改参数,特别是&-npos
20 -nneg 40 -nstages 5!!)。该文件参数说明如下:&
-data data/cascade -vec data/vector.vec -bg negative/infofile.txt -npos 20 -nneg 40 -nstages 5 -mem 1000 -mode ALL -w 24 -h 24 -nonsym
-data&dir_name&
存放训练好的分类器的路径名。
-vec&vec_file_name&
正样本文件名(由trainingssamples 程序或者由其他的方法创建的)
-bg&background_file_name&
背景描述文件。
-npos&number_of_positive_samples&,
-nneg&number_of_negative_samples&
用来训练每一个分类器阶段的正/负样本。合理的值是:nPos = 7000;nNeg = 3000
-nstages&number_of_stages&
训练的阶段数。
-nsplits&number_of_splits&
决定用于阶段分类器的弱分类器。如果1,则一个简单的stump classifier 被使用。如果是2 或者更多,则带有number_of_splits 个内部节点的CART 分类器被使用。
-mem&memory_in_MB&
预先计算的以MB 为单位的可用内存。内存越大则训练的速度越快。
-sym(default)
指定训练的目标对象是否垂直对称。垂直对称提高目标的训练速度。例如,正面部是垂直对称的。
-minhitrate《min_hit_rate》
每个阶段分类器需要的最小的命中率。总的命中率为min_hit_rate 的number_of_stages 次方。
-maxfalsealarm&max_false_alarm_rate&
没有阶段分类器的最大错误报警率。总的错误警告率为max_false_alarm_rate 的number_of_stages 次方。
训练过程会在F:\tools\temp\data\cascade中产生相应阶段的文件。训练时间和电脑配置和训练数据的多少有关。如果在这个过程中中断了也没关系,再次启动训练可以接着训练下去的。(ctrl+c可以退出)。我的配置是CPU:i5-480M,内存2G,正样本2500,负样本4500,大概从下午4点到第二天早上7点吧,生成18级。速度比其他博客上写的要快很多,有的网友竟然有用了6天的,我就搞不懂了。。。可能数据是在太大了吧。如果发现训练着程序不再动了,那么不到18级也可以停止了。生成18级的阶段性分类器文件之后,把\temp\data\cascade下的n(这里n=18)个弱分类器文件夹拷贝到cascade2xml\data下,用F:\tools\cascade2xml下的convert.bat就可以生成xml分类器文件了。默认在同级目录下生成output.xml,当然了,你也可以改~~
& 生成分类器之后,就可以启用F:\tools\test_recognition下的facedetect.exe文件了,至于文件路径什么的,自己结合实际修改一下,就是要把这个output.xml作为分类器文件输入就是了。&&
&例如:start.bat中
facedetect.exe --cascade=&dane.xml& 0&&
&就是使用F:\tools\test_recognition下的dane.xml文件,媒体文件来源是摄像头,你要用视频,就改为类似于xxx.avi或者其他路径就行了。
其实这个facedetect.exe 是有源代码的,你可以自己去opencv 自带的代码里面找,我这里也贴出来了。
本博客涉及到的资源:
训练和检测工具:
分类器xml文件:
我把检测视频也共享出来了,(连接已经失效,下载公共数据吧)
如果觉得可以的话,请在下面顶一下吧~~
除了本文提供的资源之外,不再提供任何其他相关资源,自己去找,不必私信我索要。
读完本文,如果还有一些疑问的话,可以点击
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:23258次
排名:千里之外
原创:23篇
转载:61篇
(4)(1)(14)(8)(8)(6)(2)(13)(8)(16)(2)(1)(1)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'转载:/codingmengmeng/p/5500566.html
Adaboost算法结合Haar-like特征
一、Haar-like特征
  目前通常使用的Haar-like特征主要包括Paul Viola和Michal Jones在人脸检测中使用的由Papageorgiou C首先提出的原始矩形特征和Rainer Lienhart 和 Jochen Maydt提出的扩展矩形特征。
图1.Haar-like特征
  Haar-like特征值的计算就是用图中矩形模板中黑色矩形内所有像素值的和减去白色矩形内所有像素值的和。Haar-like特征可以有效的提取图像的纹理特征,各模板通过平移、缩放提取不同位置和尺度的特征值。所以Haar-like特征的数量是巨大的,对于给定的W×H的图片,其一个矩形特征的数量为:
  其中,wxh为特征模板尺寸
  表示特征模板在水平和垂直方向放大的最大比例。而对于45度的特征数量为:
  关于这个公式,其推导过程比较难懂。在此说说我的理解:
首先得清楚两点:
1、对于图2中的某一特征,特征本身可以沿水平、竖直方向缩放;水平方向需以w为单位缩放,竖直方向需以h为单位进行缩放;即缩放后宽高比可能与原特征宽高比不同,但缩放后,宽和高与原特征的宽和高是成比例的。所以对于图2中某一w*h的矩形,其有X*Y种放大方式。
2、对图2中的某一特征矩形及其缩放后的特征矩形,其处于图像的位置不同,Haar特征不同,所以需在窗口中滑动计算。例如图2中的1(a)特征大小为2*1,对于24*24的图像,水平可滑动23步,垂直可滑动24步,所以共有23*24个特征。
理解了这两点后如何绕开原著一大堆推导过程得到上述公式呢?
在此引用一个网友的相比之下简洁明了的推导过程:
  这个公式是从概率方面得到的,因为haar特征框没有对宽和高做比例的限制,因此其两边个数的选择为独立同分布事件(此块不知如何用语言描述,如不能理解请直接看计算步骤)。因此以高度边为例,haar特征框为h,训练图像为H,则:
1)特征框放大1倍(无放大):有(H-h+1)个特征
2)特征框放大2倍(只放大h一边,下同):有(H-2h+1)个特征
3)特征框放大3倍:有(H-3h+1)个特征
如此直到放大H/h倍
4)特征框放大H/h倍:有1个特征,即有(H-H/h*h+1)个特征
以上全部相加有:
H-h+1+H-2h+1+H-3h+1+......+H-H/h*h+1=H*H/h+H/h-h*H/h*(1+H/h)/2
设H/h=Y,则上式可变为Y(H+1-h(1+Y)/2),同理,对宽度边做同样处理可得到X(W+1-w(1+X)/2),因为这种选取符合独立同分布事件,因此总个数可以直接相乘得到,至此得到文章中的公式。
  看完他的表达有一种豁然开朗的感觉!很显然,在确定了特征的形式之后,矩形特征的数量只与子窗口的大小有关。在24×24的检测窗口中,可以产生数以10万计的特征,对这些特征求值的计算量是非常大的。
由于数量的巨大,所以解决特征的快速计算将显得尤为重要。Paul Viola和Michal Jones提出使用积分图来实现特征的快速运算。构造的积分图中的像素点存储其左上方所有像素值之和,即:
  其中,I(x,y)表示图像(x,y)位置的像素值。显然,积分图可以通过增量的方式通过迭代运算来实现:
  边界的初始化为:
  式子看上去没有想象的那么直观易懂,你可以试着在纸上画小方格,假设x=2,y=2,用上述式子来推出SAT(x,y),与你在纸上得到的SAT(x,y)比较,就会恍然大悟。
得到积分图后,计算矩形区域像素的和将只需四次查找和加减运算即可完成,如下图3所示:
图2.积分图中矩形区域像素值和的计算示意图
  假设区域D的四个顶点为a,b,c,d,则区域D内的像素和为:
  由此可以看出,积分图可以加速特征值的计算。
二、Adaboost算法
  1、Adaboost算法的前生 
  在了解Adaboost之前,先了解一下Boosting算法。
  回答一个是与否的问题,随机猜测可以获得50%的正确率。若一种方法能获得比随机猜测稍微高一点的正确率,则称得到这个方法的过程为弱学习;若一种方法能显著提高猜测的正确率,则称得到这个方法的过程为强学习。“弱”和“强”很形象的表达了这两个过程。
  1994年,Kearns和Valiant证明:在Valiant的PAC(Probably Approximately Correct)模型中,只要数据足够多,就可以将弱学习算法通过集成的方式提高至任意精度。实际上,1990年,Schapire就首先构造出一种多项式级的算法,将弱学习算法提升为强学习算法,就是最初的Boosting算法。Boosting意思为提升、加强,现在一般指将弱学习提升为强学习的一类算法。1993年,Drucker和Schapire首次以神经网络作为弱学习器,利用Boosting算法解决实际问题。前面指出,将弱学习算法通过集成的方式提高至任意精度,是Kearns和Valiant在1994年才证明的。虽然Boosting方法在1990年已经提出,但它真正成熟,也是在1994年之后才开始的。
  2、Adaboost算法的提出
  1995年,Freund和Schapire提出了Adaboost算法,是对Boosting算法的一大提升。Adaboost是Boosting家族的代表算法之一,全称为Adaptive Boosting。Adaptively,即适应性地,该算法根据弱学习的结果反馈适应地调整假设的错误率,所以Adaboost不需要预先知道假设的错误率下限。也正因为如此,它不需要任何关于弱学习器性能的先验知识,而且和Boosting算法具有同样的效率,所以提出之后得到了广泛的应用。
  3、Adaboost算法的原理 
  传统的提升算法需要解决两个问题:(1)对于同一训练数据集,怎样改变其样本分布达到重复训练的目的;(2)弱分类器的有机组合问题。
  对于这两个问题,Adaboost给出了“自适应”解决方法。首先,针对同一训练集通过赋予样本权重并在每一轮中根据分类结果改变其权重以得到同一训练集不同样本分布的目的。具体做法是通过赋予每一个训练样本一个权重来标榜其重要性,具有较大权重的样本得到更大的正确分类的概率,这样在每一轮训练中所重点关注的样本将会不同,从而达到同一样本集不同分布的目的。而样本权重的更新是基于弱学习器对于当前训练集中样本的分类正确与否,具体地,提高那些被前一轮弱分类器错误分类的样本的权值,降低那些被正确分类样本的权值,这样使下一轮弱分类器的训练更多关注错分的样本,这样,分类问题被弱分类器“分而治之”。
  其次,弱分类器的组合采取加权多数表决的方法。具体地,分类误差率小的弱分类器将加大组合权重,使其在表决中有较大的“影响力”,而误差率大的弱分类器将减小其组合权重。这样,将这些在训练过程中关注不同样本不同特征的弱分类器按其分类误差率进行加权组合即构成一个分类性能更为强大的最终分类器(强分类器)。可以看到,使用Adaboost算法可以提取对分类较有影响力的特征,并将重点放在关键的训练数据上面。 
  Adaboost算法描述如下:
假设输入:数据集D={(x1,y1),(x2,y2),...,(xm,ym)};其中yi=0,1表示负样本和正样本;学习的循环次数为T。
1、初始化样本权重:对于yi=0,1的样本分别初始化其权重为ω1,i=1/m,1/l;其中m和l分别表示为负样本的数量和正样本的数量。
2、for t=1,...T:
①权重归一化,
②对每个特征j,训练一个弱分类器hj(如何训练弱分类器,之后会提及),计算所有特征的加权错误率εf
③从②确定的弱分类器中,找出一个具有最小εt的弱分类器
④更新每个样本对应的权重
这里,如果样本xi被正确分类,则ei=0,否则ei=1,而
3、最终形成的强分类器组成为:
  在使用Adaboost算法训练分类器之前,需要准备好正、负样本,根据样本特点选择和构造特征集。由算法的训练过程可知,当弱分类器对样本分类正确,样本的权重会减小;而分类错误时,样本的权重会增加。这样,后面的分类器会加强对错分样本的训练。最后,组合所有的弱分类器形成强分类器,通过比较这些弱分类器投票的加权和与平均投票结果来检测图像。
  4、Adaboost算法分类器
  弱分类器之所以称为弱分类器,是因为我们并不期望选择出来的分类器具有很强的分类效果。举例说明,对于一个给定的问题,在某一轮的训练过程中,得到的弱分类器对于训练样本的分类率可能只有 51%。也就是说,只要弱分类器的分类率比随机预测略好就可以(随机预测的分类率是 50%)。在每一轮的训练结束以后,根据本轮选择出来的弱分类器对训练样本的分类正确与否,修改各个样本的权重,使得分类错误的样本权重增加。所有的训练过程结束后,产生的强分类器由各轮产生的弱分类器通过加权的投票形成。&
  怎么样来保证对于分类效果好的分类器赋予一个较高的权值,而对于分类效果不好的分类器赋予一个较低的权值呢?Adaboost 提供了一个很强有力的机制,把弱分类器和特征挂起勾来,把性能很好的分类器选择出来,并赋予相应的权值。将弱分类器和特征挂钩起来的一个很直接的方法是,将弱分类器和特征做一一对应的关系,也就是说,一个弱分类器仅仅依赖一个特征。为了实现这个机制,每一轮分类器的训练的过程就是选择一个矩形特征,使得这个特征能最好的将正训练样本和反训练样本分离开。弱学习过程在每一轮训练过程中,对于每一个特征来说(有很多个特征,如24*24的图片,特征的数量高达160000),都要确定一个最优阈值,使得该阈值对样本的分类效果最好。这样,每一轮训练过程都可以得到一个分类效果最好的特征(即从160000个特征中选择一个错误率最低的),而该特征所对应的弱分类器就是该轮所选出的弱分类器。&
三、Adaboost算法结合Haar-like特征
  1、弱分类器的构成
  在确定了训练子窗口中的矩形特征数量和特征值后,需要对每一个特征f,训练一个弱分类器h(x,f,p,θ);
  2、弱分类器的训练和选取
  一个弱分类器是一个特征 f(x)和一个阈值θ 的混合物。训练一个弱分类器,就是在当前权重分布的情况下,确定 f(x)的最优阈值,使得这个弱分类器对所有训练样本的分类误差最低。选取一个最佳弱分类器就是选择那个对所有训练样本的分类误差在所有弱分类器中最低的那个弱分类器(特征)。
     
  于是,通过把这个排序的表从头到尾扫描一遍就可以为弱分类器选择使分类误差 最小的阈值(最优阈值),如下图所示
图3.训练一个弱分类器的算法
  特别说明:在前期准备训练样本的时候,需要将样本归一化和灰度化到规定尺寸大小,这样每个样本的都是灰度图像并且样本的大小一致,保证了每一个Haar特征(描述的是特征的位置)都在每一个样本中出现。
四、级联分类器
  在实际应用中使用一个强分类器往往无法精确解决一些复杂的分类问题,并同时达到高检出率和低误检率的要求,通常使用级联的强分类器(cascade classifier)来解决这一问题。级联分类器的策略是,将若干个强分类器由简单到复杂排列,使每级强分类器具有较高的检出率,而误检率的要求可以放低,假设每级的检出率为99.9%,误检率为50%,那么一个15级的级联分类器的检测率为0.91;0.515≈0.00003,这样就可以满足现实要求了。
  训练过程中,级联强分类器中的每一级分类器采用AdaBoost算法训练得到,对于第一级强分类器,训练数据为全体训练样本,指定了较高的检测率而对误检率只要求不小于随机结果,所以训练过程中一般只需用到少量分类性能较强的特征就可以达到指定要求;而对于第二级强分类器,训练数据的负样本更新为第一级强分类器对原始负样本的误检样本,这样,第下一级强分类器的训练将针对第上一级难以分开的样本进行,一般地,会使用产生稍多的特征及弱分类器,如此继续,便得到最后的由简单到复杂排列的级联强分类器。
  特别说明:级联分类器中的每一强分类器都包含若干个弱分类器,而每个弱分类器都是使用前述的Adaboost算法结合Haar-like特征训练得到的。
  训练过程中,级联强分类器中的每一级分类器采用AdaBoost算法训练得到,对于第一级强分类器,训练数据为全体训练样本,指定了较高的检测率而对误检率只要求不小于随机结果,所以训练过程中一般只需用到少量分类性能较强的特征就可以达到指定要求;而对于第二级强分类器,训练数据的负样本更新为第一级强分类器对原始负样本的误检样本,这样,第下一级强分类器的训练将针对第上一级难以分开的样本进行,一般地,会使用产生稍多的特征及弱分类器,如此继续,便得到最后的由简单到复杂排列的级联强分类器。
在对输入图像进行检测时,一般需要对图像进行多区域、多尺度的检测。所谓多区域,就是要对取样子窗口进行平移操作,以检测到每个区域。由于训练时候所使用的正样本都是归一化到固定尺寸的图像,所以必须使用多尺度检测以解决比训练样本尺寸更大的目标的检测。多尺度检测一般有两种策略,一种是使子窗口的尺寸固定,通过不断缩放图片来实现,显然,这种方法需要完成图像的缩放和特征值的重新计算,效率不高;而另一种方法,通过不断扩大初始化为训练样本尺寸的窗口,达到多尺度取样检测的目的,这样就避免了第一种方法的弱势。但在窗口扩大检测的过程中会出现同一个目标被多次检测的情况,所以需要进行区域的合并处理。
  无论哪一种搜索方法,都会从待检测图像取样大量的子窗口图像,这些子窗口图像会被级联分类器一级一级不断地筛选,只有检出为非负区域才能进入下一步检测,否则作为非目标区域丢弃,只有通过所有级联的强分类器并判断为正区域才是最后检测得到的目标区域。级联分类器的检测过程如下图:
  经过 Adaboost 算法的训练得到的强分类器具有最小化的错误率,而不是很高的检测率。通常,高检测率的代价是高误识率,从而引起错误率增加。要提高第i层强分类器的检测率达到di ,一个简单而有效的方法是降低强分类器的阈值;要降低第i层强分类器的误识率到fi ,一个简单而有效的方法是提高强分类器的阈值,与提高第i层强分类器的检测率相悖。通过实验结果分析,增加弱分类器个数,在提高强分类器检测率的同时降低了误识率,但该方案增加了弱分类器的个数会引起计算时间的增加。所以,构造层叠分类器时要考虑两个平衡:
增加弱分类器个数在降低误识率的同时也增加了计算时间降低强分类器的阈值在增加检测率同时也增加了误识率
  构造层叠分类器的每层强分类器时就是要找到上述两个平衡的平衡点。
本文已收录于以下专栏:
相关文章推荐
由于课程学习和作业的原因,最近一个月
接着上一篇。继续转。感谢原文博主的分享,原本懵懵懂懂的,原博文很全面,很系统,看了之后这个知识点终于理顺了。接下来是基于HOG特征的人脸识别。
转自“wintkins”的《AdaBoost中利用...
人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..
Paul Viola 和Miachael Jones等利用Adaboost算法构造了人脸检测器,称为Viola-Jones检测器,取得很好的效果。之后Rainer Lienhart和Jochen Ma...
这部分太深奥了,看了好多文档,转发出来,供大家看,也当自己做个笔记。
转自“wintkins”的《AdaBoost中利用haar特征进行人脸识别算法分析和总结1——Haar特征与积分图》。
毕设算是告一段落,里面用了一点点人脸识别,其实完全是OpenCV自带的,源自两篇论文:
P. Viola and M. Jones.  Rapid object detection using ...
目前因为做人脸识别的一个小项目,用到了AdaBoost的人脸识别算法,因为在网上找到的所有的AdaBoost的简介都不是很清楚,让我看看头脑发昏,所以在这里打算花费比较长的时间做一个关于AdaBoos...
目前因为做人脸识别的一个小项目,用到了AdaBoost的人脸识别算法,因为在网上找到的所有的AdaBoost的简介都不是很清楚,让我看看头脑发昏,所以在这里打算花费比较长的时间做一个关于AdaBoos...
一、Haar-like特征
Haar特征值反映了图像分度变化的情况。
Haar-like特征最早是由Papageorgiou等应用于人脸表示,Viola和Jones在此基础上,使用3种类型4种形式...
上一篇连接:http://blog.csdn.net/weixingstudio/article/details/7631241
1. 弱分类器
在确定了训练子窗口中的矩形特征数量和特征值后...
1. 弱分类器
在确定了训练子窗口中的矩形特征数量和特征值后,需要对每一个特征f ,训练一个弱分类器h(x,f,p,O) 。
在CSDN里编辑公式太困难了,所以这里和公式有关的都用...
他的最新文章
讲师:汪剑
讲师:陈守元
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 物体静态美的词 的文章

 

随机推荐