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)
检测效果不佳.它只是检测笔的某些部分而不是完整的笔.
此外,当我有一些笔放在环境中的照片,而不是笔没有被检测到.
我想我需要调整所有正面和负面图像的大小,并使它们大小相同,但不确定.
你能不能就我在这里做错了什么以及如何改进我的结果提出一些意见.
你可以在这里找到我的所有文件:
这些仅基于我自己的经验:
您可以在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级级联更差.另外请注意,当您使用这些数字时,您的火车赛车可能看起来像是在停止获取负面图像(虽然没关系).
奇怪的是:为什么faces = faceCascade.detectMultiScale要在检测笔时使用.:D不要让计算机比已经配对更困惑.:d