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

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

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

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

时间: 2024-10-13 23:14:16

OpenCV的HOG+SVM训练程序注意事项的相关文章

利用opencv的hog+svm实现细胞识别分类器

利用opencv的hog+svm实现细胞识别分类器 图像处理中的细胞识别和人脸识别可以这样来类比,图像中的一张张人脸就是一个个细胞. 模式识别的关键在于样本库的选取,识别率也只能在和样本库比较接近的环境下才能保证.主要工作是三部分一是特征提取,二是样本库的训练train,三是目标检测detect. 一.特征提取 特征提取采用的是HOG特征即HOG描述子,该特征在行人检测中效果非常好.而一般人脸识别采用的是haar特征,这在opencv中都有实现,并都给出了相应的分类器,效果都很不错. 首先采集了

Hu矩SVM训练及检测-----OpenCV

关键词:Hu矩,SVM,OpenCV 在图像中进行目标物识别,涉及到特定区域内是否存在目标物,SVM可在样本量较少情况下对正负样本(图片中前景背景)做出良好区分,图片基本特征包括诸如HOG.LBP.HAAR等,在具体进行物体检测时考虑结合待检测物特点利用或设计新特征进行训练并分类.本文以几何不变矩为例说明OpenCV中SVM分类器的一般使用过程,下面依次简述Hu矩函数.SVM参数设置及实例演示. 1.Hu求解 double M[7];//Hu矩输出 Moments mo; //矩变量 src=i

SVM+HOG特征训练分类器

#1,概念 在机器学习领域,支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别.分类.以及回归分析. SVM的主要思想可以概括为两点:⑴它是针对线性可分情况进行分析,对于线性不可分的情况,通过使用非线性映射算法将低维输入空间线性不可分的样本转化为高维特征空间使其线性可分,从而 使得高维特征空间采用线性算法对样本的非线性特征进行线性分析成为可能: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是

如何用OpenCV自带的adaboost程序训练并检测目标

http://www.cnblogs.com/easymind223/archive/2012/07/03/2574826.html OpenCV自带的adaboost程序能够根据用户输入的正样本集与负样本集训练分类器,常用于人脸检测,行人检测等.它的默认特征采用了Haar,不支持其它特征. Adaboost的原理简述:(原文) 每个Haar特征对应看一个弱分类器,但并不是任伺一个Haar特征都能较好的描述人脸灰度分布的某一特点,如何从大量的Haar特征中挑选出最优的Haar特征并制作成分类器用

HOG + SVM(行人检测, opencv实现)

HOG+SVM流程 1.提取HOG特征 灰度化 + Gamma变换(进行根号求解) 计算梯度map(计算梯度) 图像划分成小的cell,统计每个cell梯度直方图 多个cell组成一个block, 特征归一化 多个block串接,并归一化 2.训练SVM分类器 原文地址:https://www.cnblogs.com/my-love-is-python/p/11110277.html

第十八节、基于传统图像处理的目标检测与识别(HOG+SVM附代码)

其实在深度学习分类中我们已经介绍了目标检测和目标识别的概念.为了照顾一些没有学过深度学习的童鞋,这里我重新说明一次:目标检测是用来确定图像上某个区域是否有我们要识别的对象,目标识别是用来判断图片上这个对象是什么.识别通常只处理已经检测到对象的区域,例如,人们总是会使在已有的人脸图像的区域去识别人脸. 传统的目标检测方法与识别不同于深度学习方法,后者主要利用神经网络来实现分类和回归问题.在这里我们主要介绍如何利用OpecnCv来实现传统目标检测和识别,在计算机视觉中有很多目标检测和识别的技术,这里

opencv中的SVM图像分类(二)

opencv中的SVM图像分类(二) 标签: svm图像 2015-07-30 08:45 8296人阅读 评论(35) 收藏 举报  分类: [opencv应用](5)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 原创作品 转载请注明出http://blog.csdn.net/always2015/article/details/47107129 上一篇博文对图像分类理论部分做了比较详细的讲解,这一篇主要是对图像分类代码的实现进行分析.理论部分我们谈到了使用BOW

hog+svm+检测人(代替默认的参数)

#include <iostream>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/ml/ml.hpp>//#include <opencv2/gpu/gpu.hpp>#include <fstream>#include <iomanip> #include "opencv2/imgp

OpenCV 中使用SVM

分类器 分类器是一种计算机程序. 他的设计目标是在通过学习后,可自动将数据分到已知类别. 平面线性分类器 一个简单的分类问题,如图有一些圆圈和一些正方形,如何找一条最优的直线将他们分开? 我们可以找到很多种方法画出这条直线,但怎样的直线才是最优的呢? 距离样本太近的直线不是最优的,因为这样的直线对噪声敏感度高,泛化性较差. 因此我们的目标是找到一条直线,离最近的点距离最远. 怎么寻找距离最远的直线?枚举所有直线,然后计算其样本最小距离?这样显然不是一个好办法,这将产生大量的计算开销. 我们利用另