@Gizmosir
2018-05-16T08:10:52.000000Z
字数 2019
阅读 1711
本牛科技
date:2018-05-14 郑炯彬 初稿
本文旨在说明如何使用训练Haar+AdaBoost分类器,主要使用到opencv自带的三个程序:
训练步骤分为以下三步:
neg
的1
文件中;neg.txt
(声明方法如下); find ./neg/1 -name "*.jpg" > neg.txt
pos
的1
文件中;生成一个描述所有图片文件的txt文件,这里我声明为pos.txt
(声明方法如下);
find ./pos/1 -name "*.jpg" > pos.txt
使用opencv自带的标记工具opencv_annotation
框选图片(调用方法如下)。需要注意的一点是,标记时无需将图像压缩或裁剪,这些工作在生成样本时会完成;
opencv_annotation --annotations=pos.txt --images=./pos/1/
使用opencv自带的opencv_createsamples
工具生成样本(调用方法如下)。值得注意的是,这里我声明样本大小为24*24
,你也可以使用其他尺寸;数量上限为1500,实际样本数为步骤3中标记的数量;
opencv_createsamples -vec pos.vec -info pos.txt -w 24 -h 24 -num 1500
cascade
;运行以下命令:
HAAR: opencv_traincascade -data cascade -vec pos.vec -bg neg.txt -numPos 300 -numNeg 600
或者
LBP: opencv_traincascade -data cascade -vec pos.vec -bg neg.txt -numPos 300 -numNeg 600 -featureType LBP -bt DAB -maxDepth 2
值得注意的是,这里的 -numPos
是每个阶段训练的样本数量,而不是训练样本总数。如果设置成样本总数会导致程序出错崩溃(#1)。另外,在训练过程中可以随时按下Ctrl+C
中断训练,并随后再继续接着训练。
#1:出现这种错的原因提示中很明显,正样本的数目不够,也就是-numPos设置的大了。加入正样本的数目一共有1900张,-numPos设置的是1800张,那么在第一级分类器中,会在1900张图片中选择1800张,在准确率达到0.99时结束第一级训练,那么分类器认为正样本还有1800*0.99张;到了第二级分类器,依旧需要输入1800张图片,那么还得从剩余的(1900-1800)张图片中选择(1800-1800*0.99)张,加上第一级分类器筛选出的正样本一起去训练,依次类推,假如你剩余的样本少于分类器需要的正样本数目,就会报错。所以设置-numPos的时候尽量是正样本数目的80%左右[1]。
根据实际的检测结果测试了不同训练参数和样本数,结果对比如下表所示:
ID | 正样本数 | 负样本数 | 样本大小 | 其他设置 | 结果 |
---|---|---|---|---|---|
1 | 328 | 112 | 24*24 | 无法识别手指 | |
2 | 328 | 615 | 24*24 | 可以识别手指,会误识别拳头 | |
3 | 328 | 696 | 24*24 | 比2 误识别率稍低 |
|
4 | 328 | 696 | 24*24 | ALL模式(#1) | 误识别率下降、正确识别率同样下降 |
5 | 328 | 696 | 24*24 | HR(击中率)=0.999 | 与3 差异不大 |
6 | 328 | 696 | 24*24 | FA(误报率)=0.3 | 误识别率下降、正确识别率同样下降,且相比4 更明显 |
7 | 328 | 696 | 24*24 | DAB模式(#2) | 与6 效果相当,且时间也无明显差距 |
8 | 328 | 696 | 48*48 | 比2 稍好,比3 稍差 |
#1:ALL模式是OpenCV的traincascade工具的一个调整参数,用于设置haar特征的方向,默认为BASIC,即向上的朝向,而ALL则会使用所有朝向包括45°。
#2:DAB模式也是一个可调参数,用于定义Boost的类型,有DAB、RAB、LB、GAB四种,默认是GAB。
实际测试效果如下图所示:
增加负样本数目后,减少了误识别率。
降低训练参数的FA率后,提高了正确识别率。
试验证明HAAR+AdaBoost方案能够有效检测到指尖位置,虽然目前业务上仍存在许多需要完善的地方。另外,由于目前训练结果的评估方法很不直观,需要设计一个更加有效的自动化测试方案。