haar 训练 OpenCV 断言失败

Posted

技术标签:

【中文标题】haar 训练 OpenCV 断言失败【英文标题】:haar training OpenCV assertion failed 【发布时间】:2012-06-07 11:29:24 【问题描述】:

我正在尝试使用 3340 个正图像和 1224 个负图像在 OpenCV 中为行人训练一个类似于 haar 的分类器。 (在 .txt 文件中,我保留负图像名称,即底片(1).bmp,在 txt 文件中,我保留正图像名称,即图片(1).bmp 1 0 0 64 128。 实际上正样本已经是行人的裁剪图像,所以我只需要为每张图像指定一个正样本。

在训练过程中的某个时刻,它会停下来并说:

“Opencv 错误:未知函数中的断言失败 (elements_read==1),文件 c:\path\cvhaartraining.cpp,第 1858 行”

关于造成这种情况的任何想法?

【问题讨论】:

您使用的是哪个版本的 OpenCV?可能是以下断言失败:assert( img->rows * img->cols == ((CvVecFile*) userdata)->vecsize ); 这意味着行和列与向量的大小不对应。但我不知道是什么原因造成的。 嗨,我正在使用带有预裁剪图像 64X128 的 opencv 2.4。谢谢 你能查出是不是只有一张特定的图片导致了这种情况,或者它们都不起作用吗?如果它是一个特定的图像,你可以看到这个图像中的 hwat 是不同的。如果它们都不起作用,我们可以看看图像本身。 到目前为止,不寻常的是我在正样本中有一些重复的图像(不是很多,只有 6 个) 【参考方案1】:

OpenCV DevZone 网站in June 2012.上的实用程序的创建者回答了这个问题

引用玛丽亚的话:

问题是您的 vec 文件具有完全相同的样本数 您在命令行中传递的 -numPos 979。使用的培训应用程序 vec 文件中的所有样本都训练 0-stage 并且它不能得到新的 下一阶段训练的正样本,因为 vec 文件已经结束。 traincascade 的错误是它在这种情况下有 assert() ,但它 必须为用户抛出带有错误消息的异常。它是固定的 在 r8913 中。 -numPose 是用于训练每个阶段的样本计数。一些已经使用的样本可以被每个前一个阶段过滤(即 识别为背景),但不超过 (1 - minHitRate) * numPose 在每个阶段。所以 vec 文件必须包含 >= (numPose + (numStages-1) * (1 - minHitRate) * numPose) + S,其中 S 是来自 vec 文件的样本计数,可以立即识别为背景。我希望它 可以帮助您创建正确大小的 vec 文件并选择正确的 numPos 价值。

它对我有用。我也有同样的问题,我正在关注famous tutorial on HAAR training,但想尝试使用更新的培训实用程序 -npos 7000 -nneg 2973

所以我做了以下计算:

vec 文件必须包含 >= (numPos + (numStages-1) * (1 - minHitRate) * numPos) + S

7000 >= (numPos + (20-1) * (1 - 0.999) * numPos) + 2973

(7000 - 2973)/(1 + 19*0.001) >= numPos

numPos

numPos

并使用:

-npos 3950 -nneg 2973

它有效。我还注意到其他人在减少 numPos 方面也取得了成功:here

【讨论】:

其他人是否发现 -numPos 和 -numPose 是两个不同的东西令人困惑?或者只是一个错字? numPose 在这里的文档中不存在:docs.opencv.org/doc/user_guide/… 我知道这是一个直接的 qoute,但为了清楚起见,编辑它可能会很好 是的,变量名非常错误。除此之外,负图像的总数必须小于正图像(根据方程式),但此信息无处可寻。

以上是关于haar 训练 OpenCV 断言失败的主要内容,如果未能解决你的问题,请参考以下文章

OPENCV / C++: approxpolydp 断言失败错误

为啥我会收到此 OpenCV 错误断言失败?

opencv 读取图像断言失败

OpenCV 错误:断言失败

使用 Opencv 时 C++ 调试断言失败

OpenCV 断言在矩阵乘法上失败