注:此文是我整理了网上的各方资料汇集而成,由于在实践中遇到了很多坑,所以把自己的成功训练的经验写下来做个笔记给大家做个参考,本文所使用 opencv版本为3.3 下载链接:https://opencv.org/releases/page/3/
1.准备训练样本图片
1.1样本的采集:
样本图片最好使用灰度图,且最好根据实际情况做一定的预处理;样本数量越多越好,尽量高于1000,样本间差异性越大越好
正负样本比例为1:3最佳;尺寸为20x20最佳。
1.1.1正样本
训练样本的尺寸为20*20(opencv推荐的最佳尺寸),且所有样本的尺寸必须一致。如果不一致的或者尺寸较大的,可以先将所有样本统一缩放到20*20。
以下就是我用来训练的正样本:
1.1.2负样本
这里要提醒一下,虽然负样本就是样本中不存在正样本的内容。但也不能随意的找些图片来作为负样本,比如什么天空,大海,森林等等。最好是根据不同的项目选择不同的负样本,比如一个项目是做机场的人脸检测,那么就最好从现场拍摄一些图片数据回来,从中采集负样本。其实正样本的采集也应该这样。不同的项目,就采集不同的正样本和负样本。因为项目不同,往往相机的安装规范不同,场景的拍摄角度就不同。
1.1.3 准备好工作目录
negdata目录: 放负样本的目录
posdata目录: 放正样本的目录
xml目录: 新建的一个目录,为之后存放分类器文件使用
negdata.txt: 负样本路径列表
posdata.txt: 正样本路径列表
pos.vec: 后续自动生成的样本描述文件
opencv_createsamples.exe: 生成样本描述文件的可执行程序(opencv自带)
opencv_haartraining.exe: 样本训练的可执行程序(opencv自带)
将下图中的所有文件拷贝到样本同级目录
1.1.4生成样本描述文件
1,生成正样本描述文件
进入posdata目录
执行dir /b/s/p/w *.jpg > pos.txt
2,生成负样本描述文件
进入negdata目录
执行dir /b/s/p/w *.jpg > neg.txt
打开正负样本描述文件如图:
将jpg全部替换成下面的格式
图中划线处为图片像素大小
将正负样本描述文件拷贝到与opencv_createsamples.exe文件同一目录
1.1.5生成.vec文件
opencv_createsamples.exe -vec pos.vec -info pos.txt -num 18500 -w 20 -h 20
opencv_createsamples.exe -vec neg.vec -info neg.txt -num 10500 -w 50 -h 50
说明:
-info,指样本说明文件
-vec,样本描述文件的名字及路径
-num,总共几个样本,要注意,这里的样本数是指标定后的20x20的样本数,而不是大图的数目,其实就是样本说明文件第2列的所有数字累加
-w -h指明想让样本缩放到什么尺寸。这里的奥妙在于你不必另外去处理第1步中被矩形框出的图片的尺寸,因为这个参数帮你统一缩放!(我们这里准备的样本都是20*20)
1.1.6训练样本
新建文件traincascade.bat
把
opencv_traincascade.exe -data xml -vec pos.vec -bg neg.txt -numPos 500 -numNeg 656 -numStages 20 -w 20 -h 20 -mode ALL
pause
复制进去保存
把pos.txt和neg.txt改回如图格式(注意:这一步至关中重要)
然后双击traincascade.bat进行训练
说明:
点击训练后会出现如图所示代表正确训练中
训练结束后会在xml目录下生成如图文件(其中cascade.xml就是我们训练得到的分类器)