【发布时间】:2012-12-12 02:11:57
【问题描述】:
我在 openCV 2.4.3 中运行 Haar 训练。
- 我有 10 张负片和大约 30 张正片(我知道数量很少)。
- 正样本被组织在“vec”文件中,负(背景)图像由存储图像路径的文本文件描述。
- 对于如此少量的图像,存在一个完美的解决方案(所有背景图像都被归类为假,真实样本为真)。
当找到这个完美的解决方案时,openCV 进入icvGetHaarTrainingData() 函数内的无限循环。
它想找到级联失败的背景图像,但没有更多这样的图像,所以这个函数永远卡在for(;;)循环中。
icvGetBackgroundImage() 函数,在这个循环中调用,只是不断地从硬盘加载被级联拒绝的相同图像。
有人知道我可以应用补丁或错误修复来解决此问题吗?
我想出的一个可能的解决方法是让icvGetBackgroundImage() 只加载每个文件一次,因为如果它被级联拒绝一次,它将永远被拒绝。但这是一个错误的调整,因为同样的函数用于在 cvCreateSamples() 中生成“vec”文件,在这种情况下,我们确实希望它多次加载相同的文件。
第二个可能的修复方法 - 在 vec 文件中使用负面示例(如正面示例)而不是信息路径格式。这是一种通过不激活有问题的回调来克服无限循环的方法,但结果是导致崩溃的 openCV 错误。当负'vec'文件到达EOF时会发生这种情况。
同时,我通过直接更改 openCV 的源代码并重新编译二进制文件解决了这两个错误(无限循环和崩溃)。我会尽快将我的更改提交给 openCV 委员会。但我不敢相信我是唯一一个遇到这种问题的人......
【问题讨论】:
-
你能发布你的代码吗?这将使故障排除更容易。
-
OpenCV haar 训练被编译为 exe,我正在从命令提示符激活 exe 文件。没有我的代码。问题出在openCV内部。我使用以下行调用此 exe 文件: P:\Bin\opencv_haartraining.exe -data P:\zDB_CC\TrainData\cv -vec P:\zDB_CC\TrainData\cv.vec -bg P:\zDB_CC\TrainData\cv_neg .txt -npos 10 -nneg 30 -nstages 5 -nsplits 1 -mem 1000 -nonsym -minhitrate 0.99799 -maxfalsealarm 0.039811 -mode BASIC -bt GAB -maxtreesplits 0 -minpos 500 -w 16 -h 24
-
您可以在这里发布您对源代码的更改吗?我目前遇到和你一样的问题。
-
对不起,伙计。它很难。我对几个文件进行了更改。给我在 gmail 上给 DanielHsH 写一封电子邮件,我将向您发送我所做更改的更改 + 文档。现在它像魔术一样工作!顺便一提。为了训练级联以进行良好的检测,您至少需要 100 万个负例。假设每一轮你选择了 1000 个样本,并且在 10 个阶段后,级联平均拒绝每个阶段 50% 的否定样本,你将用完大约百万个样本。