Opencv的opencv_haartraining和opencv_traincascade训练

网上一大堆Opencv的opencv_haartraining和opencv_traincascade训练教程,我试着用了一下,别人的经验多少有些问题,我把我的使用经验和大家分享一下。我的环境如下:

操作系统:Archlinux 4.1.3-1,Opencv版本:2.4.11-1

1.训练先要准备正样本和负样本。

正样本就是要识别的目标图像了,我是手动一个一个的抠出来的,长宽大致相同就可以了,我把正样本存在/home/foo/pos目录下,一共140个文件。负样本就是不含目标的图像,我的负样本保存在/home/foo/neg目录下,一共900个。网上有人说图像文件名称最好是普通的名称复杂的汉字或者符号有可能opencv识别不了,我乖乖的起了很简单的文件名。此外还要准备正、负样本的清单。

/home/foo/pos/posdata.txt文件是正样本文件清单,手动建立该文件,格式如下

1.jpg 1 0 0 200 199

2.jpg 1 0 0 180 190

其中1.jpg是正样本文件名,1是图像中目标个数,0,0 是目标在图像中的左上角,200,199是目标在图像中的右下角。手动添加很累,我是做了个小程序自动生成的。

/home/foo/neg/negdata.txt文件是负样本文件清单,手动建立该文件,格式如下

1.jpg

2.jpg

其中1.jpg是负样本文件名

2.生成vec文件。

准备好样本图像需要使用opencv_createsamples生成.vec文件,就是将这个样本图像进行大小之类的调整,加速训练过程。vec文件生成命令如下:

opencv_createsamples -info pos/posdata.txt  -bg neg/negdata.txt -num 140 -w 24 -h 24 -vec myvec_24.vec

在/home/foo目录下运行该命令,运行后/home/foo目录下会出现myvec_24.vec文件。

-info pos/posdata.txt是指定正样本清单为pos/posdata.txt

-bg neg/negdata.txt是指定负样本清单为neg/negdata.txt

-num 140是指定正样本图像个数为140个

-w 24 -h 24是指将正样本尺寸转换为宽24x高24大小,如果样本过大那么训练过程会很慢的

-vec myvec_24.vec指定vec文件名称为myvec_24.vec

3.使用opencv_traincascade训练

在/home/foo目录下使用命令

opencv_traincascade -data tmp -vec myvec_24.vec -bg neg/negdata.txt -numPos 140 -numNeg 900 -numStages 20 -w 24 -h 24 -featureType HOG

进行训练。其中

-data tmp是指定训练结果存放的目录为tmp,tmp目录要事先建立。

-vec myvec_24.vec是指定vec文件为myvec_24.vec

-bg neg/negdata.txt是指定负样本清单为neg/negdata.txt

-numPos 140是指定正样本数目为140

-numNeg 900是指定负样本数目为900

-numStages 20指定训练阶数为20,太大会很慢

-w 24 -h 24 样本的尺寸,应和生成vec文件时的参数-w -h一致

-featureType HOG使用HOG特征,其他几个参数我实验了,不能用,报错,只有这个能用

然后就是等待了,会出现HR击中率,FA虚警率等信息

训练完成后会有一个xml文件,保存训练结果,不过我虽然训练成功了,但这个文件我用程序加载不上,加载报错。

3.使用opencv_haartraining训练

由于使用opencv_traincascade训练的结果无法加载,我没兴趣查找这个原因了,于是我用老的opencv_haartraining进行训练,训练的结果可以加载使用。

在/home/foo/下运行

opencv_haartraining -data tmp -vec myvec_24.vec -w 24 -h 24 -bg neg/negdata.txt  -nstages 20 -npos 140 -nneg 900

其中

-data tmp是指定中间结果存放的目录为tmp,该目录要提前建立

-nstages 20指定训练阶数为20,太大会很慢

-npos 140 指定正样本数目为140

-nneg 900指定负样本数目为900

漫长等待后,/home/foo目录下会出现一个xml文件,用这个文件就可以进行识别了。