opencv_traincascade级联训练人脸数据
正负样本格式:
正样本 灰度化 24*24 2000张
负样本 灰度化 50*50 1000张
训练过程
第一步:dir /b >pos.txt 以及dir /b >neg.txt
第二步:调整pos及neg文件 ,删除第一行和最后一行
在neg.txt 中每一行加neg/ 在pos.txt中每一行加pos.txt并且在每一行最后增加 1 0 0 24 24
在工作路径下手动建立一个文件夹名叫xml
第三步:opencv_createsamples -info pos.txt -vec pos.vec -bg neg.txt -num 600 -w 24 -h 24
第四步:opencv_traincascade -data xml -vec pos.vec -bg neg.txt -numPos 270 -numNeg 300 -numStages 15 -minHitRate 0.999 -maxFalseAlarmRate 0.5 -w 24 -h 24 –mode ALL
问题集锦:
报错 :error: (-215) !empty() in function cv::CascadeClassifier::detectMultiScale
解决: 把face_cascade的值改为使用绝对路径cv2.CascadeClassifier(‘D:/…你的.xml路径’)
或者在原来代码下加一行scade.load(‘D:/….你的xml路径’)
报错:Traincascade Error: Bad argument (Can not get new positive sample. Themost possible reason is insufficient count of samples in given vec-file.)
解决:设置的numPos过大,由于训练时pos count 会从你设置的numPos增大,每一级都按一定的次序增大,后来可能会超过样本库中正样本的个数,就会报这个错误。
另附一个:不是报错 是Stages 0-4 are loaded 原因:xml文件已经生成,需要删了重来
警告:traincascade’s error (Required leaf false alarm rate achieved. Branch training terminated.)
这不是一个错误。鉴于所提供的样本设置,级联已达到其预期的潜力。需要添加更多的数据或者设置更苛刻条件。
解决办法:-minHitRate默认设置为0.995,默认-maxFalseAlarmRate设置为0.5。这意味着对于您当前的模型,在训练过程中,允许有1000个肯定样本中有5个得到错误分类,而每个阶段需要达到个人错误接受率由0.5值表示。
所以请尝试下列其中一项:
-minHitRate更改为0.999并使其难以达到目标。然而,这不是最好的方法,容易过度训练 更改-maxFalseAlarmRate为0.7,迫使各个阶段要更加复杂 在训练级联时,指定numPos为所有的正样本。当正样本不能用于进一步处理时,级联分类器会尝试用新样本替换掉样本。而所有正样本都加入了没有可以代替的,所以应该用numPos的较低值重新运行训练。 关于这些numPos numNeg等值的公式 vec-file number >= (numPos + (numStages-1) * (1 – minHitRate) * numPos) + S 其中vec-file number指的是正样本数 numStages默认为20 minHitRate默认设为0.95 可以增大0.999使得训练更复杂 S是负样本数
报错: OpenCV Error: Insufficient memory (Failed to allocate 965425142 bytes)
内存分配不足 我的内存是4G 尚未找到解决办法 但是发现之前自己会出现这个错误是因为路径中样本有1000 个,createsample的时候就使用1000 然后继续下面的traincascade工作使用1000就报错了。后来改为使用500才没有报错
报错:Train dataset for temp stage can not be filled
一般显示的acceptanceRatio 是大概这样的数值0.000412662 或者更小。但如果出现像这样 7.83885e-07 ,说明已经导致过拟合,此时要适当减小训练层数,即减小numStages的值
训练结果: