OpenCV 和 C++:Traincascade 错误:一个实际问题

Posted

技术标签:

【中文标题】OpenCV 和 C++:Traincascade 错误:一个实际问题【英文标题】:OpenCV and C++: Error with Traincascade: A Practical Issue 【发布时间】:2013-10-23 08:47:35 【问题描述】:

在过去的几天里,我一直在研究 createsamples 和 traincascade 方法以生成汽车级联分类器。像我自己,很多人发现自己不知道如何克服所有的错误和问题,所以在这篇文章中,我将尽我所能解释我的程序和推理,以及我的问题。

为了提供更多背景信息,过去我自己实现了一个带有 Haar 特征的增强分类器,但由于该方法没有级联,所以速度非常慢。不过,我非常熟悉级联分类背后的方法。

问题:图像上的汽车分类

我下载了一个数据集(一组图像),它提供了 550 个正窗口(100w x 40h 有汽车的图像)和 500 个负窗口(100w x 40h 没有汽车的图像),我打算使用这些数据来训练级联分类器.

第 1 步 - 生成用于创建示例的 .dat 文件

createsamples 应用程序需要一个 .dat 文件,其中包含有关正样本和负样本的信息。我生成了两个 .dat 文件,一个带有正窗口,另一个带有负窗口:

positive.dat 示例结构:

CarData\TrainImages\POS\pos-0.pgm 1 0 0 100 40

CarData\TrainImages\POS\pos-1.pgm 1 0 0 100 40 (and more 548 lines of this)

数字1表示整幅图像中有一个物体,后面的4个整数代表有物体的边界框(本例中为整幅图像)

negative.dat 示例结构:

CarData\TrainImages\NEG\neg-0.pgm

CarData\TrainImages\NEG\neg-1.pgm(and more 498 lines of this)

第 2 步 - 生成 .vec 文件

为此,我使用带有以下命令行的 createsamples.exe 应用程序:

: createsamples.exe -info path/positive.dat -vec samples.vec -bg negative.dat -w 100 -h 40 -num 550

到目前为止一切顺利,samples.vec 文件生成没有问题。

第 3 步 - 训练级联分类器

为此,我使用带有以下命令行的 traincascade 应用程序:

: traincascade.exe -data CarDetector -vec path/samples.vec -bg path/negative.dat -numStages 15 -stageType BOOST -featureType HAAR -w 100 -h 40 -bt DAB -maxDepth 2 -mode ALL

参数说明:

numStages(15):表示我希望我的分类器有 15 个决策阶段。

stageType(BOOST):每个阶段都是一个增强分类器

featureType(HAAR):使用 haar 特征进行分类。 HOG 和 LBP 也可用。

w(100):检测窗口宽度

h(40):检测窗口高度

bt(DAB):表示我想使用 Discrete Adaboost(而不是 logitboost 等)

maxDepth(2):表示每个弱分类器将使用 3 个特征进行分类

-mode(ALL):我认为这意味着它将使用各种 haar 功能。

错误

当我运行命令时,程序立即崩溃,没有错误消息,所以我完全不知道我做错了什么。 我希望有这方面经验的人能找出我的程序存在的问题,因为这是许多尝试使用此应用程序的人所共有的问题。

问候!

重要 - 编辑 2:

我尝试使用已弃用的应用程序 haartraining 训练分类器,只是想看看是否可以获得更多信息,结果如下:

【问题讨论】:

按照建议按“重试”调试后会发生什么? 出现另一个对话框,提示应用程序停止工作。我尝试将该进程附加到 Visual Studio,然后按重试,只是想看看 VS 是否会告诉我它在哪里崩溃,但没有运气。 确保文件已打开/找到。刚刚在这里解决了类似的问题 -***.com/questions/19401167/…。 【参考方案1】:

您正在使用尺寸为 100x40 的图像。 (-w 100 -h 40) 显然 OpenCV 会预先计算所有可能的特性,这会导致分配错误(我的系统分配错误)。尝试缩小到 25x10,看看是否仍然会出现这种情况。

【讨论】:

以上是关于OpenCV 和 C++:Traincascade 错误:一个实际问题的主要内容,如果未能解决你的问题,请参考以下文章

python opencv怎么创建一个cascadeobjectdetector对象

用opencv3.3自带的traincascade.exe训练LBP特征的分类器

OpenCV Traincascade.exe 崩溃且无输出

错误“无法填充临时阶段的训练数据集。”在使用 OpenCV 的 traincascade 工具时

opencv_annotation.exeopencv_createsamples.exeopencv_traincascade.exe

[opencv][转载]opencv级联分类器参数含义介绍