• 前言

    emmm,之前写了一篇使用OpenCV处理图像数据的文章,前段时间也用OpenCV haar训练过一个识别门把手的分类器,写一篇博客来记录一下操作过程和其中一些参数的理解。

食用环境

  • python3.7
  • OpenCV 3.4.6(注意:好像更高版本的OpenCV发行版中取消了haar分类器的可执行文件。)
  • Windows10 1903 LTSC
  • 文件目录image
    • 根目录下还包括OpenCV的分类器训练程序:opencv_traincascade.exe等。
    • classifier,temp都是用来存放训练好的xml分类器。
    • images文件夹好像没有用处。
    • negative,positive文件夹分别放处理好的负,正样本文件,我使用的正样本是32x32的灰度图,负样本是48x64的背景图。

食用步骤

  1. 运行negTxtGen.py和posTxtGen.py,分别生成正负样本的文件路径,输出到txt中。
  2. 终端cd到工作根目录下,执行
    	./opencv_creatsamples.exe -info positives.txt -vec pos.vec -num 你的正样本数量 -w 你的正样本宽度 -h 你的正样本高度
    

    得到pos.vec即正样本的向量。

  3. 同样在工作目录下,终端执行
    	./opencv_traincascade.exe -data 输出训练结果的文件夹 -vec pos.vec -bg 你的负样本路径文件,如negatives.txt -numPos 正样本数量 -numNeg 负样本数量(可大于你的样本数) -numStages 训练层数 -w 同上 -h 同上 - maxFlaseAlarmRate 一般取0.9-0.995
    

    得到训练的xml文件,即可在test.py中使用。

参数分析&一些问题

  • 除了以上的参数之外,还有一些可选参数:
    • precalcValBufSize:缓存大小,用于存储预先计算的特征值,单位MB
    • precalcIdxBufSize:缓存大小,用于存储预先计算的特征索引,单位MB
    • baseFormatSave:仅在使用Haar特征时有效,如果指定,级联分类器将以老格式存储
  • 参数设置不当会遇到一些问题
    • 训练时候卡住不动:minHitRate和maxfalsearmrate可能设置过高,或者你的负样本数量太少,或者负样本中已经没有特征点可以达到这样的参数要求,都会导致这个问题。
    • 这里给出一个参数的设置参考公式,但是实际情况也还是需要自己尝试和调整:numPos+(numStages-1) x numPos x(1-minHitRate)<=正样本
    • 报错:Train dataset for temp stage can not be filled. Branch training terminated.同样是参数问题,根据上述方法调整参数,或者调整样本即可。

What is broken can be reforged.