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

时间:2012-07-10 11:47:14

标签: opencv

我正在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的\量词\ lbpclassifier1 \ TEMP \负面\ 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。

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

10 个答案:

答案 0 :(得分:9)

首先,对我来说,错误与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

答案 1 :(得分:7)

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

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

希望它有所帮助。

答案 2 :(得分:4)

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

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

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

如果您将traincascade.cpp构建为调试并且正在使用opencv的发布库和dll,则会发生此错误。 (反过来也不应该有效。

答案 3 :(得分: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时,它会读取&#39; \ r&#39;在文件列表的字符串中,因此在CvCascadeImageReader::NegReader::nextImg()中,行src = imread(imgFilenames[last++], 0);(如提到的xeed)不起作用。

我的解决方法是在str.erase(std::remove(str.begin(), str.end(), '\r'), str.end());

中的imgFilenames.push_back(dirname + str);之前添加imagestorage.cpp

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

答案 6 :(得分:1)

我多次遇到此问题,最终是由于我生成了.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文件,并尝试再次训练后,错误消失了。我遇到的另一个问题是底片文件中有错误,例如路径错误或其他问题。所有其他注释也为弄清楚-bg文件可能存在的问题提供了很好的建议。希望这会有所帮助。

答案 7 :(得分:0)

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切换为斜杠(:%s / \ //为Vi),但是捕获相同的结果。当我将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 param中的文件)

答案 8 :(得分:0)

至于我(ubuntu16),它是文件路径问题.Below是我的文件结构。

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是我的正面图像dir,其中包含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

enter image description here

返回父目录,看看负txt文件(负图像路径)

enter image description here

然后坐火车:

enter image description here

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

我也遇到了上述问题主要是关于图像路径。

答案 9 :(得分:0)

我以前也有这个问题。 但是在我减小参数[maxFalseAlarmRate](如设置小于0.1的参数)后,它工作正常。 希望对您有所帮助。