《FAQ:OpenCV Haartraining》——使用OpenCV训练Haar like+Adaboost分类器的常见问题

最近使用OpenCV训练Haar like+Adaboost分类器,查阅了一些资料,这些资料对训练过程陈述的很详细,但是缺少一些细节,偶然看到了一篇英文资料,觉得很好,简单翻译了自己觉得有用的部分。

原文链接:FAQ:OpenCV Haartraining

关于正样本图片

1、I have  positive images, how create vec file of positive samples?
     有了正样本图片,如果生成对应的vec文件?
 OpenCV中有一个工具可以生成vec文件,在安装目录C:\Program Files\OpenCV\apps\HaarTraining\src createsamples.cpp。
使用方法:
createsamples -info positive_description.txt -vec samples.vec -w 20 -h 20
 
2、What’s positive description file?
    正样本描述文件是什么?
以人脸为例,在正样本的图片中,可能有数个人脸,每个人脸的位置可以用一个矩形框来表示:矩形左上角是x, y,宽、高是width,height。所以我们可以写一个文件来表示每张图片中的每个人脸如下:
positive_image_name  num_of_objects x y width height x y width height …
像这样,指定了正样本中需要检测目标位置的文件就叫正样本描述文件。在生成vec文件时,添加到vec文件中的是需要检测的目标,而不是整张图片。本质上来讲,vec文件用来加速机器学习。
 
3、Do I always need description file, even if I have only one object on a image?
    描述文件是不是必须的?如果正样本图片中只包含一个需要检测的目标时呢?
    使用createsamples工具时,描述文件是必须的。如果正样本图片中只有一个被检测物,矩形框就是整幅图片。你也可以自己编写工具来生成vec文件。
 
4、Should lightning conditions and background be various on positive images?
    正样本图片中的关照和背景的变化是否需要很大?
是的,而且这很重要。在正样本图片中,除了被检测目标,剩下的就是背景。应该尝试用随机噪声来填充背景,避免没有变化的背景。
 
5、How much background should be on positive image?
    在正样本图片中,应该有多少背景?
如果在正样本图片中,背景相对被检测目标来说,所占像素很多的话,会产生不好的效果,因为haartraining(haar训练程序)会把背景当作被检测物的特征记下来。如果在正样本图片中根本没有背景像素,也会造成训练的结果不好。在正样本图片中有很少背景是比较理想的。
 
6、What’ s  -w and -h should I put in createsamples? Should it be always square?
    在使用createsamples工具时,-w -h参数应该设定为多少?是不是一定要设定成正方向?
-w -h参数的值应该根据希望检测目标的比例来设定。但是,使用生成的分类器来进行检测时,比-w -h所确定的形状小的目标不会被检测到。在检测脸时,通常使用的值是24*24,20*20。你也可以使用24*20,20*24等等类似的值。
 
7、Errors during vec file generation: Incorrect size of input array, 0 kb vec file,
    生成vec文件时报错:输入矩阵大小错误,vec文件0kb
-首先,检测描述文件:例如正样本图片的路径是否正确
-描述文件末尾不能有空行
-正样本图片的分辨率不能小于设置的-w -h参数
-检查正样本图片是否可用,是否被占用
-正样本图片格式是否正确。支持的格式有jpeg、bmp、ppm。
 

关于负样本图片

1、What negative images should I take?
    应该使用什么样的负样本图片?
可是使用任何OpenCV支持的图片格式,而且其中不能包含被检测目标。负样本图片应该变化很大,多种多样。
 
2、Should negative images have the same size?
    负样本图片是否需要缩放到同样大小?
不需要,但是负样本图片不能小于使用createsamples工具生成vec文件时设定的-w -h参数。
 
3、What’s description file for negative image?
    负样本的描述文件是什么样的?
负样本的描述文件是一个简单的文本文件,通常命名为negative.dat。它指定了负样本图片,并且不能有空行(包括末尾)。例如:
    image_name1.jpg
    image_name2.jpg
 
