我遇到的问题基本在这篇博文里解决了,非常感谢博主,收藏了!!!
转自:如何使用opencv 训练分类器以及训练过程中的问题 | More Than Vision http://www.visionhackerstudio.com/how-to-user-opencv-haartraining/
如何使用opencv 训练分类器以及训练过程中的问题
我想大家都非常有兴趣使用opencv的haas-like features来训练一个分类器,但在使用过程并不像网上的教程说的那么一番风顺,这篇博文我主要说下大概的训练过程,以及训练过程中遇到的问题和我的解决方案。这里
准备数据样本
正样本:我准备了5085个人脸,人脸样本的准备我是通过opencv 的人脸检测器 来截取,然后缩放到24*24的大小
负样本:负样本我准备了2177个样本,我们选择负样本的准则就是图片里面包含正样本的图片(这样指的就是人脸),负样本我们可以从Imagenet这个数据库里面选取。另外一种获取负样本的方法就是我们也可以通过opencv的人脸检测器获取,具体方法参考我的另外一篇文章:利用opencv人脸检测器来计算人脸得分。
下面我们需要创建正负样本的索引:
- find positive_images -iname “*.jpg” > positives.txt
- find negative_images -iname “*.jpg” > negatives.txt
这里我们特别要注意一个问题,把最后一行空行删除掉,不然就会报“Train dataset for temp stage can not filled. Branch training terminated. Cascade Classifier can’t be trained. check the used training parameters” 这样的错误。一定要注意。然后我们把 positives.txt里面的格式改成这样,因为我的图片是已经经过截取的,所以它的区域就是图片的长宽,里面的1 表示1个人脸。
创建样本
下面我们利用opencv自带的opencv_createsamples来创建样本:opencv_createsamples -info positives.txt -vec positives.vec -bg negatives.txt -num 5085 -maxidev 40 -maxxangle 1.100000 -maxyangle 1.100000 -maxzangle 0.5 -w 24 -h 24 这样我们就得到了二进制的输出文件
下面我们开始训练分类器了,这里也是最容易出错的地方,安装官方的文档,我相信很多会这样写
- opencv_traincascade -data classifier -vec positives.vec -bg negative.txt -numPos 5085 -numNeg 2177 -numStages 20 -precalcValBufSize 5000 -precalcIdxBufSize 5000 -minHitRate 0.98 -maxFalseAlarmRate 0.5 -weightTrimRat 0.95 -w 24 -h 24 -mode ALL
但这样基本在训练1到2层之后就会报错“Traincascade Error: Bad argument (Can not get new positive sample. The most possible reason is insufficient count of samples in given vec-file“,很多人会卡在这里,我也被卡了一个下午,很多人以为这里的-numPos 就是你所谓的正样本的总数,那你就大错特错了。这里有个公式,我们需要通过这个来求解这个-numPos,过程如下:
- vec-file number >= (numPos + (numStages-1) * (1 – minHitRate) * numPos) + S;1
vec-file number 就是我们的正样本总数5085,numstages=20,minHitRate=0.98,S 表示负样本总数也就是等于2017,正负样本比需要控制在大于2:1,所以这样我们可以就查numPos<=2628.9,所以我们这里的numPos应该取2628,这样正确地输入格式应该是这样的:
- opencv_traincascade -data classifier -vec positives.vec -bg negative.txt -numPos 2628 -numNeg 2107 -numStages 20 -precalcValBufSize 5000 -precalcIdxBufSize 5000 -minHitRate 0.98 -maxFalseAlarmRate 0.5 -weightTrimRat 0.95 -w 24 -h 24 -mode ALL
当在这个训练过程中,我们可能还会再次遇到问题,就是在训练到一定阶段的时候,就不在继续下去训练了,当然这个时候也不会报任何错误,基本上这个问题是由于你的负样本不够多,你只要增加你的样本就可以完美解决了。
- Tutorial: OpenCV haartraining (Rapid Object Detection With A Cascade of Boosted Classifiers Based on Haar-like Features)
- Naotoshi Seo – Tutorial: OpenCV haartraining (Rapid Object Detection With A Cascade of Boosted Classifiers Based on Haar-like Features)
- Material for Naotoshi Seo’s tutorial
- OpenCV Documentation – Cascade Classifier Training