第一次尝试训练自己的分类器,中间经过了一些曲折,终于成功了。在此将过程分享给大家,希望对初学者有帮助。经过实际操作,发现最困难的部分确实是样本的准备,不仅数量要多,而且要包括各种场景,才能最终达到目标检测的目的,这里只是简单介绍一下训练过程。对于目标的准确检测还需要从各个方面进行优化。
整个过程分为三步:
1、创建样本;
2、训练分类器;
3、利用训练好的分类器进行目标检测
为了方便进行创建,这里将opencv安装目录下的bin文件夹拷贝到D:\face文件夹下。
一、创建样本
样本分为两种,正样本和负样本,其中正样本是待检测目标的样本,负样本是不包含检测目标的其他任意图片。所有样本都应该具有相同的尺寸,这里采用的是20*20大小的图片。
创建样本的步骤:
1、将所有正样本图片放置在D:\face\bin文件夹下的posdata文件夹中,所有负样本图片放在negdata文件夹中。
2、分别为正样本和负样本创建描述文件。
①为正样本创建描述文件info.txt
a、在命令行输入以下命令,进入到正样本文件夹下:
b、输入如下命令dir /b > info.txt创建正样本描述文件
c、打开生成的info.txt文件,Ctrl+h,将bmp全部替换成bmp 1 0 0 20 20,其中1表示一幅图片,0 0表示左上角坐标,20 20表示图片的尺寸;
d、删除最后一行的info.txt
②为负样本创建描述文件bg.txt
a、在命令行输入cd..回到D:\face\bin目录下
b、输入CD D:\face\bin\negdata,回车,进入到负样本文件夹下
c、输入如下dir /b > bg.txt 命令,创建负样本文件
d、打开生成的bg.txt文件,删除最后一行bg.txt
3、创建样本
bin文件夹下的createsamples.exe文件就是用来创建样本的。
在命令行中输入cd..,回到D:\face\bin目录下;
在命令行输入命令createsamples.exe -info posdata\info.txt -vec data\pos.vec -num 10 -w 20 -h 20,其中data为bin目录下新建的文件夹。
结果如图:
二、训练分类器
在命令行输入命令haartraining.exe -data D:\face\bin\data\cascade0 -vec D:\face\bin\data\pos.vec -bg eD:\face\bin\negdata\bg.txt -npos 10 -nneg 8 -nsplits 2 -mem 512 -nonsym -w 20 -h 20 -minpos 100 -nstages 4
结果如下:
不知道什么原因,停在这里不动了,貌似进入和死循环。
经过多方面查找发现,负样本准备的有问题,正负样本必须是灰度图才可以,将负样本更新为灰度图像之后,重新输入上面的命令,进行分类器训练。结果如下:
在data文件夹中会生成一份可爱的cascade0.xml文档,这个就是我们想要的结果了!
重要!可能遇到的问题:(转)
1.如果跑到某一个分类器时,几个小时也没有反应,而且显示不出训练百分比,这是因为你的负样本数量太少,或者负样本的尺寸太小,所有的负样本在这个分类器都被reject了,程序进入不了下一个循环,果断放弃吧。解决方法:负样本尽量要大一些,比如我的正样本是40*15,共300个,负样本是640*480,共500个。
2.读取样本时报错:Negative or too large argument of CvAlloc function,网上说这个错误是因为opencv规定单幅iplimage的内存分配不能超过10000,可是我的每个负样本都不会超过这个大小,具体原因不明。后来我把负样本的数量减少,尺寸加大,这个问题就解决了。
3.训练的过程可能经常出错,耐心下来不要着急,我在训练MRI分类器的时候失败了无数次。失败的时候有两件事可以做,第一,调整正负样本的数量,再试。第二,调整负样本的大小,祝大家好运。