一文解决OpenCV训练分类器制作xml文档的所有问题

一 前言

关于训练分类器制作XML文档时需要的两个exe应用程序的解释。

  opencv_createsamples :用来准备训练用的正样本数据和测试数据。opencv_createsamples 能够生成能被opencv_haartraining 和 opencv_traincascade 程序支持的正样本数据。它的输出为以 *.vec 为扩展名的文件,该文件以二进制方式存储图像。   opencv_traincascade :支持 Haar和 LBP(Local Binary Patterns) 两种特征,并易于增加其他的特征。opencv_haartraining 是一个将被弃用的程序(Opencv3.0版本中没有)。opencv_traincascade 可以旧格式导出选练好的级联分类器。

二 训练

整个过程分为两步:

  1. 创建样本 样本的创建见参考文献1
  2. 训练分类器 命令:
opencv_traincascade.exe  -data data -vec D:/Opencv/build/x64/vc12/bin/a.vec -bg H:/negdata/bg.txt –numPos 10 –numNeg 100 -numStages 4 -w 32 -h 32  -featureType HAAR -precalcValBufSize 1 -precalcIdxBufSize 1

三 opencv_traincascade.exe用到的参数及解释

一、训练时存储在变量中的参数(9个参数)

参数

说明

data

训练的分类器的存储目录

vec

正样本文件,由open_createsamples.exe生成,正样本文件后缀名为.vec

bg

负样本说明文件,主要包含负样本文件所在的目录及负样本文件名

numPos

每级分类器训练时所用到的正样本数目,应小于vec文件中正样本的数目,具体数目限制条件为:numPos+(numStages-1)numPos(1-minHitRate)<=vec文件中正样本的数目

numNeg

每级分类器训练时所用到的负样本数目,可以大于-bg指定的图片数目

numStages

训练分类器的级数,强分类器的个数

precalcValBufSize

缓存大小,用于存储预先计算的特征值,单位MB

precalcIdxBufSize

缓存大小,用于存储预先计算的特征索引,单位MB

baseFormatSave

仅在使用Haar特征时有效,如果指定,级联分类器将以老格式存储

二、存储在参数类中的参数()

1、存储CvCascadeParams的对象中的参数(4个参数)

参数

说明

stageType

级联类型,目前只能取BOOST

featureType

训练使用的特征类型,目前支持的特征有Haar,LBP和HOG

w

训练的正样本的宽度,Haar特征的w和h一般为20,LBP特征的w和h一般为24,HOG特征的w和h一般为64

h

训练的正样本的高

2、存储在CvCascadeBoostParams的对象中的参数(6个参数)

参数

说明

bt

训练分类器采用的Adaboost类型

minHitRate

影响每个强分类器阈值,每一级分类器最小命中率,表示每一级强分类器对正样本的的分类准确率

maxFalseAlarm

最大虚警率,影响弱分类器的阈值,表示每个弱分类器将负样本误分为正样本的比例,一般默认值为0.5

weightTrimRate

0-1之间的阈值,影响参与训练的样本,样本权重更新排序后(从小到大),从前面累计权重小于(1-weightTrimRate)的样本将不参与下一次训练,一般默认值为0.95

maxDepth

每一个弱分类器决策树的深度,默认是1,是二叉树(stumps),只使用一个特征。

maxWeakCount

每级强分类器中弱分类器的最大个数,当FA降不到指定的maxFalseAlarm时可以通过指定最大弱分类器个数停止单个强分类器

mode

值为BASIC、CORE、ALL三种,根据值不同采用不同的Haar特征,BASIC是基本的Haar特征,CORE是所有的上下Haar特征,ALL是使用所有的Haar特征

四 遇到问题一:

  在用opencv_traincascade训练分类器的时候,遇到了报错如下: Train dataset for temp stage can not be filled. Branch training terminated.

  看下面cascadeclassifier.cpp的源代码:

