opencv hog svm java_OpenCV的HOG+SVM训练程序注意事项

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

1)设置训练样本集

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

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

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

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<

//支持向量矩阵

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

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

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

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

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

}

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

double * pAlphaData = svm_train->get_alpha_vector();

for(int i=0; i

alp.at(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

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

float rho = svm_train->get_rho();

ofs << rho << "\n";

ofs.close();

原文:http://blog.csdn.net/xidianzhimeng/article/details/41726399

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值