3

我正在尝试使用 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.2minNeighbors=3

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

当我尝试使用自己训练有素的分类器时,就会出现问题。结果不好,检测时间很长(半个多小时)

为了训练,我从一个有很多汽车的停车场的大型正射镶嵌图(我缩小了几次)中提取了正片和负片图像。我总共提取了 50 辆汽车(25x55 像素),然后我水平反射,从同一个正射镶嵌图中得到 100 个正图像和 2119 个负图像(60x60 像素)。我将此集称为图像的“完整集”。从那个集合中,我创建了一个子集(4 个正数和 35 个负数),我称之为“虚拟集”:

正面形象示例1

负片示例 1

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

  1. 假人组,LBP:训练在 1 个阶段停止。快速检测,未检测到物体
  2. 假人组,HAAR:训练在 1 阶段停止。检测需要很长时间(或至少半个多小时)。我中断了这个过程,因为它显然不起作用。
  3. 全套,LBP:训练停止在 6 个阶段。检测速度非常慢(在 500x400 像素图像中需要 1-2 分钟,使用 scaleFactor = 2)。当图像中至少有 10 辆汽车以及用于训练的同一图像时,检测很少数量的对象 (2),它们都不是汽车。
  4. 全套,HAAR:我在第 4 阶段停止训练以测试它。与 Dummy 集的行为相同。

我做错了什么?由于香蕉和面部级联在合理的时间内工作并检测到物体,问题显然出在我的级联中,但我不知道为什么。

我真的很感谢你的帮助。在此先感谢,费德里科

4

1 回答 1

0

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

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

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

因此HAAR(LBP)级联不能用于检测具有可变形状的物体。但是你可以看看深度卷积神经网络。据我所知,他们可以解决这些问题。

于 2016-09-08T08:20:16.273 回答