OpenCV的HOG+SVM训练程序注意事项
2015-08-20 09:19
489 查看
本文转自:/article/7998536.html。
关于训练程序我封装了一份,大家可以参考一下
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中行人检测默认的那个分类器
关于训练程序我封装了一份,大家可以参考一下
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();
相关文章推荐
- Linux 常用命令基础入门一
- openwrt 中opkg update 报错的问题解决
- OpenCV中Adaboost训练的经验总结
- kingshard架构设计和功能实现
- CentOS 7 下想要挂载NTFS的文件系统
- xplico1.1 centos 编译问题及解决方法
- Windows Azure HDInsight - 使用Hadoop 做数据分析
- CentOS系统下的Hadoop集群(第4期)_SecureCRT使用
- Linux中的cat命令
- java.lang.UnsupportedClassVersionError: org/apache/maven/cli/MavenCli : Unsupported major.minor vers
- Linux查看程序端口占用情况
- Linux命令_gnome-screen_ubuntu下的截图命令
- 最小堆解决topK问题
- Linux中的cp命令
- 理解 OpenStack 高可用(HA)(5):RabbitMQ HA
- Docker 会取代虚拟机吗?
- linux文件上传下载笔记(rz,sz,sftp,scp)命令
- 第21/24周 性能监控(PAL工具)
- 【小熊刷题】Copy List with Random Pointer <可再复习思路>
- Chapter 1 OpenStack架构