如何为自定义对象检测创建自己的 Haar 级联分类器?

How to create your own Haar Cascade Classifier for custom object detection?

我想检测汽车,但可用的 xml 文件不够准确 detection.How 我可以创建一个自定义 xml 文件(我可以为任何对象创建该文件)?

如有任何帮助,我们将不胜感激。

有一些关于如何创建您自己的级联的步骤。

我的参考资料:

1-数据收集

您需要正片(这意味着包括您要训练的对象)图像和负片(您的对象不存在于图像中)图像。根据人们的经验,正面图像的数量应该是负面图像的两倍

注意:根据我的经验和文档,800 张负片 - 1600 张正片图像通常会产生良好的结果。

2- 标签

对于每张正面图像,您应该创建标签文件,如 data.lst。此列表文件的每一行应包含:

  • 图片名称
  • 图像中的对象数
  • 图像中每个对象的拟合矩形坐标

这一步是痛苦的一步。要处理它 opencv_createsamples 为您创建该列表文件。与自己准备相比,这效率不高,但也可以。它只是使用底片图像作为背景,然后将您的正面图像随机复制到该背景中。然后创建一个列表文件。

您可以 运行 opencv_createsample 通过终端命令:

opencv_createsamples -img your_image.jpg -bg bg.txt -info info/info.lst -pngoutput info -maxxangle 0.5 -maxyangle 0.5 -maxzangle 0.5 -num 1800

在上面的命令中你给出并得到:

  • 您的正面形象
  • bg.txt 包含底片目录和名称的文件
  • info.lst你要获取的文件
  • 旋转限制
  • 你要获取的图片数量

3- 创建矢量文件

在这一步中,再次使用opencv_createsample命令,我们得到了正片图像的矢量文件。以下是命令示例:

opencv_createsamples -info info/info.lst -num 1800 -w 50 -h 50 -vec positives.vec

您只需提供准备好的列表文件、宽高和所需的矢量文件名。您可以从文档中了解更多关于宽度和高度部分的信息。

4-训练

这一步是最后一步。 opencv_traincascade 最后使用命令。我们给出输入:

  • 正像的矢量文件
  • 负面图片
  • 负片和正片数量
  • 宽度和高度(如pos向量部分)
  • 阶段数(迭代)

这是示例命令:

opencv_traincascade -data data -vec positives.vec -bg bg.txt -numPos 1800 -numNeg 900 -numStages 10 -w 50 -h 50

最后我们得到一个 xml 文件。

Note-1: OpenCV 3.4... versions have a problem about the opencv_createsamples, when I searched people are saying a漏洞。我建议你使用不同的版本。

注2:最后一步是耗时最长的一步(如果不自己做标签的话)。我什至在一些坏电脑上试过,花了 4 个小时才完成(对于上面命令中的命令值)