第二十六篇:很实用的opencv训练问题解决方法

我遇到的问题基本在这篇博文里解决了,非常感谢博主,收藏了!!!

转自:如何使用opencv 训练分类器以及训练过程中的问题 | More Than Vision http://www.visionhackerstudio.com/how-to-user-opencv-haartraining/

如何使用opencv 训练分类器以及训练过程中的问

我想大家都非常有兴趣使用opencv的haas-like features来训练一个分类器,但在使用过程并不像网上的教程说的那么一番风顺,这篇博文我主要说下大概的训练过程,以及训练过程中遇到的问题和我的解决方案。这里

准备数据样本

正样本:我准备了5085个人脸,人脸样本的准备我是通过opencv 的人脸检测器 来截取,然后缩放到24*24的大小

9738FAA1-88C4-41CA-A251-8D2C63E08E6E

负样本:负样本我准备了2177个样本,我们选择负样本的准则就是图片里面包含正样本的图片(这样指的就是人脸),负样本我们可以从Imagenet这个数据库里面选取。另外一种获取负样本的方法就是我们也可以通过opencv的人脸检测器获取,具体方法参考我的另外一篇文章:利用opencv人脸检测器来计算人脸得分

下面我们需要创建正负样本的索引:

  1. find positive_images -iname “*.jpg” > positives.txt
  2.  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里面的格式B6172998-7399-4BA8-A36B-1F5F4787D7CF改成这样9FDC0084-0CC8-442C-BBAF-B130A48885C0,因为我的图片是已经经过截取的,所以它的区域就是图片的长宽,里面的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   这样我们就得到了二进制的输出文件9373992D-3319-45A2-99EC-8AC6225EFB3E

下面我们开始训练分类器了,这里也是最容易出错的地方,安装官方的文档,我相信很多会这样写

  1. 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,过程如下:

  1. 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,这样正确地输入格式应该是这样的:

  1. 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

这样我们可以很欣慰的看到我们想要的输出了7F7AA50E-9A11-4138-A5B8-CB08D7B5CF82

 

当在这个训练过程中,我们可能还会再次遇到问题,就是在训练到一定阶段的时候,就不在继续下去训练了,当然这个时候也不会报任何错误,基本上这个问题是由于你的负样本不够多,你只要增加你的样本就可以完美解决了


评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值