Opencv 提高Haar培训效果的想法

Opencv 提高Haar培训效果的想法,opencv,training-data,haar-classifier,Opencv,Training Data,Haar Classifier,请帮助我获得更多关于我第一次haar培训结果的知识。 所以我想训练Haar分类器来识别简单的笔,如下文 我用手机拍了14张钢笔画。这些图片的大小约为:263x2814 然后我收集了一些底片,其中一些是从网上下载的,尺寸为640x480,还有一些是用我的手机摄像头拍摄的,尺寸为1920x10805313x2388 有些负面图片真的很大。我总共有158张底片。 之后,创建负片和正片图像列表并运行:createsamples命令: perl createtrainsamples.pl positiv

请帮助我获得更多关于我第一次haar培训结果的知识。 所以我想训练Haar分类器来识别简单的笔,如下文

我用手机拍了14张钢笔画。这些图片的大小约为:263x2814
然后我收集了一些底片,其中一些是从网上下载的,尺寸为640x480,还有一些是用我的手机摄像头拍摄的,尺寸为1920x10805313x2388

有些负面图片真的很大。我总共有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"
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
我不确定160的身高和20的身高是否合适
在获得samples.vec文件后,我使用以下命令运行级联训练:

 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"
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) )
这种检测方法效果不好。它只是检测笔的某些部分,而不是整支笔
另外,当我有一些笔放在环境中的照片时,笔并没有被检测到

我想我需要调整所有正片和负片的大小,使它们的大小相同,尽管在这个问题上不确定
你能就我在这里做错了什么以及如何改进我的成绩提供一些意见吗


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

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

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

    -minHitRate 0.999 -maxFalseAlarmRate 0.1 -maxWeakCount 1000
    
    请注意:如果要使用上述数字,基本上必须使用LBP而不是HAAR。HAAR具有更好的检测功能,但使用LBP时,您可以使用更好的值,因为它所需的时间更少(尽管使用这些数字和大量图像(+10000),可能仍需要几天,但使用HAAR时,我可能会在几个月后看到您)。以下是制作LBP的方法:
    -featureType LBP

    minHitRate越接近1越好。MaxFalseAllarmRate越低,越适合于0。最大值越高越好。
    还要注意,设置得越好,需要进行的阶段就越少。您可能有一个25级级联,其性能比设置良好的6级级联差。还要注意的是,当你使用这些数字时,你的traincascade可能会被困在负面图像上(不过没关系)

  • 此外,照明在检测中也非常重要。使用照明良好的房间以获得更好的效果

  • 奇怪的是:当你想检测钢笔时,为什么要使用
    faces=faceCascade.detectMultiScale
    :D不要让计算机比现在更混乱:D

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

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

    -minHitRate 0.999 -maxFalseAlarmRate 0.1 -maxWeakCount 1000
    
    请注意:如果要使用上述数字,基本上必须使用LBP而不是HAAR。HAAR具有更好的检测功能,但使用LBP时,您可以使用更好的值,因为它所需的时间更少(尽管使用这些数字和大量图像(+10000),可能仍需要几天,但使用HAAR时,我可能会在几个月后看到您)。这是你怎么做到的