言:最近做了将近一个月的关于级联分类器的工程,下面总结了训练级联分类器的过程以及需要注意的地方,希望可以与博友们多多交流。
训练级联分类器traincascade需要opencv中的两个exe文件,这两个文件分别是opencv_createsamples.exe和opencv_traincascade.exe文件。
训练过程可分为以下几步:
(1)准备正负训练样本。
正样本:
正样本尺寸保持一致,但在采集过程中也可不一致,后续可自己编程实现尺寸统一。
负样本:
负样本的尺寸无需统一,负样本越多,检测结果误检率越小。
准备好训练样本后,创建两个文件夹,假设为pos以及neg分别存放正负样本,并将这两个文件夹与opencv_createsamples.exe和opencv_traincascade.exe文件放在同一目录下(如下图所示)。
正负样本的差异越大,所训练的分类器性能越好。
(2)在DOS环境下生成正负样本描述符,具体命令如下:
首先进入到正负样本所在的目录。若处于正样本所在目录,输入命令:dir/b>pos.txt则生成正样本描述文件。
若处于负样本所在目录,输入命令:dir/b>neg.txt,则生成负样本描述文件。生成的正负样本描述文件为.txt文件,打开后可见其为一个个样本的名称,然后将正负样本作以下处理:
对于负样本:
在样本名字前加上”neg/”,即为负样本所在的文件夹,所有的样本名称都要修改,修改完后把最后一行的neg.txt去掉,还有最后一行的空行去掉,切记,否则训练过程会报错。
对于正样本:
除了在样本名字前加上其所在的文件夹名称,还要在后缀名后面加上样本描述,即样本的尺寸大小,1表示样本数为1,0
0表示的是样本左上角的坐标即为(0,0), 4 4 表示右下角的坐标。同样修改完后把最后一行的pos.txt以及空行去掉。
至此,正负样本描述文件已全部处理完。
(3)生成.vec文件
生成.vec文件需要用到opencv_createsamples.exe文件,.vec文件是为后面训练分类器所准备的。在dos环境下的相对目录下键入以下命令:
opencv_createsamples.exe -vec pos.vec -info pos.txt -num 1000 -w
30 –h 30
此时可在opencv_createsamples.exe文件所在目录中看到所生成的.vec文件。
由命令行可知,-w 30 –h
30为正样本的尺寸大小,也间接说明了正样本的尺寸大小必须一致。-num为需要生成的正样本数目。对于负样本则无需生成.vec文件。接下来就要利用opencv_traincascade.exe来开始训练分类器了。
(4)级联分类器的训练
在命令行键入以下命令:
opencv_traincascade.exe -data xml -vec pos.vec -bg neg.txt
-numPos 900 numNeg 788 -numStage 20 -precalValBufSize 300
-precalIdxBufSize 100 -featureType HAAR -w 4 -h 4 -mode ALL
便开始训练分类器了。其中各个含义现在一一来说明。
-data xml
Xml为一个文件夹的名字,该文件夹需要自己新建,用来存放训练好的分类器。-data即为分类器所在的文件夹。
-bg numPos 900
这个是训练正样本的数目,为何这个地方不是1000呢,而创建样本时创建了1000个?这个我也不是很清楚,总之要是能看源代码就能搞清楚了。
-bg
这个很明显是负样本文件。
numNeg 788
负样本数目。
-numStage 20
训练阶数
关于多尺度特征检测函数detectMultiScale()检测尺度表:
尺度倍数 检测次数 检测最小尺寸。