PS:本来还想用Adaboost做多分类,弃了~
一、Haar、LBP
- HAAR特征是浮点数计算,LBP特征是整数计算;
- LBP训练需要的样本数量比HAAR大
- LBP的速度一般比HAAR快
- 同样的样本HAAR训练出来的检测结果要比LBP准确
- 扩大LBP的样本数据可达到HAAR的训练效果
二、级联分类器
https://zhuanlan.zhihu.com/p/35058334
- 级联分类器结构:弱分类器线性组合成为强分类器,强分类器用决策树的形式级联
- 存储分类器的XML中的参数
三、利用并查集合并窗口和丢弃零散分布的误检窗口
四、AdaBoost 算法
1. 概念
(1)准确率
- 查准率 Precision
- 查全率 Recall,precision和recall都越高越好
- 命中率 hitRate,度量检测器对正样本的通过能力,越接近1越好
- 虚警率 falseAlarm,度量检测器对负样本的通过能力,越接近0越好
(2)positive sample会产生:
- TP(true positive),即positive sample被检测器判定为目标
- FN(false negative),即positive samples被检测器判断为非目标
(3)negative sample会产生:
- TN(true negative),即negative sample被检测器判定为非目标
- FP(false positive),即negative sample被检测器判定为目标
2. AdaBoost 步骤
- 找TP和FP作为训练样本
- 计算每个Haar特征在当前权重下的Best split threshold+leftvalue+rightvalue,组成了一个个弱分类器
- 通过WSE寻找最优的弱分类器
- 更新权重
- 按照minHitRate估计stageThreshold
- 重复上述1-5步骤,直到falseAlarmRate到达要求,或弱分类器数量足够,停止循环,输出stage
- 进入下一个stage训练
五、opencv 提供的模型和工具
应用放的位置 D:\program\opencv3.0.0\opencv\build\x64\vc12\bin
1.opencv 自带的检测模型
2.opencv 自带的AdaBoost分类器
opencv_annotation 用来在一张大图中标定一个或多个需要检测的目标
opencv_createsamples 用来制作positive sample的vec
opencv_traincascade 用来训练得到需要的cascade.xml
六、AdaBoost训练过程
阶段一:训练数据的准备
1. 导出正负样本的文件列表
(1)注意:
最好使用图片的绝对路径,不然最后训练可能找不到图片 Image reader can not be created from
删除存放路径文件中的其它文件路径,只保留图片的路径
存放图片的路径的文件可以是 .txt 也可以是 .dat 文件
txt扩展名的文件:存放ASCII码形式的文件
dat扩展名的文件:存放ASCII码,也可以是二进制(内存格式)形式的文件
(2)用windows中的 dir 命令导出图片文件的列表
dir /b /s /o:n /a:a > pos.dat
1 | /b 表示去除摘要信息,且顶格显示完整路径 |
单独使用dir /b与dir /s 都不会显示完整路径,只有这两个组合才会显示完整路径
2. 制作正样本的vec文件
(1)生成正样本描述文件 (.dat 或 .txt )
情况一:文件不需要裁剪
将第一步中生成文件用替换的方法
将D:\热像仪手势识别\jzy\adaboost\ConsoleApplication2\pos_resize\pos_1.jpg
修改为 D:\热像仪手势识别\jzy\adaboost\ConsoleApplication2\pos_resize\pos_1.jpg 1 0 0 20 20
情况二:文件需要裁剪
用 opencv_annotation 框选目标的位置,得到的文件形式和上面方法一样
(2)生成 vec 文件
用 opencv_createsamples 生成 vec 文件
阶段二:训练级联分类器
用 opencv_traincascade 训练级联分类器
opencv_traincascade.exe -data cascade -vec pos_resize\pos.vec -bg neg\neg.dat -numPos 100 -numNeg 300 -numStages 10 -featureType LBP -w 20 -h 20
注意
-data cascade
是指需要提前创建一个文件cascade放测试结果- 正样本的.vec文件,负样本的.txt 或 .dat文件 要用相对路径
cascade文件:
params:训练的参数,比如这里训练的分类器的级数是10
第十级的训练情况:
阶段三:利用训练好的分类器进行检测
PS:在使用opencv中ClassifierCascade类时,无法加载级联分类器,可能是因为 opencv3.0 版本不太稳定,将xml文件复制,使用相当路径 ,可能会好一点
多尺度目标检测
detectMultiScale (const Mat& image, CV_OUT vector& objects, double scaleFactor = 1.1, int minNeighbors = 3, int flags = 0, Size minSize = Size(), Size maxSize = Size())
image—待检测图片,一般为灰度图像,加快检测速度
objects—检测结果的矩形框向量组,用来画出 bounding box
scaleFactor—前后两次扫描中,搜索窗口的比例系数,默认为1.1,即每次搜索窗口依次扩大10%
minNeighbors—构成检测目标的相邻矩形的最小个数
如果组成检测目标的小矩形的个数和小于 min_neighbors -1,就会被排除
如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框
flags—使用默认值
使用CV_HAAR_DO_CANNY_PRUNING,使用Canny边缘检测来排除边缘过多或过少的区域
minSize和maxSize—限制得到的目标区域的范围。