11

我正在使用 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.

之前有人问过这个问题:使用 opencv_train 级联时出错 ,解决方案建议在那里。在这种情况下,使正样本和负样本的数量相等并没有帮助。

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

任何帮助深表感谢。谢谢。

4

10 回答 10

13

首先,对我来说,错误也出在 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
于 2015-03-28T19:05:52.460 回答
8

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

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

希望能帮助到你。

于 2012-08-30T03:01:28.393 回答
4

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

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

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

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

于 2013-06-04T11:25:49.657 回答
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 所述)不起作用。

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

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

于 2015-01-16T14:28:46.470 回答
3

opencv_traincascade正在尝试读取当前文件夹中的负文件夹图像。因此,您必须将其传输opencv_traincascade.exenegative/图像文件夹中。

例如:

- 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
于 2018-07-17T12:40:20.387 回答
1

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

于 2016-01-11T05:33:11.550 回答
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 文件可能存在的问题提出了很好的建议。希望这可以帮助。

于 2019-02-07T17:12:56.683 回答
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 切换为斜杠(对于 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 参数中的文件)

于 2018-04-21T20:20:59.990 回答
0

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

于 2019-08-14T11:05:39.830 回答
0

至于我(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到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 进行训练。

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

于 2018-06-06T10:15:37.933 回答