整个训练检测过程主要是这样的 :样本处理—>训练分类器—>目标检测。
一:样本的处理
1:正样本的处理。正样本,也就是我们包含需要检测的目标的样本集,如行人检测当中的行人、人脸识别当中的人脸。这里就需要我们自己准备样本了,拍照或者是提取视频帧。一般在正式使用正样本之前需要对其进行归一化处理,人工裁剪很难保证精度而且费时费力,可以用一段精简的matlab程序就可以解决,作用是将尺寸不一的正样本归一化成大小统一的如30X30、50X50的训练样本。然后就是重命名问题了,简单来做就是按数字排序来命名,1.jpg、2.jpg。。n.jpg以此类推,接着就要运用批处理命令,获取正样本路径列表,这其实就是为了之后生成正样本的的VEC文件做准备。
其中/s是取绝对路径,/b只取当前路径,我们用的是/b俩者都可,只是在获得正样本vec文件是命令书写差异而已。
生成的文件格式如图所示,其中要把非样本路径的删掉,然后再将jpg替换成jpg 1 0 0 m m ,1代表个数,可以理解成正样本为1,
后四位代表图像坐标 left top width height。至此,正样本准备已经结束,下面就是生成vec文件了,vec文件其实就是保存的每一个samples图,
并且已经统一了w和h的大小,因为cascade训练要用的就是vec文件。针对这个,也可以写一个批处理命令
其中,opencv_createsamples.exe 是opencv封装好的,直接拿来用就可以了。-info 是之前处理的正样本的路径文本,-vec是生成文件的路径已经文件名,
-num是正样本数,-w、-h是归一化的样本大小。到这里,正样本的处理全部完成了。
2:负样本的处理。负样本的处理就没正样本那么复杂了,直接用原图不需要剪裁,只需要用处理正样本的方法命名,然后批处理保存样本路径在一个文本文件夹当中就行了,格式同正样本。
总结一下:在正式训练之前我们需要准备的一个文件夹里包括:正样本、正样本vec文件、负样本,opencv库里自带的动态文件,opencv_traincascade.exe(级联程序)
二:训练分类器
训练的程序也是可以用bat命令编写的,其实在dos命令窗口也是同样可以运行,不过编写批处理较为简单,易修改。先说一下训练代码。
备注:-data 是保存生成分类器的文件名
-vec是 处理的保存正样本samples
-bg 是负样本的samples
-numPos和-numNeg是正负样本数(后有注解)
-numStages 是训练层数(一般14层以上)
-featureType 是提取的样本特征,比如HOG、LBP,还有用opencv_haartrainning训练的haar特征
-mem是训练分配内存
-w和-h是正样本尺寸
-minHitRate 和 -maxFalseAlarmRate分别设置最小检测率和最大误检率,其余默认。
Tips:-mem有的训练当中这个参数没设值,在我们的实验中,这个值显得非常重要,不仅要设值,而且特定样本还需要分配更多的内存。
-data 这个参数有时需要我们自己先定义一个空的文件夹来保存训练好的分类器,实验过程中遇到没新建就报错的。
-numPos其实并非实际正样本数,实际参数值应设定比正样本值稍小一点,每一层训练完之后都会自增,所以这里的设置是第一层的训练数,之后每层逐渐累加,这里还是经常报错的地方。
上图是一些较为常见的报错,已经运行的截图。下面说下经常报错的解决办法:
(1)如果出现 Parameters can not be written, because file haarcascade/params.xml can not be opened 错误,可以手动创建一个文件夹 haarcascade,这里就是说的要新建一个data文件夹。
(2)如果出现 Traincascade Error: Bad argument (Can not get new positive sample. The most possible reason is insufficient count of samples in given vex-file 错误,这里就是刚说的这是numPos值的问题。
(3)还有常见的就是正样本输入问题,要保证vec文件create文件读取完成。
等这个bat跑完成,那么训练过程也就结束了,生成的文件如下所示
三:目标检测
完成上面的训练,得到xml文件,基本上整个过程进行了90%了。检测代码,opencv里面有封装好的程序,或者自己找也可以,网上有大把的。把分类器换成我们训练好的cascade.xml 注意路径问题就行了。
四:总结
因为训练代码opencv里面都封装好,所以整个过程只要处理好样本问题,就不是很难做了。这里再说点,目标检测自己的一些认知,先贴上一张图。
整个检测过程大概可以通过这幅图来表述,我们首先要做的就是利用现有的样本、代码训练处分类器进行简单的检测。可想而知,检测见过可能并不是很理想,这时就需要我们进入算法部分,去改进代码。我把这种改进归结为两类,一是特征提取部分比如hog提取特征;另一个是检测部分、比如输入待检样本进行一些预处理啊,如何利用现有的算法进行改进,提高精度和速度,这才是在之前的基础上要完成的。所以下一步就是需要深入到每一个部分,进行优化再整合。