【问题标题】:Error "Train dataset for temp stage can not be filled." while using traincascade tool of OpenCV错误“无法填充临时阶段的训练数据集。”在使用 OpenCV 的 traincascade 工具时
【发布时间】: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。

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

【问题讨论】:

    标签: opencv


    【解决方案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 参数中的文件)

          【讨论】:

          【解决方案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 一样,它工作正常。 希望这有一些帮助。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-07-05
                  • 2013-06-15
                  • 1970-01-01
                  • 2015-05-12
                  • 2019-06-18
                  • 2015-08-14
                  • 1970-01-01
                  相关资源
                  最近更新 更多