[关闭]
@Gizmosir 2018-05-16T08:10:52.000000Z 字数 2019 阅读 1711

OpenCV中Haar+AdaBoostfen的训练步骤

本牛科技
date:2018-05-14 郑炯彬 初稿


前言

本文旨在说明如何使用训练Haar+AdaBoost分类器,主要使用到opencv自带的三个程序:

  1. opencv_annotation;
  2. opencv_createsamples;
  3. opencv_traincascade;

训练步骤分为以下三步:

  1. 生成训练集;
  2. 训练分类器;
  3. 根据实测结果调参。

训练集

负样本

  1. 将不含识别样本的图片保存在某一文件夹下,这里我保存再neg1文件中;
  2. 生成一个描述所有图片文件的txt文件,这里我声明为neg.txt(声明方法如下);
    find ./neg/1 -name "*.jpg" > neg.txt

正样本

  1. 将包含识别样本的图片保存在某一文件夹下,这里我保存再pos1文件中;
  2. 生成一个描述所有图片文件的txt文件,这里我声明为pos.txt(声明方法如下);

    find ./pos/1 -name "*.jpg" > pos.txt

  3. 使用opencv自带的标记工具opencv_annotation框选图片(调用方法如下)。需要注意的一点是,标记时无需将图像压缩或裁剪,这些工作在生成样本时会完成;

    opencv_annotation --annotations=pos.txt --images=./pos/1/

  4. 使用opencv自带的opencv_createsamples工具生成样本(调用方法如下)。值得注意的是,这里我声明样本大小为24*24,你也可以使用其他尺寸;数量上限为1500,实际样本数为步骤3中标记的数量;

    opencv_createsamples -vec pos.vec -info pos.txt -w 24 -h 24 -num 1500

训练

  1. 首先生成一个用于存放训练器的文件夹,在这里我声明为cascade
  2. 运行以下命令:

    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方案能够有效检测到指尖位置,虽然目前业务上仍存在许多需要完善的地方。另外,由于目前训练结果的评估方法很不直观,需要设计一个更加有效的自动化测试方案。

参考阅读

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注