python - 让 haar 级联工作

标签 python opencv image-processing object-detection haar-classifier

我正在尝试使用 opencv 在图像中查找交通锥。

该代码使用多种方法从图像中裁剪出感兴趣的区域,并为锥体找到精确的边界框。 效果很好的方法是按颜色进行分割,然后进行 Blob 检测,然后使用最近邻分类器来消除误报。

我想使用 Haar Cascades 而不是 blob 检测。这应该意味着区域是基于颜色(HSV 分割)和形状(Haar 级联)选择的。

我使用了这个教程:http://docs.opencv.org/trunk/dc/d88/tutorial_traincascade.html

我只是在寻找特定类型的交通锥。它们具有已知的尺寸和颜色。所以我制作了一个交通锥形状的模板。这是我用来生成训练样本的命令、模板和为训练生成的正样本之一(样本以更高分辨率生成,我使用 20x20 像素进行训练):

opencv_createsamples -vec blue.vec -img singles/blue.png -bg bg.txt -num 10000 -maxidev 25 -maxxangle 0.15 -maxyangle 0.15 -maxzangle 0.15 -w 20 -h 20 -bgcolor 0 -bgthresh 1

template traffic cone enter image description here

训练是用这个命令完成的:

opencv_traincascade -data blue_data/ -vec blue.vec -bg bg.txt -numPos 1000 -numNeg 9000 -numStages 10 -numThreads 8 -featureType HAAR -w 20 -h 20 -precalcValBufSize 4096 -precalcIdxBufSize 4096

训练很快结束:

===== TRAINING 3-stage =====
<BEGIN
POS count : consumed   1000 : 1000
NEG count : acceptanceRatio    9000 : 0.00248216
Precalculation time: 18
+----+---------+---------+
|  N |    HR   |    FA   |
+----+---------+---------+
|   1|        1|        1|
+----+---------+---------+
|   2|        1|        1|
+----+---------+---------+
|   3|        1| 0.199556|
+----+---------+---------+
END>
Training until now has taken 0 days 0 hours 5 minutes 44 seconds.

===== TRAINING 4-stage =====
<BEGIN
POS count : consumed   1000 : 1000
NEG count : acceptanceRatio    0 : 0
Required leaf false alarm rate achieved. Branch training terminated.

现在我已将其应用到测试图像,左上角的圆锥体是我的模板,印在图像上。

enter image description here enter image description here

我认为结果看起来不太好。 模板找到了,但是有很多误报。 一些误报对我来说看起来很奇怪。 例如:左边有一个锥体。它有一个明亮的底部和带有黑色条纹的尖端。在颜色上,这是黄色和黑色。 这是由分类器巧妙地检测到的。 但是,锥体基本上与模板相反(我没有使用反转颜色作为训练样本的增强)。

训练完成后,您可以做 3 件事来调整性能:

  1. 调整输入图像的大小
  2. 更改detectMultiScale的比例因子
  3. 更改 minNeighbors 参数。

它们都不适合我。事实上,上面的例子几乎是挑剔的。对于大多数其他设置,检测会发现很多误报,甚至会忽略角落中的模板。

我想仔细看看并从图像中裁剪出一个区域。 这已被处理:

cone_cascade.detectMultiScale(crop, scaleFactor=1.0001, minNeighbors=0)

我们的想法是确保查看所有量表并保留所有匹配项。

enter image description here enter image description here

我完全不明白这些结果。

使用 haar 级联时有什么需要注意的吗? 我做错了什么吗?

最佳答案

也许 4 个月后它不是实际的,但这也许可以帮助其他人。

Required leaf false alarm rate achieved. Branch training terminated.

此消息意味着您的检测器已经过足够的训练,因此无需执行更多步骤。但是,我猜你的数据集包含的正图像数量非常少,正如 Catree 在上面的评论中提到的那样,如果你想让检测器做得很好,你应该添加更多的正图像,这样检测器就可以在不同的光照位置找到你的对象。

您提供的正面图像越多,准确度越高。当我训练 cascade 时,我有大约 50 个阳性结果,结果还不错,但并不理想。

同样在开始训练之前对图像进行灰度化并调整它们的大小,以便在大数据集上更快地完成训练。尺寸最大为 100x100px 就足够了。您的底片可以是任何大小,但是,我也调整了它们的大小,但这次使用 500x500px 参数。

如果您进行更多的肯定,您将需要在一个信息文件中比较它们。您可以像我一样手动执行此操作或编写一个小脚本来完成所有工作。实际上,如果你愿意,你可以使用我的,它只需要从终端发出几个命令就可以准备好所有用于训练的数据。您从 this repo 克隆它.通过在终端中键入 python create_dataset.py -h 调用它的帮助指南。为了方便起见,我将在最近的时间提供自述文件。

关于python - 让 haar 级联工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43234328/

相关文章:

python - 在 Python 中比较两个不同顺序的字典列表

python - 如何仅按字符串中的第一个特殊字符拆分字符串?

c# - 使用 Emgu CV(或 OpenCV)进行运动跟踪

Python 程序读取一个文本文件,然后将其内容写入另一个文件,具有不同大小的边距,由用户输入

python - Py2exe 无法编译 Pandas read_excel

c++ - OpenCV:如何在图像上应用彩虹渐变图?

c++ - OpenCV imshow() 循环显示图像

opencv - (opencv) imread 与 CV_LOAD_IMAGE_GRAYSCALE 产生 4 channel 垫

opencv - 将多张图像分割成一张的最佳方法

cocoa - 使用 Cocoa API 的综合图像处理示例