当前位置: 首页 > 知识库问答 >
问题:

改进LBP/HAAR检测XML级联

丁子石
2023-03-14

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

当我将探测器与我从互联网上获得的一些级联一起使用时,它运行良好:

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

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

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

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

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

正面图像示例1

负片图像示例1

对于培训,我使用了opencv\u createsamplesopencv\u 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创建样本。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个阶段停止。快速检测,未检测到任何物体

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

非常感谢你的帮助先谢谢你费德里科

共有1个答案

牧梓
2023-03-14

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

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

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

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

 类似资料:
  • 我想用OpenCV fullbody Haar Cascades检测图像中的人体。这是我的代码: 结果如下: 后果 如您所见,我的代码没有检测到图像中的整个人体。 顺便说一句,我是OpenCv的新手,这是我在这里的第一个问题,所以如果我做错了什么,请纠正我,我希望有人能帮助我纠正我的代码。 抱歉英语不好;)。

  • 以下是我采取的步骤: 高斯模糊 这是我的密码: 这就是结果。 如何改进此检测?有没有更有效的方法来检测线条?

  • 变化检测器的目标是知道从上一次变化检测过程运行以来,组件的模板中使用的哪些模型属性已经改变。 为了知道,Angular创建了一个适当的变化检测器类的实例和一个链接到它应该检查的组件。 在我们的示例中,因为我们只有一个和MovieComponent的实例,我们将只有一个MainComponent_ChangeDetector和MovieComponent_ChangeDetector的实例。 下面的

  • 我有一个Jqgrid,Dinamicly生成如下所示的选择:

  • 问题内容: 当用鼠标单击时,如何检测JRadioButton从“未选中”更改为“选中”?我曾尝试在按钮上使用ActionListener,但是每次单击单选按钮时都会触发该事件,而不仅仅是在将状态更改为“选定”时触发。 我曾想过要维护一个记住按钮状态的布尔变量,并在ActionListener中对其进行测试以查看是否更改其状态,但是我想知道是否有更好或更干净的解决方案。 问题答案: 看一下JRadi

  • 还是由于 JavaScript 的限制,Vue 不能检测对象属性的添加或删除: var vm = new Vue({ data: { a: 1 } }) // `vm.a` 现在是响应式的 vm.b = 2 // `vm.b` 不是响应式的 对于已经创建的实例,Vue 不能动态添加根级别的响应式属性。但是,可以使用Vue.set(object, key, value)方法向嵌