4、How many negative/positive image should I take?
    通常需要使用多少正/负样本图片?
这往往根据你的需求来确定。例如,对cascades来说,需要有1000个正样本和2000个负样本。
比较好的比例关系是 positive : negative = 1:2,但这并不是硬性规定。我推荐先使用少量的样本来尝试产生cascades,然后再扩大样本。
 

关于haartraining.exe的使用

1、Example of launching
    使用haartraining的示例
vec文件为samples.vec,负样本描述文件为negative.dat。使用haartraining.exe的方法如下:
 haartraining -data haarcascade -vec samples.vec -bg negatives.dat -nstages 20  -minhitrate 0.999 -maxfalsealarm 0.5 -npos 1000 -nneg 2000 -w 20 -h 20 -nonsym -mem 1024

-data haarcascade  
        生成的xml文件目录为haarcascade

-vec  samples.vec       
    vec文件为samples.vec
-bg  negatives.dat       
    负样本描述文件为negatives.dat
-nstages 20         
           分类器的级联层数
 -minhitrate 0.999             每一层的最低正确检测率99.9%
-maxfalsealarm 0.5           最大错误接受率50%
-npos 1000 -nneg 2000    正、负样本数
-w  20 -h 20         
             -w -h参数与生成vec文件时设置的数值相同
 
2、What’ s falsealarm and hitrate of stage?
  stage的 ”错误接受率“ 和 ”正确检测率“ 是什么?
要了解这两个参数,需要查阅adaboost算法中关于强分类器的理论。stage就是强分类器。简单来说:
 
如果有1000个正样本,你希望检测系统能检测出其中的900个,期望的”正确检测率“就是900/1000 = 0.9。通常将minhitrate设置为0.999;
如果有1000个负样本,如果检测系统错误的将其中490当作了检测目标,”错误接受率“就是490/1000 = 0.49。通常false alram设置为0.5。
 
3、Are falsealarm and hitrate depend on each other?
    错误接受率和正确检测率之间有关系吗?
它们之间是有关系的,不能这样设置:minhitrate = 1.0,  maxfalsealarm 
= 0.0。
首先,系统根据期望的hitrate创建分类器,然后计算分类器的falsealarm。如果falsealarm比设置的maxfalsealarm高,系统会拒绝这个分类器,开始创建新的分类器。所以在训练过程中,你可以看到类似下面的信息:
 
N |%SMP|F| ST.THR | HR | FA | EXP. ERR|
+—-+—-+-+———+———+———+———+
| 0 |25%|-|-1423.312590| 1.000000| 1.000000| 0.876272|
 
HR – hitrate
FA – falsealarm
 
4、What’s falsealarm and hitrate of whole cascade?
    整个级联分类器的falsealarm和hitrate是多少?
 
False alarm of cascade = false alarm of  stage 1* false alarm of  stage 2* …
Hit rate = hitrate of  stage 1 * hitrate of stage 2* …
 
5、How many stages should be used?
    级联分类器应该被设定为多少层?
通常,14-25层就足够了。
如果层数过多,分类器的false alarm就更小,但是产生级联分类器的时间更长。
如果层数过多,分类器的hitrate就更小。(原因见4)
如果层数过多,检测速度更慢。
如果正、负样本较少,层数没必要设置很多。
 
6、What’s weighttrimming, eqw, bt, nonsym options?
    weighttrimming、eqw、bt、nonsym 选项表示什么?
nonsym            —
如果检测目标不是x或者y轴对称的,使用-nonsym选项。系统默认使用-sym选项
eqw          
       — 如果正负样本数目不相等,不要使用此选项
weighttrimming — 计算最优化选项。能减一点计算事件,但是质量也会降低
bt                  
  — 使用哪种adaboost算法:Real AB,Gentle AB等
 
7、What’s  minpos, nsplits, maxtreesplits options?
    minpos、nsplits、nsplits、maxtreesplits选项是什么?
nsplits              —— 
  树节点数的最小值
