您的位置:首页 > 运维架构

使用OpenCV进行目标检测的注意事项

2017-11-02 21:50 399 查看

前言

前一篇文章已经介绍过了如何使用OpenCV自带的级联分类器进行目标检测,但是在实际操作过程中和后期的算法调优的过程中都需要有依据地进行调试,这样才能又快又好将算法调试到比较理想的状态,而不是像无头苍蝇一样乱撞。本篇文章多来自于网络上无私网友的分享,这里由衷感谢他们。

正样本数据

1 、正样本图片中的关照和背景的变化是否需要很大?

是的,而且这很重要。在正样本图片中,除了被检测目标,剩下的就是背景。应该尝试用随机噪声来填充背景,避免没有变化的背景。

负样本数据

1、应该使用什么样的负样本图片?

可是使用任何OpenCV支持的图片格式,而且其中不能包含被检测目标。负样本图片应该变化很大,多种多样。

2、负样本图片是否需要缩放到同样大小?

不需要,但是负样本图片不能小于使用createsamples工具生成vec文件时设定的-w -h参数。

3、通常需要使用多少正/负样本图片?

这往往根据你的需求来确定。例如,对cascades来说,需要有1000个正样本和2000个负样本。

比较好的比例关系是 positive : negative = 1:2,但这并不是硬性规定。我推荐先使用少量的样本来尝试产生cascades,然后再扩大负样本数量。这样可以提升速度防止死循环

haartraining.exe的使用

1、使用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、stage的falsealarm(错误接受率)和hitrate(正确检测率)是什么?

要了解这两个参数,需要查阅adaboost算法中关于强分类器的理论。stage就是强分类器。简单来说:

如果有1000个正样本,你希望检测系统能检测出其中的900个,期望的”正确检测率“就是900/1000 = 0.9。通常将minhitrate设置为0.999;

如果有1000个负样本,如果检测系统错误的将其中490当作了检测目标,”错误接受率“就是490/1000 = 0.49。通常false alram设置为0.5。

3、级联分类器应该被设定为多少层?

通常,14-25层就足够了。如果层数过多,分类器的false alarm就更小,但是产生级联分类器的时间更长;如果层数过多,分类器的hitrate就更小;如果层数过多,检测速度更慢;如果正、负样本较少,层数没必要设置很多。

4、 minpos、nsplits、nsplits、maxtreesplits选项是什么?

nsplits 树节点数的最小值

maxtreesplits 树节点数的最大值

minpos 训练过程中,节点可使用的正样本数目。正样本根据节点被分类,通常来说,minpos不小于npos / nsplits

5、训练过程中的错误!

①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之间。

REF

《FAQ:OpenCV Haartraining》——使用OpenCV训练Haar like+Adaboost分类器的常见问题:http://www.cnblogs.com/chensheng-zhou/p/5542887.html

FAQ: OpenCV Haartraining : http://www.computer-vision-software.com/blog/2009/11/faq-opencv-haartraining/

利用Opencv中的Haartraining训练特征的经验谈: http://blog.sina.com.cn/s/blog_62e14ece0100yge7.html

经典的HaarTraining算法: https://yq.aliyun.com/articles/9312

Adaboost+Haar+Opencv博客: http://blog.csdn.net/lsxpu/article/details/7976609?spm=5176.100239.blogcont9312.32.QZFgMq
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: