7

我正在尝试训练 Haar Cascade 来检测手部。我有一个大小为 1000 的 vec 文件。我有 40 个正图像和 600 个负图像。我已经尝试过放弃我的正面形象和负面形象。当我运行以下命令时,我收到以下错误:

opencv_traincascade -data classifier -data classifier -vec samples.vec -bg negatives.txt
-numstages 20 -minHitRate 0.999 -maxFalseAlarmRate 0.5 -numPos 1000\ -numNeg 600 -w 80
-h 40 -mode ALL -precalcValBufSize 1024\ -precalcIdxBufSize 1024

PARAMETERS:
cascadeDirName: classifier
vecFileName: samples.vec
bgFileName: negatives.txt
numPos: 1000
numNeg: 1000
numStages: 20
precalcValBufSize[Mb] : 256
precalcIdxBufSize[Mb] : 256
stageType: BOOST
featureType: HAAR
sampleWidth: 24
sampleHeight: 24
boostType: GAB
minHitRate: 0.999
maxFalseAlarmRate: 0.5
weightTrimRate: 0.95
maxDepth: 1
maxWeakCount: 100
mode: BASIC



===== TRAINING 0-stage =====
<BEGIN
OpenCV Error: Assertion failed (_img.rows * _img.cols == vecSize) in get, file /home/lie/Desktop/Install-OpenCV-master/Ubuntu/2.4/OpenCV/opencv-2.4.9/apps/traincascade/imagestorage.cpp, line 157
terminate called after throwing an instance of 'cv::Exception'
  what():  /home/lie/Desktop/Install-OpenCV-master/Ubuntu/2.4/OpenCV/opencv-2.4.9/apps/traincascade/imagestorage.cpp:157: error: (-215) _img.rows * _img.cols == vecSize in function get

中止(核心转储)

我尝试降低阳性计数并重新执行整个过程,但仍然收到相同的错误。有什么建议么?

顺便说一句:我正在关注以下教程:http ://coding-robin.de/2013/07/22/train-your-own-opencv-haar-classifier.html

谢谢

4

5 回答 5

9

该错误似乎不是大量正样本或负样本的结果。人们确实训练了非常大的数据集!

从上面描述的参数可以看出,构成samples.vec的正样本的维度是24x24,用语句表示:

sampleWidth: 24
sampleHeight: 24

但是在调用opencv_traincascade函数时,您尝试将尺寸设置为 80x40。尝试将其更改为-w 24 -h 24

于 2015-01-08T08:26:24.253 回答
0

创建你说你的对象有的向量w h。训练你说别的。

w h您传入的参数opencv_createsamples必须相同opencv_traincascade

看一个例子

from glob import glob
import os
w=108
h=45
numPos=len(glob('./positivas/*jpg'))
numNeg=len(glob("./fundo/*jpg"))
numStages=9
minHitRate=0.99

PATH_BIN="./opencv-3.4.5/build/binary/bin"

if os.path.isfile("positives.vec"):
    os.remove("positives.vec")

createsamples=f'{PATH_BIN}/opencv_createsamples ' \
              f'-bg bg.txt ' \
              f'-info info.txt ' \
              f'-num {numPos} ' \
              f'-w {w} ' \
              f'-h {h} ' \
              f'-vec positives.vec'

print(createsamples)
os.system(createsamples)

print("#############################")
print("vector criate")
print("#############################")

numPos_train=int((numPos-numNeg)/(1+(numStages-1)*(1-minHitRate)))

print("numPos ", numPos_train)

train=f'{PATH_BIN}/opencv_traincascade ' \
      f'-data data ' \
      f'-vec positives.vec ' \
      f'-bg bg.txt ' \
      f'-numPos {numPos_train} ' \
      f'-numNeg {numNeg} ' \
      f'-numStages {numStages} ' \
      f'-minHitRate {minHitRate} ' \
      f'-w {w} ' \
      f'-h {h} ' \
      f'-minhitrate 0.99 '\
      f'-maxFalseAlarmRate 0.3 ' \
      f'-precalcValBufSize 1024 ' \
      f'-precalcIdxBufSize 1024 ' \
      f'-numThreads 6'


os.system(train)
于 2021-10-21T23:08:37.413 回答
0

我遇到了同样的问题,指定正确的尺寸(w 和 h)对我不起作用。原来我的输出目录(在你的情况下是“分类器”)不是空的。因此,该命令从输出目录中拾取上次停止的位置(带有相应的 w 和 h)。我清除了输出目录,然后它工作了。

于 2020-05-03T20:29:02.780 回答
-1

断言非常明确:它期望 _img.rows*_img.cols == vecSize。我不知道 _img 和 vecSize 应该是什么,但这意味着您的输入数据没有正确给出。只看你的命令行,你:

  1. 写了-data classifier -data classifier两遍。这应该不是问题,但仍然存在。
  2. 写道-numPos 1000\ -numNeg 600,当您谈论 40 张正面图像和 600 张负面图像时,您不应该使用这些数字吗?

你说你有一个大小为 1000 的 vecSize。这个 vecSize 又是做什么用的?

于 2015-01-07T09:55:16.287 回答
-1

将 numPos 和 numNeg 降低到实际值以下,对我有用。

于 2019-09-28T17:34:34.393 回答