改善哈尔培训成果的想法

时间:2017-08-21 13:23:47

标签: opencv training-data haar-classifier

请帮助我更多地了解我的第一次哈尔培训结果。 所以我想跟随Dileep Kumar’s文章训练哈尔分类器来识别简单的笔。

用手机拍了14张笔。这些图片大小很大: 263x2814
然后我收集了负面图片,其中一些是从网上下载的,尺寸 640x480 ,其中一些使用我的手机相机制作,尺寸为: 1920x1080,5313x2388

其中一些负面影像确实很大。我总共有158张负面图片 之后创建负面和正面图像列表并运行:createsamples命令:

 perl createtrainsamples.pl positives.dat negatives.dat samples 250  "opencv_createsamples  -bgcolor 0 -bgthresh 0 -maxxangle 0.5 -maxyangle 0.5 maxzangle 0.5 -maxidev 40 -w 160 -h 20"

我不确定这里160 for for和20 for height是否合适?
然后在使用samples.vec文件后,我使用以下命令运行级联训练:

opencv_traincascade -data firstTry -vec samples.vec  -bg negatives.dat -numPos 250 -numNeg 99 -numStages 25 –featureType HAAR  -mode ALL -w 160  -h 20 -mem 2048

我使用相同的宽度和高度,但不确定这是否正确。我从一些参考脚本中获取了宽度和高度值。获取cascade.xml文件后,我使用以下参数在我的图片上运行detectMultiScale:

faces = faceCascade.detectMultiScale(   image,   scaleFactor=1.4,  minNeighbors=3,   minSize=(30, 30) )

检测效果不佳。它只是检测笔的某些部分而不是完整的笔。
此外,当我有一些笔放在环境中的照片,而不是笔没有被检测到。

我认为我需要调整所有正面和负面图像的大小并使它们大小相同,但不确定。
你能否就我在这里做错了什么以及如何改进我的结果提出一些意见。

您可以找到我的所有文件here

1 个答案:

答案 0 :(得分:6)

这些仅基于我自己的经验:

  1. 我认为当原始图像的宽度和高度相等时,createsamples可以很好地 。这是因为当creatamples旋转你的图像时,如果宽度和高度不同,图像就会被剪切掉(进入你的肯定文件夹并查看它创建的图像。你会看到。)所以我的建议是...如果这是你第一次想要测试创新样本(并且不知道其他任何方式),选择宽度和高度相等的圆形或方形物体。
  2. 你的负面和正面图片的数量非常低......应该是成千上万的。
  3. 正如我在#1中所说,你的-w -h应该是相同的(如果使用的是创新样本)。并且不要 EVER 每个使用超过25个(我推荐20 20甚至15 15)。由于我经历了非常长的训练时间而没有太大的检测增益(实际上,一旦我经历了较低的检测率,可能是训练时间的5或6倍)。
  4. 在使用createsamples(可能是100x100)之前,将所有负片图像调整为相同的大小。并将原始图像的宽度和高度调整为一半或更低(可能为50x50)。
  5. 您可以在traincascade命令中更改一些重要变量,使检测效果更好,但它们会使训练时间过长:

    -minHitRate 0.999 -maxFalseAlarmRate 0.1 -maxWeakCount 1000
    

    警告:如果您要使用上述数字, 基本上必须 使用LBP而不是HAAR。 HAAR有更好的检测功能,但使用LBP可以使用更好的值,因为它占用的时间更少(尽管使用这些数字和大量图像(+10000)可能仍需要数天但是使用HAAR并且我 可能 几个月后见到你。以下是你如何制作LBP:-featureType LBP 更接近-minHitRate为1越好。较低的-maxFalseAlarmRate为0越好。并且-maxWeakCount越高越好。
    另请注意,您设置的越多,您需要的阶段越少。你可能有一个25级的级联,比一个设置良好的6级级联更差。另外请注意,当您使用这些数字时,您的火车赛车可能看起来像是停留在获得负面图像上(虽然没关系)。

  6. 照明在检测中也非常重要。使用光线充足的房间可以获得更好的效果。
  7. 奇怪的是:当你想要检测笔时,为什么要使用faces = faceCascade.detectMultiScale:D 不要让计算机比已经配对更困惑。的:d