maxtreesplits    ——    树节点数的最大值
minpos             —— 
 训练过程中,节点可使用的正样本数目。正样本根据节点被分类,通常来说,minpos不小于npos / nsplits
 
8、   Errors and stranges during haartraining!
    训练过程中的错误!
①Error (valid only for Discrete and Real AdaBoost): misclass
这是警告而不是错误。D and R Adaboost算法有一些特别的选项。
 
②控制台上都是类似下面的提示 :| 1000 |25%|-|-1423.312590| 1.000000| 1.000000| 0.876272| 
训练进入了循环,重新启动训练。正常情况下,第一列应小于100
 
③cvAlloc fails. Out of memory
负样本太多或者vec文件太大,所有的图片都加载到内存,导致内存不足。
 
④注意-w -h参数的值与生成vec文件时的值相同
 
⑤注意正、负样本数目与-npos 、-nneg参数设定值相同
 
⑥防止dat文件(描述文件)中的空行
 
⑦Required leaf false alarm rate achieved. Branch training terminated
负样本图片中可能包含了被检测目标。maxfalsealarm值应该设定到0.4 - 0.5之间。
 

分类器xml文件

1、During haartraining, there are txt file in haarcascade folder, how can we
get XML  from them?
    训练过程中会产生txt文件,如果根据这些文件生成xml文件?
使用convert_cascade工具:
 convert_cascade –size=”20×20″ haarcascade haarcascade.xml
其中,haarcascade 是txt文件所在目录
 
2、How can I test generated XML cascade?
      如何测试生成的分类器?
使用performance工具来测试,其中正样本是训练过程中未使用的图片:
performance -data haarcascade -w 20 -h 20 -info positive_description.txt -ni
performance -data haarcascade.xml -info positive_description.txt -ni

使用OpenCV和训练得到的分类器检测物体

1、Is it possible to detect rotated faces?
    能不能检测旋转过的脸?
训练一个分类器来检测旋转不同角度的人脸是不可能的。但是,可是训练出分类器来检测旋转到对应角度的人脸。可以使用选择到这一角度的人脸图片来训练出分类器。在训练分类器时,加上-mode all选项表示使用所有的特征,但是早期的OpenCV版本实现的比较差。你也可以增加自己的特征,这并不困难。
另一种方法是计算出头部的选择角度,然后根据选择角度旋转检测图片来得到正脸,这样就可以使用OpenCV自带的人脸检测期来进行检测了。
 
2、Is it possible to recognize gender, attention, race with  Haar features?
    使用Haar特征能否分辨出性别、注意力、种族?
我们有过尝试,但是使用OpenCV的haartraining没有成功。我们使用性别、注意力分类器。当然你可以使用Adaboost算法,但我们没有得到很好的结果。
 
3、Is it possible to detect faces in real time?
    能否做到实时检测人脸?
在电脑上,OpenCV自带的人脸检测器检测一幅分辨率为640*480的图片需要200ms,也就是5fps,非实时。我们可以改进检测器,做到15fps,进行实时检测。

