1. 训练分类器简介
有如下几个需要考虑的地方:
*准备正样本:
越多越好(场景相对固定的场景下,大约1000个样本较为合理)
*准备负样本:
分为两个类别,工作场景负样本,非工作场景负样本。两者比重约为1:2
*特征选择:
本次选择LBP特征,主要考虑因素是速度。
*分类器选择:
ADB
2重要步骤:2.1 准备正样本:
工具:*labelImg:在图像中进行目标定位和打标
*cvt_xml:将xml文件描述转换为opencv的目标描述方式
*opencv_createsamples:通过样本图像和描述文档生成.vec样本文件
-
-
LabelImg的使用:
-
建议文件存放结构为(专为转opencv样本描述文件,对于多类打标,不必要)
--pos_imgs
--pos_1
--pos_2
--..
--pos_n
labelImg会对每一张图生成一个同名的.xml文件。
2.1.2cvt_xml的使用:
分别设置如下信息:
对象类别名称, objName
存放xml文件的路径, pathName
生成描述文件的文件名,cvDsFileName
最终生成的文件方式如下:
*红色圈内是图像的文件名。
如图,img5.bmp
*蓝色方框是该图像中样本的个数。
如图,13,表示本图中有13个绿框对应的样本
*每个绿色框表示某一个样本的Rectangle,用四个数字表示x,y, w, h。
如图,有3个绿框(一共有13个,其余的没有显示)
cvt_xml的源代码:https://github.com/seanXYZ/cvt_xml
2.1.3opencv_createsamples:
Tips:
https://blog.csdn.net/sean_xyz/article/details/80002266
这篇博客较为清楚地描述了opencv_createsamples的用法和坑~
-
准备负样本:
负样本的重要性通常容易被忽略(海量正样本确实可以),其中一个需要注意的地方是,区分分类器的使用场所,如果是固定场景内,那么负样本最好加入一定数量场景内的图像,训练的时候总的负样本可以适当少一些。这样做最终不仅训练和检测速度快,而且准确度也比较高。
工具:
*Inpaint:图像修复工具,将场景图像中的目标去掉。
*resize:对负样本进行若干个尺度的缩放。
场景内负样本:
Inpaint处理后是使用inpaint 技术消除掉目标。
但这还是有些太麻烦,毕竟inpait运算量巨大。可以直接使用黑色块抹掉正目标。
场景外负样本:
跟样本无关的都可以
-
训练:
opencv_traincascade -data result -vec pos1\t0.vec -bg ./bg_com/bg_com.txt -numPos 200-numNeg 15000 -numStages 12 -featureType LBP
基本常用参数意义如下:
-dataresult 存放训练的中间结果,参数以及最终结果
-vecpos1\t0.vec 正样本文件名
-bg./bg_com/bg_com.txt 负样本描述文件,负样本是通过随机数在图像中切出来的
-numPos200 正样本个数,不超过.vec的数量
-numNeg15000 负样本个数,通常比正样本高一两个数量级
-numStages12 级联分类器层数,单一场景下,通常7~8就可以得到比较好的结果了
-featureTypeLBP 特征选择,LBP速度优势明显
其他参数: