6

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

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

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

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

4

1 回答 1

12

2012 年 6 月,OpenCV DevZone 站点上的实用程序的创建者回答了这个问题。

引用玛丽亚的话:

问题是您的 vec 文件具有与您在命令行中传递的完全相同的样本数 -numPos 979。训练应用程序使用 vec 文件中的所有样本来训练 0 阶段,它无法为下一个阶段获得新的正样本阶段训练,因为 vec 文件已经结束。traincascade 的错误在于它在这种情况下具有 assert() ,但它必须为用户抛出带有错误消息的异常。它已在 r8913 中修复。-numPose 是用于训练每个阶段的样本计数。一些已经使用的样本可以被每个前一个阶段过滤(即识别为背景),但每个阶段不超过 (1 - minHitRate) * numPose。因此 vec 文件必须包含 >= (numPose + (numStages-1) * (1 - minHitRate) * numPose) + S,其中 S 是 vec 文件中可以立即识别为背景的样本数。

它对我有用。我也有同样的问题,我正在关注关于 HAAR 培训的著名教程,但想尝试使用 -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 <= 4027/1.019

numPos <= 3951 ~~ 3950

并使用:

-npos 3950 -neg 2973

有用。我还注意到其他人在减少 numPos 方面也取得了成功:这里

于 2013-01-27T00:52:02.617 回答