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

来源:互联网 发布:mac文件夹加密 编辑:程序博客网 时间:2024/04/29 22:02

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

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();

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 走路走多了脚疼怎么办 走太多路脚酸痛怎么办 走路走的腿酸痛怎么办 路走得太多腿疼怎么办 走路走的足弓疼怎么办 走路走多了膝盖怎么办 2岁宝宝走路一只脚内八字怎么办 6岁宝宝o型腿怎么办 一岁宝宝o型腿怎么办 宝宝一岁o型腿怎么办 宝宝一周两个月走路弓着腿怎么办 宝宝腿走路膝盖弯曲怎么办 两岁宝宝不爱走路怎么办 水鸭子脚不能走了怎么办 鸭子坐着脚走不动怎么办 鸭子步走了腿疼怎么办? 跳爵士舞没感觉怎么办 军校学员体能考核不达标怎么办 俯卧撑新兵连做不动怎么办 宝宝胆小不敢上体能课怎么办 28岁老太太抬头纹剩两颗怎么办 大腿前侧抽筋痛怎么办 电脑看片缓冲慢怎么办 跑步跑的腿疼怎么办 第一次去健身房练瑜伽不会怎么办 跑步过后腿筋疼怎么办 俯卧撑只能做20个怎么办 被裤裆峰咬了怎么办? 新兵5公里不想跑怎么办 老公掉粪坑了你怎么办 在部队被欺负了怎么办 衣服上的标志洗掉了怎么办 整件白衬衣被染怎么办 遇到敲诈小混混该怎么办 纯棉衣服洗长了怎么办 纯棉的衣服洗后长了怎么办 睡觉把脖子扭了怎么办 微信限额10万了怎么办 新兵条令背不下来怎么办 武警部队改革去年入伍的新兵怎么办 规培考试没考上怎么办