OpenCV物体检测需要的叠层分类器, OpenCv自带的训练器
OpenCV 2.4
windows 7 64
<1> 收集样本
样本分为正样本和负样本,并且大小要一致, 一般为20 *20大小的图片, 正样本是包含要检测的物体, 不能包含其他物体, 负样本只要不是要检测的物体就可以.例如要检测人脸, 则正样本只能包含人脸. 不能有其他, 负样本则不能包含有人脸, 样本最好是能突显所要检测物体的特性.
样本的数量, 多样性决定了分类器的准确性.
将收集的样本分别放在两个文件夹, 这里的两个文件夹为, 正样本face\ , 负样本 neg\
在两个样本文件夹下分别新建一个文本文档, 命名为正样本info.txt, 负样本bg.txt. 并且在这两个文件夹下执行命令 dir /d > infi.txt , dir /d > bg.txt, 则所有样本文件名都被导入文本文档,将每行改为如下格式,
样本1.bmp 1 0 0 20 20
样本2.bmp 1 0 0 20 20
1是样本数量, 0是开始区域左上坐标, 20是右下坐标, 在本例中, 整个图片都为要样本有效区则0开始20结束:
<2>创建样本文件
生成样本文件程序在OpenCv 目录下的位置, :
OpenCv\opencv\build\x64\cv12\bin\ opencv_createsamples.exe
在OpenCv\opencv\build\x64\cv12\bin\ 目录下执行命令,
opencv_createsamples.exe -info face\info.txt -vec data.vec -num 2700 -w 20 -h 20
参数说明:
Info | 正样本描述文件位置 |
Vec | 生成的样本保存位置 |
Num | 样本数量 |
W | 样本宽度 |
H | 样本高度 |
... | 其他参数 |
执行以上命令后将生成一个样本文件.vec
<3>训练联级分类器
训练程序路径;OpenCv\opencv\build\x64\cv12\bin\
训练命令: opencv_haartraining.exe -vec data.vec -data dat -bg nonfaces\bg.txt -npos 2710 -nneg 2710 -nstages 5 -nsplits 3 -mem 512 -minpos 100 -w 20 -h 20
参数说明:
Vec | 样本文件路径(用traininssample创建) |
Data | 存放训练好的分类器的路径 |
Bg | 负样本描述文件路径 |
Npos | 用来训练正样本的数量 |
Nneg | 用来训练的负样本数量 |
Nstages | 训练的层数 |
Nsplits | 决定用于阶段分类器的弱分类器.如果为1,则应该简单的stump classifier 被使用,如果是2或更多,则带有number_of_splits个内部节点的CART分类器被使用 |
Mem | 预算内存, 越大速度快 |
Nosnsym | 是否垂直对称 |
Mode | 表示haar特征集 |
W h | 训练样本的尺寸 |
结果:
N: 层数 %
SMP: 样本使用率
F: +表示通过翻转,否则是 -
ST.THR: 分类器阈值
HR: 当前分类器 对正样本识别正确的概率
FA: 当前分类器 对负样本识别错误的概率
EXP.ERR:分类器的期望错误率