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

Posted

技术标签:

【中文标题】错误“无法填充临时阶段的训练数据集。”在使用 OpenCV 的 traincascade 工具时【英文标题】:Error "Train dataset for temp stage can not be filled." while using traincascade tool of OpenCV 【发布时间】:2012-07-09 21:22:28 【问题描述】:

我正在 Windows 7 上使用 vs2010 从源代码 (OpenCV 2.4.0) 构建 opencv_traincascade.exe 工具。我想训练 LBP 分类器,所以我使用带有以下参数的 opencv_traincascade.exe

-data D:\OpenCV\Classifiers\lbpclassifier1\temp\data -vec D:\OpenCV\Classifiers\lbpclassifier1\temp\samples.vec -bg D:\OpenCV\Classifiers\lbpclassifier1\temp\negative\infofile.txt -numPos 40 -numNeg 40 -precalcIdxBufSize 500 -precalcValBufSize 500 -stageType BOOST -featureType LBP -w 24 -h 24

我得到的错误信息是:

PARAMETERS:
cascadeDirName: D:\OpenCV\Classifiers\lbpclassifier1\temp\data
vecFileName: D:\OpenCV\Classifiers\lbpclassifier1\temp\samples.vec
bgFileName: D:\OpenCV\Classifiers\lbpclassifier1\temp\negative\infofile.txt
numPos: 2
numNeg: 40
numStages: 20
precalcValBufSize[Mb] : 500
precalcIdxBufSize[Mb] : 500
stageType: BOOST
featureType: LBP
sampleWidth: 24
sampleHeight: 24
boostType: GAB
minHitRate: 0.995
maxFalseAlarmRate: 0.5
weightTrimRate: 0.95
maxDepth: 1
maxWeakCount: 100

===== TRAINING 0-stage =====
<BEGIN
POS count : consumed   2 : 2
Train dataset for temp stage can not be filled. Branch training terminated.

之前有人问过这个问题:Error while using opencv_train cascade ,并且那里提出了解决方案,即。在这种情况下,使正样本和负样本的数量相等并没有帮助。

我认为该错误可能与此错误有关:http://code.opencv.org/issues/1834 因此,我从该页面下载了最新版本的 imagestorage.cpp 并重建了 opencv_traincascades 工具。 此外,.vec 文件中的样本总数为 45。因此,正如comment 中所建议的那样,我已将 numPos 参数更改为 2,这样我就不会用完 .vec 文件中的样本。 .vec 文件中的样本数为 45。

非常感谢任何帮助。谢谢。

【问题讨论】:

【参考方案1】:

我也在学习如何使用 OpenCV 对象检测工具。

我注意到如果 bg 文件(在您的情况下为“D:\OpenCV\Classifiers\lbpclassifier1\temp\negative\infofile.txt”)格式错误或包含不存在文件的条目,opencv_traincascade 会产生错误.

希望对你有帮助。

【讨论】:

【参考方案2】:

我希望结束这个问题。对于那些偶然发现这一点的人。我知道它老了。 我调试了 traincascade 并发现,在某些时候以下行:

src = imread( imgFilenames[last++], CV_LOAD_IMAGE_GRAYSCALE );

返回一个空垫。这一行应该读取背景图像。

如果您将 traincascade.cpp 构建为调试版本并使用 opencv 的发布库和 dll,则会出现此错误。 (反之亦然。

【讨论】:

嗨。我不明白这有什么帮助。我应该从不同的来源获得一些库吗?有我可以应用的补丁吗?我正在运行 opencv 版本 2.4.10,当它达到第 3 阶段时,我遇到了这个错误。 您基本上可以在调试和发布模式下构建您的应用程序。您获得的库通常是为发布而构建的,因此您也需要构建您的应用程序以进行发布。但由于错误发生在第 3 阶段,它可能是另一个错误。我建议你获取 opencv 源代码,并调试整个事情,以检查有什么问题。【参考方案3】:

我遇到了类似的问题,它给出了错误:

POS count : consumed   50 : 50
Train dataset for temp stage can not be filled. Branch training terminated.

问题是,我的 bg.txt 是在 Windows 系统中使用 \r 生成的。当我尝试在 Ubuntu 中使用 opencv_traincascade 时,它​​会将 '\r' 读入文件列表的字符串中,因此在 CvCascadeImageReader::NegReader::nextImg() 中,src = imread(imgFilenames[last++], 0); 行(如 xeed 所述)不起作用。

我的解决方法是在imagestorage.cpp 中的imgFilenames.push_back(dirname + str); 之前添加str.erase(std::remove(str.begin(), str.end(), '\r'), str.end());

如果有人还在挣扎,我希望这会有所帮助。

【讨论】:

【参考方案4】:

首先,对我来说,错误出在 bg 文件上。我使用 Opencv 2.4.10.1。

当我在命令中指定 bg 文件的 绝对 路径时出现错误(如帖子的作者)。看起来作者在找出完整的负面图像路径方面做得非常非常糟糕。一种简单的解决方法是简单地 CD 到 .info 文件的目录(注意 -bg infofile.txt

cd D:\OpenCV\Classifiers\lbpclassifier1\temp\negative
train_cascade -data D:\OpenCV\Classifiers\lbpclassifier1\temp\data -vec D:\OpenCV\Classifiers\lbpclassifier1\temp\samples.vec -bg infofile.txt -numPos 40 -numNeg 40 -precalcIdxBufSize 500 -precalcValBufSize 500 -stageType BOOST -featureType LBP -w 24 -h 24

【讨论】:

另外请注意,您还可以编辑 infofile.txt 并在每行的开头添加绝对路径 我确认此修复解决了问题(不要忘记 infofile.txt 中的绝对路径)OpenCV 确实是 19 岁学生编写的垃圾代码 tarball【参考方案5】:

我遇到了完全相同的问题。对我来说,问题是我使用 PowerShell 创建了negatives.txt 文件,该文件将 BOM 写入文件。当 BOM 尝试读取文件并导致它找不到任何图像时,它会触发 opencv_traincascade 程序。我使用 Notepad++ 将文件转换为 UTF-8 并解决了问题。

【讨论】:

【参考方案6】:

CentOS Linux 版本 7.4.1708(核心)

 opencv_traincascade -data haarcascadeHAAR 
-vec samples.vec -bg Bad.dat -numPos 1500 -numNeg 3000 
-numStages 35 -minHitRate 0.95 -maxFalseAlarmRate 0.5 
-mode ALL -w 20 -h 20 
-precalcValBufSize 2048 -precalcIdxBufSize 4096

系统返回响应: 无法填充临时阶段的训练数据集。分部培训终止。级联分类器无法训练。检查使用的训练参数。

这个问题出现在 OpenCV 2.4.6 和 3.1.0 中。 下一个解决方案(就我而言)-我在 Windows 主机上创建文件 Bad.dat,当我在 unix 上复制此文件时,我将 b-slash 切换为斜杠(对于 Vi:%s/\//),但得到相同的结果。当我将 EOL 从 Win (CR LF) 更改为 Nix (LF) 时 - traincascade 成功启动。

 $ file Bad.dat
Bad.dat: ASCII text, with CRLF line terminators

$ dos2unix Bad.dat
dos2unix: converting file Bad.dat to Unix format ...

$ file Bad.dat
Bad.dat: ASCII text

这个过程运行良好 原因 - 检查你 Bad.dat(-bg 参数中的文件)

【讨论】:

如果你不能安装dos2unix - 你应该启用epel $ yum -y install epel-release 安装 OpenCV 使用下一个链接:docs.opencv.org/3.0-beta/doc/tutorials/introduction/…【参考方案7】:

对我来说(ubuntu16)是文件路径问题。下面是我的文件结构。

xy@xy:~/face_sample/face_csdn$ ll
total 7144
drwx------ 5 xy xy    4096 Jun  6 17:58 ./
drwxrwxr-x 3 xy xy    4096 Jun  5 19:03 ../
drwx------ 2 xy xy  376832 Jun  6 17:50 negdata/
drwx------ 2 xy xy  516096 Jun  6 17:11 posdata/
-rw-rw-r-- 1 xy xy 6408012 Jun  6 17:15 pos.vec
drwxrwxr-x 2 xy xy    4096 Jun  6 17:54 xml/

posdata 是我的正图像目录,其中包含 pathpos.txt(图像绝对路径)

xy@xy:~/face_sample/face_csdn$ ll -th  posdata/ | head - 5
==> standard input <==
total 75M
drwx------ 5 xy xy 4.0K Jun  6 17:58 ../
drwx------ 2 xy xy 504K Jun  6 17:11 ./
-rw-rw-r-- 1 xy xy 1.1M Jun  6 17:11 pathpos.txt
-rw-rw-r-- 1 xy xy  938 Mar 24  2014 18540.jpg
-rw-rw-r-- 1 xy xy  919 Mar 24  2014 18541.jpg
-rw-rw-r-- 1 xy xy  922 Mar 24  2014 18542.jpg
-rw-rw-r-- 1 xy xy  931 Mar 24  2014 18543.jpg

ao to pathpos.txt我用的是图片的绝对路径

xy@xy:~/face_sample/face_csdn$ head -5 posdata/pathpos.txt 

/home/xy/face_sample/face_csdn/posdata/10000.jpg 1 0 0 20 20
/home/xy/face_sample/face_csdn/posdata/10001.jpg 1 0 0 20 20
/home/xy/face_sample/face_csdn/posdata/10002.jpg 1 0 0 20 20
/home/xy/face_sample/face_csdn/posdata/10003.jpg 1 0 0 20 20
/home/xy/face_sample/face_csdn/posdata/10004.jpg 1 0 0 20 20

回到父目录,看一下负片txt文件(负图路径)

那就坐火车吧:

以上只是展示如何使用opencv_traincascade进行训练。

我也遇到上面的问题,主要是图片路径问题。

【讨论】:

【参考方案8】:

opencv_traincascade 正在尝试读取当前文件夹中的负文件夹图像。因此,您必须将opencv_traincascade.exe 转移到negative/ 图像文件夹中。

例如:

- opencv_traincascade.exe -data C:\Users\home\Documents\Face_Detection\HaarTrain\cascades -vec C:\Users\home\Documents\Face_Detection\HaarTrain\vector\vector.vec -bg bg.txt -numPos 130 -numNeg 500 -numStages 10 -precalcValBufSize 1024 -precalcIdxBufSize 1024

【讨论】:

【参考方案9】:

我曾多次遇到此问题,最终是由于我生成的 .vec 文件为我的正图像指定的尺寸错误。

例如,我有 700 张 100×100 像素的正图像,我用它们成功地生成了我的.vec。所以我的文本文件看起来像这样:

/filepath/directory/image1.jpg 1 0 0 100 100
/filepath/directory/image2.jpg 1 0 0 100 100
…

但是当我尝试训练我的级联 HAAR 文件时,图像太大了。所以我将它们调整为 50×50,并用缩小的图像重新创建了我的.vec(在命令行中指定新尺寸)。

.vec 应该是成功创建的,但是当我尝试训练时,我得到了错误。一旦我用正确的尺寸重新创建了我的文本文件,重新创建了我的 .vec 文件,并尝试再次训练,错误就消失了。我遇到的另一个问题是底片文件中有错误,例如路径错误或其他问题;所有其他 cmets 对于找出 -bg 文件可能存在的问题也有很好的建议。希望这会有所帮助。

【讨论】:

【参考方案10】:

我以前也有这个问题。 但是在我减少参数 [maxFalseAlarmRate] 之后,就像设置小于 0.1 一样,它工作正常。 希望这有一些帮助。

【讨论】:

以上是关于错误“无法填充临时阶段的训练数据集。”在使用 OpenCV 的 traincascade 工具时的主要内容,如果未能解决你的问题,请参考以下文章

如何解决不支持的渲染问题 Path.op()?

`tensorflow_io.bigquery` 返回 `Empty update [Op:IO>BigQueryReadSession]` 错误

创建自定义 psobject 时出现 op_Subtraction 错误,尽管检索到了所需的结果

错误消息 206、Niveau 16、État 2、Ligne 91 Conflit de types d'opérandes:date est 不兼容 avec tinyint

pymongo.errors.BulkWriteError: batch op errors occurred

OpenID Connect Core 1.0使用授权码流验证(下)