使用OpenCV训练Haar like+Adaboost分类器的常见问题的更多相关文章

  1. 使用OpenCV训练好的级联分类器识别人脸

    一.使用OpenCV训练好的级联分类器来识别图像中的人脸 当然还有很多其他的分类器,例如表情识别,鼻子等,具体可在这里下载: OpenCV分类器 import cv2 # 矩形颜色和描边 color ...

  2. opencv之haar特征+AdaBoos分类器算法流程(二)

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...

  3. opencv之haar特征+AdaBoos分类器算法流程(三)

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...

  4. 6-8 adaboost分类器2

    重点分析了Adaboost它的分类结构,以及如何使用Adaboost.这一节课讲解Adaboost分类器它训练的步骤以及训练好之后的XML文件的文件结构.所以这节课的核心是Adaboost分类器它的训 ...

  5. OpenCV学习记录(二):自己训练haar特征的adaboost分类器进行人脸识别 标签: 脸部识别opencv 2017-07-03 21:38 26人阅读

    上一篇文章中介绍了如何使用OpenCV自带的haar分类器进行人脸识别(点我打开). 这次我试着自己去训练一个haar分类器,前后花了两天,最后总算是训练完了.不过效果并不是特别理想,由于我是在自己的 ...

  6. opencv 训练自己的分类器汇总

    原地址:http://www.cnblogs.com/zengqs/archive/2009/02/12/1389208.html OpenCV训练分类器 OpenCV训练分类器 一.简介 目标检测方 ...

  7. 使用opencv训练分类器时,traincascade训练报错:Train dataset for temp stage can not be filled.解决方法

    opencv分类器训练中,出错一般都是路径出错,例如, 1.opencv_traincascade.exe路径 2.负样本路径文件,neg.dat中的样本前路径是否正确 3.移植到别的电脑并修改完路径 ...

  8. OpenCV训练分类器制作xml文档

    OpenCV训练分类器制作xml文档 (2011-08-25 15:50:06) 转载▼ 标签: 杂谈 分类: 学习 我的问题:有了opencv自带的那些xml人脸检测文档,我们就可以用cvLoad( ...

  9. 【原】训练自己haar-like特征分类器并识别物体(2)

    在上一篇文章中,我介绍了<训练自己的haar-like特征分类器并识别物体>的前两个步骤: 1.准备训练样本图片,包括正例及反例样本 2.生成样本描述文件 3.训练样本 4.目标识别 == ...

随机推荐

  1. Spring4 customEditors

    Spring4.0版本以后customEditors属性为Map<Class<?>, Class<? extends PropertyEditor>>,所以用key ...

  2. 深入理解计算机系统(2.7)------二进制小数和IEEE浮点标准

    整数的表示和运算我们已经讲完了,在实际应用中,整数能够解决我们大部分问题.但是某些需要精确表示的数,比如某件商品的价格,某两地之间的距离等等,我们如果用整数表示将会有很大的出入,这时候浮点数就产生了. ...

  3. Servlet 3.0 使用注解配置URl提示404错误

    我的环境是  Eclipse oxygen + Servlet 3.0 因为3.0已经开始使用注解了 之前我都是配置listenner 还有Servlet mapping  在 web.xml 中 就 ...

  4. php显示距当前多长时间

    <?php header("Content-type: text/html; charset=utf-8");date_default_timezone_set('PRC') ...

  5. Web 项目更改项目名

    简单的记录web开发中基本的操作. 更改项目名 直接修改 找到原项目中的.project 文件,更改中项目名称.然后在同目录下找到.mymetadata 文件 并更改name.context-root ...

  6. grunt学习笔记1 理论知识

    你需要检查js语法错误,然后再去压缩js代码.如果这两步你都去手动操作,会耗费很多成本.Grunt就能让你省去这些手动操作的成本. “—save-dev”的意思是,在当前目录安装grunt的同时,顺便 ...

  7. Android性能优化xml之<include>、<merge>、<ViewStub>标签的使用

    一.使用<include>标签对"重复代码"进行复用 <include>标签是我们进行Android开发中经常用到的标签,比如多个界面都同样用到了一个左侧筛 ...

  8. Net知识图谱

    对于Web系统开发来说,Net其实也是有好多知识点需要学的,虽然目前JAVA是主流,就业市场比较大,但Net也在积极的拥抱开源,大Net Core 2 出来了,这无疑给Net开发者带来更大的希望,好了 ...

  9. Problem 2062 Suneast & Yayamao 二进制(多重背包的理解基础)

                                          Problem 2062 Suneast & Yayamao Accept: 143    Submit: 313T ...

  10. 支持向量机SVM(二)

    [转载请注明出处]http://www.cnblogs.com/jerrylead 6 拉格朗日对偶(Lagrange duality) 先抛开上面的二次规划问题,先来看看存在等式约束的极值问题求法, ...