OpenCV的HOG+SVM训练程序注意事项

转载 2015年07月07日 10:44:00

关于训练程序我封装了一份,大家可以参考一下

http://download.csdn.net/detail/xidianzhimeng/8270413

样本的配置与OpenCV训练Adaboost的类似,相信训练过Adaboost的同学能很快入手的。


行人训练:http://www.tuicool.com/articles/MvYfui

字符识别:http://www.haogongju.net/art/2328003

用OpenCV使用HOG特征进行SVM算法训练的大概流程是 

1)设置训练样本集

需要两组数据,一组是数据的类别,一组是数据的向量信息。

2)设置SVM参数,参考《机器模式->libSVM之参数说明》

注意必须使用线性SVM进行训练,因为HogDescriptor检测函数只支持线性检测!!!

3)使用HOGDescriptor计算hog特征

4)训练SVM

调用CvSVM::train函数建立SVM模型,第一个参数为训练数据,第二个参数为分类结果,最后一个参数即CvSVMParams

5)用这个SVM进行分类

调用函数CvSVM::predict实现分类,可以采用穷举的方法训练HardExample

6)获得支持向量

调用函数CvSVM::get_support_vector_count获得支持向量的个数,CvSVM::get_support_vector获得对应的索引编号的支持向量。

7)保存支持向量与alpha、rho   

    SVM训练完成后得到的XML文件里面,有一个数组,叫做support vector,还有一个数组,叫做alpha,有一个浮点数,叫做rho;

    将alpha矩阵同support vector相乘,注意,alpha*supportVector,将得到一个列向量,将该向量前面乘以-1。之后,再该列向量的最后添加一个元素rho。

    如此,变得到了一个分类器,利用该分类器,直接替换opencv中行人检测默认的那个分类器(cv::HOGDescriptor::setSVMDetector()),

    int supportVectorNum = svm_train->get_support_vector_count();

    cout<<"support vector size of SVM : " << supportVectorNum << "\n";

    //支持向量矩阵  

    Mat sv = Mat::zeros(supportVectorNum, fet_num, CV_32FC1);

    //alpha向量,长度等于支持向量个数  

    Mat alp = Mat::zeros(1, supportVectorNum, CV_32FC1);

    //alpha向量乘以支持向量矩阵的结果  

    Mat re = Mat::zeros(1, fet_num, CV_32FC1);

 

    //将支持向量的数据复制到supportVectorMat矩阵中  

    for(int i=0; i<supportVectorNum; i++)  

    {   //返回第i个支持向量的数据指针  

        const float * pSVData = svm_train->get_support_vector(i);

        for(int j=0; j< fet_num; j++)  

            sv.at<float>(i,j) = pSVData[j];    

    }  

    //将alpha向量的数据复制到alphaMat中,返回SVM的决策函数中的alpha向量  

    double * pAlphaData = svm_train->get_alpha_vector();

    for(int i=0; i<supportVectorNum; i++)  

        alp.at<float>(0,i) = (float)pAlphaData[i];

    //计算-(alphaMat * supportVectorMat),结果放到resultMat中,注意因为svm.predict使用的是alpha*sv*another-rho,如果为负的话则认为是正样本,在HOG的检测函数中,使用rho+alpha*sv*another如果为正的话是正样本,所以需要将后者变为负数之后保存起来

    re = -1 * alp * sv;

    // 将乘积保存起来

    ofstream ofs(hog_name.c_str(), ios::out);

    if (!ofs.is_open())

        cerr << "open file " << hog_name << " failed\n";

    for(int i=0; i<fet_num; i++)

        ofs << re.at<float>(0, i) << "\n";

    float rho = svm_train->get_rho();

    ofs << rho << "\n";

    ofs.close();

机器学习——由公式看透算法(1)___决策树

琪琪

目标检测学习_1(用opencv自带hog实现行人检测)

本文主要介绍下opencv中怎样使用hog算法,因为在opencv中已经集成了hog这个类。其实使用起来是很简单的,从后面的代码就可以看出来。本文参考的资料为opencv自带的sample。    ...

OpenCV的HOG+SVM训练程序注意事项

本文转自:http://blog.csdn.net/xidianzhimeng/article/details/41726399。 关于训练程序我封装了一份,大家可以参考一下 http...

OpenCV的HOG+SVM训练程序注意事项

使用OpenCV进行分类训练的时候,注意(1)必须使用线性核函数,HOGDescriptor只支持线性核函数检测(2)保存文件的时候注意要将alpha*supportvector的负数形式...

opencv SVM 训练行人检测器注意事项

事项1:支持向量一个的原因? 如下的解答: 用opencv2.49的我是这么理解的:对于线性SVM,在opencv\sources\modules\ml\src\svm.cpp这个源码的optimiz...

采用opencv_cascadetrain进行训练的步骤及注意事项

OpenCV中有两个程序可以训练级联分类器: opencv_haartraining 和opencv_traincascade。opencv_traincascade 是一个新程序,使用OpenCV ...

采用opencv_cascadetrain进行训练的步骤及注意事项

OpenCV中有两个程序可以训练级联分类器: opencv_haartraining 和opencv_traincascade。opencv_traincascade 是一个新程序,使用OpenCV ...

(转)采用opencv_cascadetrain进行训练的步骤及注意事项

转自 xidianzhimeng 的博客 http://blog.csdn.net/xidianzhimeng/article/details/10470839#     这段时间再看分类器,了解到o...

OpenCV中将一幅图平均分成N*M份,适合SVM+HOG训练的负样本采集

刚刚开始学OpenCV,这个程序是自己写的,运行环境是VS2010+OpenCV2.4.9; 因为做SVM+HOG对人体头部进行检测,自己偷懒,而且还不会用鼠标选ROI,就用ps,花了一整天,收集了...

图像识别--Java中使用openCV提取Hog特征通过SVM训练实现图像识别

图像识别大致可以分为这么几步: 1.对训练图片进行预处理 2.对预处理的图片进行Hog特征提取 3.使用SVM分类器对特征进行分类形成模型 4.根据模型对测试图片进行预测   以下都是通过...
  • M_WBCG
  • M_WBCG
  • 2017年07月13日 22:16
  • 516
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenCV的HOG+SVM训练程序注意事项
举报原因:
原因补充:

(最多只允许输入30个字)