我正在尝试使用 Python 2.7 和 OpenCV 2.4.13 从无人机图像中进行汽车检测器。目标是在城市环境中从任何方向的俯视图检测汽车。我面临时间执行和准确性问题。
当我将它与从互联网上获得的一些级联一起使用时,检测器工作正常:
- 香蕉分类器(显然它不检测汽车,而是检测它识别为香蕉的物体):(coding-robin.de/2013/07/22/train-your-own-opencv-haar-classifier.html)
- 来自 OpenCV 的人脸检测级联(与香蕉分类器的行为相同)
对于检测本身,我使用detectMultiScale()
withscaleFactor = 1.1-1.2
和minNeighbors=3
检测在 4000x3000 像素图像中的合理时间(几秒)内执行。
当我尝试使用自己训练有素的分类器时,就会出现问题。结果不好,检测时间很长(半个多小时)
为了训练,我从一个有很多汽车的停车场的大型正射镶嵌图(我缩小了几次)中提取了正片和负片图像。我总共提取了 50 辆汽车(25x55 像素),然后我水平反射,从同一个正射镶嵌图中得到 100 个正图像和 2119 个负图像(60x60 像素)。我将此集称为图像的“完整集”。从那个集合中,我创建了一个子集(4 个正数和 35 个负数),我称之为“虚拟集”:
对于训练,我使用了opencv_createsamples
and opencv_traincascade
。我从 100 张正面图像中创建了 6000 个样本,将汽车从 0 度旋转到 360 度:
perl bin/createsamples.pl positives.txt negatives.txt samples 6000 "opencv_createsamples -bgcolor 0 -bgthresh 0 -maxxangle 0.5 -maxyangle 0.5 -maxzangle 6.28 -maxidev 40 -w 60 -h 60"
所以现在,我有 6000 个 60x60 像素的汽车样本图像,它们在随机背景上的任何方向。
然后我执行mergevec.py
创建samples.vec
文件,并运行训练应用程序opencv_traincascade
:
python mergevec.py -v samples/ -o samples.vec
opencv_traincascade -data classifier -vec samples.vec -bg negatives.txt -numStages 20 -minHitRate 0.999 -maxFalseAlarmRate 0.5 -numPos 3700 -numNeg 2119 -w 60 -h 60 -mode ALL -precalcValBufSize 3096 -precalcIdxBufSize 3096
使用这种方法,我训练了四个分类器,两个使用完整集,另外两个使用虚拟集,每组一个 LBP 和一个 HAAR。我得到的结果如下:
- 假人组,LBP:训练在 1 个阶段停止。快速检测,未检测到物体
- 假人组,HAAR:训练在 1 阶段停止。检测需要很长时间(或至少半个多小时)。我中断了这个过程,因为它显然不起作用。
- 全套,LBP:训练停止在 6 个阶段。检测速度非常慢(在 500x400 像素图像中需要 1-2 分钟,使用 scaleFactor = 2)。当图像中至少有 10 辆汽车以及用于训练的同一图像时,检测很少数量的对象 (2),它们都不是汽车。
- 全套,HAAR:我在第 4 阶段停止训练以测试它。与 Dummy 集的行为相同。
我做错了什么?由于香蕉和面部级联在合理的时间内工作并检测到物体,问题显然出在我的级联中,但我不知道为什么。
我真的很感谢你的帮助。在此先感谢,费德里科