今天遇到一位群友 对于级联分类器有点问题 于是我决定把训练的过程分享出来,并且和大家说说训练过程中可能会出现的问题。
创建样本步骤:
准备训练集
首先 准备好训练集 正样本和负样本 (我做的是车牌识别 所以选取的正样本是车牌),
正样本放在positive文件夹下的img文件夹里(positive上面那个img文件夹存放的负样本,大家不要混淆了)
正样本的话 不需要相同大小 ,但是一定要相同比例 ,怕出问题的的就把正样本变成相同大小吧。
我用的60*17的车牌图片
负样本的话,是指不包含正样本的其他任意图片,最好能有各种不同大小的不同场景的图片。
我将负样本放在img目录下
这个负样本是网上下的 相同大小 20*20 有点粗糙 大家不要学我 。。(最好是能有各种不同大小不同场景的!!)
样本准备好了 接下来生成路径
为正负样本生成描述文件:
将文件夹下的图片遍历一遍 保存到txt文件里,可以用代码,也可以手动的复制粘贴路径写入txt。。
我用的java将文件夹下的图片遍历出来的 ,java代码在下面链接
资源链接
接下来展示一下存放正样本路径的txt的内容
正样本用描述文件格式描述 如下
[filename] [# of objects] [[x y width height] [... 2nd object] ...]
x y指的是图片左上角坐标 width height指的是图片宽高
举个例子:
img/0001.bmp 1 0 0 60 17
1代表一个文件 0 0 代表左上角x y坐标 60 17 表示宽高
看这个红框代码 自己领悟
然后就是负样本的txt文件 负样本用集合文件格式描述
集合文件格式(collection file format)就是如下形的描述文件:
[filename]
我将负样本放在bg.txt文件下
创建样本 直接上图
这就是生成样本的exe,win+R 输入cmd 进入该路径
可以看到相关的一些参数 -vec 后面跟着要存放的路径 -num指的是正样本数量 -w是输出样本的宽 -h是输出样本的高 这就上面提到的 为什么可以大小不相同 一定要相同比例的问题
.vec文件生成 。
在此注意 正样本.txt需要ANSI编码,那位群友使用的C#遍历文件夹图片 使用UNICODE编码,会出现如下内容:parse errorDone. Created 0 samples 据说-num数量不对也会出现该情况
经测试 使用utf-8编码 会出现如下情况
.vec文件创建后 就是训练分类器了
训练分类器
由该程序来实现,opencv2.x应该是叫haartarining.exe opencv3.x将haar和lbp整合成一个,就是上面红框标注
和上面使用opencv_createsamples.exe相同 cmd 进入该目录
使用命令 -data 是存放训练好的分类器的路径 -vec 就是存放.vec的路径 -bg 负样本描述文件 -numPos 每一阶段训练的正样本数量 -numNeg 每一阶段训练的负样本数量 (网上说-numPos的参数要比实际正样本数量小,-numNeg 的参数要比实际负样本数量大 ,具体情况不太了解) -numStages 训练阶段数 (这个参数不能太大也不能太小 下面会说到) -featureType 选择LBP还是HAAR 在此选用LBP -w -h 训练样本尺寸 和vec生成的尺寸大小相同 不然会宕机 -minHitRate 最小命中率 -maxFalseAlarmRate 最大虚警率 这两个参数下面链接有说明 在此不多说
http://www.mamicode.com/info-detail-1724988.html
对了 提醒一下 如果 -featureType选择HAAR 需要在加上 -mode ALL
然后就是回车 等待训练
如果卡在POS这里 不要紧张 慢慢等待 我是等了十分钟左右才跳出 如果很久都没跳出 -numStages参数说明太大 改小一点 即可 当然 如果太小的话 生成的xml文档分类效果可能就不太好
当出现如下提示 表示训练完毕
然后就可以看到一个xml文档生成 , 底下的那个stage0.xml stage1.xml params.xml是是每一阶段训练生成的xml,最终生成的cascade.xml
训练过程会有很多问题 大家多尝试 正样本负样本最好 1:3 ,1:4 比如我正样本617个 负样本2300多个
然后就是使用我们训练的xml文件了