Why always OpenCV Error: Assertion failed (elements_read == 1) in unknown function ?

2022-05-09 14:09:30 浏览数 (1)

  在Windows下安装好opencv2.4.9之后,在"xxx/build/x64/vc10/bin"下有训练中要用到的可执行程序opencv_xxxx.exe等四个可执行程序。注意,由于本人为win7 64bits系统,安装了VS2010,故使用该目录下的可执行程序。

    当使用自带程序进行人脸检测训练时,遇到一些问题,整理如下:

1.训练中途,程序突然终止,提示"OpenCV Error: Assertion failed (elements_read == 1) in icvGetHaarTraininDataFromVecCallback, file ........opencvappshaartrainingcvhaartraining.cpp, line 1861"

解决办法:我是用的训练参数是“D:Program Filesopencvbuildx64vc10bin>opencv_haartraining.exe -data xml -vec pos.vec -bg neg_img.txt -nstage 15 -nsplits 1 -npos 1632 -nneg 3987 -w 32 -h 32 -mem 1024 -mode ALL”,其中,1632为pos.vec中样本的总数目。-npos的意思是每次训练从.vec文件中随机选取npos个正样本。由于存在虚警,在每一次训练一个强分类器之后,会把那些分类错误的从整个样本库中剔除掉,总的样本就剩下 CountVec = CountVec - (1 - minhitrate)* npos,在第二个强分类器的训练过程中就是从剩下的Countvec抽样,一直这样进行nstage次,所以就有CountVec >= (npos (nstages - 1)*(1 -minhitrate) * npos ) nneg 。当把npos设置与vec中总样本数相同时,第二个强分类器训练时,必然就会报错,提示样本数不足。故,将npos和nneg都减少,改成1000和2000即可。

2.训练过程中出现“Premature end of JPEG file”

解决办法:这个一般是样本存在问题可以从两个方面来检查:

(1)训练使用的是灰度图像256色,查看是否有些图片是24位图;

(2)预览图像,看是否有些图片已损坏或者存储大小明显异常。我的样本中有张352*288的灰度图像,大小才6KB。

3.训练过程中卡在某一stage,过了很久都没有动静。

解决办法:问题出现在取负样本的那个函数icvGetHaarTrainingDataFromBG中。当剩下所有的negtive样本在临时的cascade Classifier中evaluate的结果都是0(也就是拒绝了),随机取样本的数目到几百万都是找不到误检测的neg样本了,因而没法跳出循环!解决方法是,增大负样本数目,增大负样本之间的变化! 因为负样本原则应该是无强大而且多样性越大越好,这在现实中是不可行的,所以我们采集的负样本一般无论从数量上还是多样性上都很难满足要求,所以出现上述问题就很正常了,不过此时的分类器已经完全额、可以使用,因为它的误检率已经很低,从实用性上时没有任何问题的。

0 人点赞