for( int i = startNumStages; i < numStages; i++ )
    {
        cout << endl << "===== TRAINING " << i << "-stage =====" << endl;
        cout << "<BEGIN" << endl;

        if ( !updateTrainingSet( tempLeafFARate ) )
        {
        cout << "Train dataset for temp stage can not be filled. "
            "Branch training terminated." << endl;
        break;
    } 
    ...
bool CvCascadeClassifier::updateTrainingSet( double& acceptanceRatio)
{
    int64 posConsumed = 0, negConsumed = 0;
    imgReader.restart();
    int posCount = fillPassedSamples( 0, numPos, true, posConsumed );
    if( !posCount )
        return false;
    cout << "POS count : consumed   " << posCount << " : " << (int)posConsumed << endl;

    int proNumNeg = cvRound( ( ((double)numNeg) * ((double)posCount) ) / numPos ); // apply only a fraction of negative samples. double is required since overflow is possible
    int negCount = fillPassedSamples( posCount, proNumNeg, false, negConsumed );
    if ( !negCount )
        return false;

    curNumSamples = posCount + negCount;
    acceptanceRatio = negConsumed == 0 ? 0 : ( (double)negCount/(double)(int64)negConsumed );
    cout << "NEG count : acceptanceRatio    " << negCount << " : " << acceptanceRatio << endl;
    return true;
}

1)负样本描述文件neg.txt不能带路径名,即 : -bg neg.txt 是合法的, -bg negdata/neg.txt是非法的。所以必须把neg.txt文件跟exe文件放在同一个目录下 2)当切换了操作系统时,会因为txt文件的格式问题而导致了负样本读取失败。比如:在windows操作系统下生出了neg.txt,但是在ubuntu下进行训练,这样就会导致错误,这是因为windows下txt文件换行符’\r’在ubuntu下无法识别

五 遇到问题二:

  在用opencv_traincascade训练分类器的时候,遇到了报错如下: “Cascade classifier can’t be trained. Check the used training parameters.”

  正样本数量必须大于10,需要重新创建数据集并重新试验。

  N 为训练层数   HR 击中率,   FA 虚警,只有当每一层训练的FA低于你的命令中声明的maxfalsealarm数值才会进入下一层训练

六 遇到问题三:

  1.如果出现 Parameters can not be written, because file traincascade/params.xml can not be opened 错误,则自己需要手动创建一个文件夹 traincascade;   2.如果出现如下问题.   Traincascade Error:Bad argument(Can not get new positive sample.The most possible reason is insufficient count of samples in given vec-file.   记得一定要numPos小于vec_file文件里面的数 一般numPos为0.9*num_in_vec或者为0.8*num_in_vec

七 参考文献:

1.http://blog.csdn.net/kevin_ut/article/details/5838389 2.http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/user_guide/ug_traincascade.html#id9 3.http://answers.opencv.org/question/16868/error-in-train-casacde/ 4.http://blog.csdn.net/xidianzhimeng/article/details/10470839

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏新智元

猫狗大战识别准确率直冲 Kaggle Top 2%,手把手教你在 Keras 搭建深度 CNN

猫狗大战 数据集来自 kaggle 上的一个竞赛:Dogs vs. Cats,训练集有25000张,猫狗各占一半。测试集12500张,没有标定是猫还是狗。 ?...

6777
来自专栏贾志刚-OpenCV学堂

OpenCV3.1.0级联分类器训练与使用

OpenCV3.1.0级联分类器训练与使用 级联分类器第一次出现是由Viola-Jones在2001时候提出,其主要用来实现实时人脸检测,通过加载已经训练好的级...

46711
来自专栏WOLFRAM

Mathematica-数据和函数的可视化

1473
来自专栏Jack-Cui

Caffe学习笔记(三):cifar10_quick_train_test.prototxt配置文件分析

运行平台: Ubuntu14.04     在上篇笔记中,已经记录了如何进行图片数据格式的转换和生成txt列表清单文件。本篇笔记主要记录如何计算图片数据的均值和...

2868
来自专栏Jack-Cui

Caffe学习笔记(七):使用训练好的model做预测(mnist)

Python版本: Python2.7 运行平台: Ubuntu14.04 一、前言     在之前的笔记中,已经生成了训练好的mnist.cafffemod...

3935
来自专栏游遵文的专栏

机器学习优化算法:梯度下降(Gradient Descent)

优化算法 ( Optimization Algorithm ) 是机器学习理论中重要的组成部分,每年 ICML 会议中,总会有很多关于优化算法 Paper 以及...

5891
来自专栏机器学习算法原理与实践

用scikit-learn和pandas学习Ridge回归

    本文将用一个例子来讲述怎么用scikit-learn和pandas来学习Ridge回归。

1232
来自专栏专知

【最新TensorFlow1.4.0教程02】利用Eager Execution 自定义操作和梯度 (可在 GPU 运行)

点击上方“专知”关注获取更多AI知识! 【导读】主题链路知识是我们专知的核心功能之一,为用户提供AI领域系统性的知识学习服务,一站式学习人工智能的知识,包含人工...

4986
来自专栏深度学习思考者

目标检测:选择性搜索策略(C++ / Python)

导读:通过本教程,我们将彻底理解一个重要的概念:目标检测中的常用方法“Selective Search”。文末也会给出使用C++或者Python的Opencv代...

5457
来自专栏瓜大三哥

基于FPGA的均值滤波(二)

基于FPGA的均值滤波(二) 之一维求和模块 均值滤波按照整体设计可以分为以下几个子模块: (1)一维求和模块,这里记为sum_1D; (2)二维求和模块,这里...

3009

扫码关注云+社区