首页 文章

改进LBP / HAAR检测XML级联

提问于
浏览
3

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

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

  • 香蕉分类器(显然它不会检测汽车,但检测到它识别为香蕉的物体):( 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 . 我得到的结果如下:

  • 假人集,LBP:训练在1阶段停止 . 快速检测,无检测到物体

  • 假人集,HAAR:训练在1阶段停止 . 检测需要永远(或至少超过半小时) . 我打断了这个过程,因为它显然不起作用 .

  • 全套,LBP:训练在6个阶段停止 . 检测速度非常慢(500x400像素图像中1-2分钟,使用scaleFactor = 2) . 当图像中至少有10辆汽车时,检测到极少量的物体(2),没有一辆汽车,以及用于训练的相同图像 .

  • 全套,HAAR:我在第四阶段停止了训练以进行测试 . 与Dummy集相同的行为 .

我做错了什么?由于香蕉和脸部叶栅在合理的时间内工作并检测物体,问题显然在我的瀑布中,但我无法弄明白为什么 .

我非常感谢你的帮助 . 在此先感谢费德里科

1 回答

  • 0

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

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

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

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

相关问题