改进LBP / HAAR检测XML级联

时间:2016-09-02 18:41:32

标签: python image opencv object-detection cascade-classifier

我正在尝试用Python 2.7和OpenCV 2.4.13从无人机图像中做一个汽车探测器。目标是在城市环境中从任何方向的上方视图检测汽车。我正面临时间执行和准确性问题。

当我使用一些从互联网上获得的级联时,探测器工作正常:

  • 香蕉分类器(显然它不会检测汽车,但检测到它识别为香蕉的物体):( coding-robin.de/2013/07/22/train-your-own-opencv-haar-classifier.html )
  • 来自OpenCV的人脸检测级联(与香蕉分类器相同)

对于检测本身,我使用detectMultiScale() scaleFactor = 1.1-1.2minNeighbors=3

在4000x3000像素的图像中,在合理的时间(几秒钟)内执行检测。

当我尝试使用自己训练有素的分类器时会出现问题。结果很糟糕,执行检测需要很长时间(超过半小时)

对于训练,我从一个有大量汽车停车场的大型正交马赛克(我缩小了几次)中提取了正面和负面图像。我提取了总共50辆汽车(25x55像素),然后我水平反射,产生100张正像,2119张负像(60x60像素)来自相同的正射马赛克。我将此组称为图像的“完整集”。从那个集合中,我创建了一个子集(4个正数和35个负数),我称之为“虚拟集”:

Positive image example 1

Negative image example 1

对于培训,我使用了opencv_createsamplesopencv_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。我得到的结果如下:

  1. 假人套装,LBP:训练在1个阶段停止。快速检测,未检测到物体
  2. Dummy set,HAAR:训练在1个阶段停止。检测需要永远(或至少超过半小时)。我打断了这个过程,因为它显然无法正常工作。
  3. 全套,LBP:训练在6个阶段停止。检测速度非常慢(500x400像素图像中1-2分钟,使用scaleFactor = 2)。当图像中至少有10辆汽车时,检测到极少量的物体(2),没有一辆汽车,以及用于训练的相同图像。
  4. 全套,HAAR:我在第四阶段停止了训练以进行测试。与Dummy集相同的行为。
  5. 我做错了什么?由于香蕉和脸部叶栅在合理的时间内工作并检测物体,问题显然在我的瀑布中,但我无法弄明白为什么。

    我非常感谢你的帮助。 提前致谢, 费德里科

1 个答案:

答案 0 :(得分:0)

我无法准确地说出来,但我知道为什么你不能训练HAAR(LBP)级联来检测任意方向的汽车。

当检测到具有大致相同形状和颜色(亮度)的物体时,这些级联工作正常。正面的面是这些物体的一个很好的例子。但是当面部有另一种方向和颜色时它会更糟糕(它不是开玩笑,OpenCV标准的哈尔级联有检测到皮肤黝黑的人的问题)。虽然这些问题是训练集的结果,但训练集只包含正面导向的欧洲人的面孔。但是,如果我们尝试添加具有所有颜色和空间方向的训练集面,我们将面临与您相同的问题。

在训练过程中,每个阶段的训练算法都试图找到分离负样本和正样本的特征集(HAAR或LBP)。如果检测到的对象具有复杂且可变的形状,则所需特征的数量非常大。大量必需的功能导致级联分类器工作非常缓慢或根本无法训练。

因此,HAAR(LBP)级联不能用于检测具有可变形状的物体。但是你可以看看Deep Convolution Neural Networks。据我所知,他们可以解决这些问题。