我正在尝试用Python 2.7和OpenCV 2.4.13从无人机图像中做一个汽车探测器。目标是在城市环境中从任何方向的上方视图检测汽车。我正面临时间执行和准确性问题。
当我使用一些从互联网上获得的级联时,探测器工作正常:
对于检测本身,我使用detectMultiScale()
scaleFactor = 1.1-1.2
和minNeighbors=3
在4000x3000像素的图像中,在合理的时间(几秒钟)内执行检测。
当我尝试使用自己训练有素的分类器时会出现问题。结果很糟糕,执行检测需要很长时间(超过半小时)
对于训练,我从一个有大量汽车停车场的大型正交马赛克(我缩小了几次)中提取了正面和负面图像。我提取了总共50辆汽车(25x55像素),然后我水平反射,产生100张正像,2119张负像(60x60像素)来自相同的正射马赛克。我将此组称为图像的“完整集”。从那个集合中,我创建了一个子集(4个正数和35个负数),我称之为“虚拟集”:
对于培训,我使用了opencv_createsamples
和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。我得到的结果如下:
我做错了什么?由于香蕉和脸部叶栅在合理的时间内工作并检测物体,问题显然在我的瀑布中,但我无法弄明白为什么。
我非常感谢你的帮助。 提前致谢, 费德里科
答案 0 :(得分:0)
我无法准确地说出来,但我知道为什么你不能训练HAAR(LBP)级联来检测任意方向的汽车。
当检测到具有大致相同形状和颜色(亮度)的物体时,这些级联工作正常。正面的面是这些物体的一个很好的例子。但是当面部有另一种方向和颜色时它会更糟糕(它不是开玩笑,OpenCV标准的哈尔级联有检测到皮肤黝黑的人的问题)。虽然这些问题是训练集的结果,但训练集只包含正面导向的欧洲人的面孔。但是,如果我们尝试添加具有所有颜色和空间方向的训练集面,我们将面临与您相同的问题。
在训练过程中,每个阶段的训练算法都试图找到分离负样本和正样本的特征集(HAAR或LBP)。如果检测到的对象具有复杂且可变的形状,则所需特征的数量非常大。大量必需的功能导致级联分类器工作非常缓慢或根本无法训练。
因此,HAAR(LBP)级联不能用于检测具有可变形状的物体。但是你可以看看Deep Convolution Neural Networks。据我所知,他们可以解决这些问题。