改善哈尔培训成果的想法

hay*_*ykp 1 opencv training-data haar-classifier

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

用我的手机拍了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"
Run Code Online (Sandbox Code Playgroud)

我不确定这里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
Run Code Online (Sandbox Code Playgroud)

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

faces = faceCascade.detectMultiScale(   image,   scaleFactor=1.4,  minNeighbors=3,   minSize=(30, 30) )
Run Code Online (Sandbox Code Playgroud)

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

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

你可以在这里找到我的所有文件:

ROA*_*OAR 6

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

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

    -minHitRate 0.999 -maxFalseAlarmRate 0.1 -maxWeakCount 1000
    
    Run Code Online (Sandbox Code Playgroud)

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

  6. 照明在检测中也非常重要.使用光线充足的房间可以获得更好的效果.

奇怪的是:为什么faces = faceCascade.detectMultiScale要在检测笔时使用.:D不要让计算机比已经配对更困惑.:d