opencv3.1线性可分svm例子及函数分析

摘要:
Vec3b表示三通道的赋值类型。构造函数的参数:svm_type:指定SVM的类型(5种):SVM::C_SVC:C类支持向量分类机。n类分组(n≥2),允许用异常值惩罚因子C进行不完全分类。n类似然不完全分类的分类器。异常值惩罚因子C被采用。coef0:内核函数的参数coef0。所以这些权重影响不同类别的错误分类惩罚项。

https://www.cnblogs.com/qinguoyi/p/7272218.html

//摘自:http://docs.opencv.org/2.4/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/ml/ml.hpp> #include <iostream> using namespace cv; using namespace cv::ml; int main() { // Data for visual representation int width = 512, height = 512; Mat image = Mat::zeros(height, width, CV_8UC3); // Set up training data int labels[4] = { 1, -1, -1, -1}; Mat labelsMat(4, 1, CV_32SC1, labels); //将labels转换成4行1列的32位单通道字符型阵列 float trainingData[4][2] = { { 501, 10 }, { 255, 10 }, { 501, 255 }, { 10, 501 } }; Mat trainingDataMat(4, 2, CV_32FC1, trainingData);//将训练数据转换成4行2列的32位单通道浮点型阵列 // Set up SVM's parameters Ptr<SVM> svm = SVM::create();//建立一个空的svm文件 svm->setType(SVM::Types::C_SVC); svm->setKernel(SVM::KernelTypes::LINEAR); svm->setTermCriteria (cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6));//SVM的迭代训练过程的中止条件 // Train the SVM svm->StatModel::train(trainingDataMat, SampleTypes::ROW_SAMPLE, labelsMat); Vec3b green(0, 255, 0), blue(255, 0, 0); // Show the decision regions given by the SVM for (int i = 0; i < image.rows; ++i) { for (int j = 0; j < image.cols; ++j) { Mat sampleMat = (Mat_<float>(1, 2) << j,i);//将每个i, j按照顺序输入进Mat float response = svm->predict(sampleMat); //std::cout << sampleMat << std::endl; //std::cout << response << std::endl; if (response == 1) image.at<Vec3b>(i,j) = green; else if (response == -1) image.at<Vec3b>(i,j) = blue; //std::cout << image.at<Vec3b>(i, j) << std::endl; } } imshow("SVM Simple Example", image); // show it to the user waitKey(0); std::cout << "done" << std::endl; }
复制代码

opencv3.1属于阉割版的opencv,很多以前的函数被改版,甚至删除掉,比如circle函数。

Mat初始化

Mat sampleMat = (Mat_<float>(1, 2) << j,i);是Mat的一种初始化方式,将每次循环的i,j输入进Mat,然后初始化。

.at<Vec3b>(i,j)

image.at<Vec3b>(i,j),.at(int y, int x)表示用来存取图像中对应坐标为(x, y)的元素坐标,<type>为类型。Vec3b表示三通道的赋值类型。

Vec3b green(0, 255, 0),也可以 Vec3b green;green[0]=0;green[1]=255;green[2]=0。

构造函数的参数(一共10个):
<1>svm_type:指定SVM的类型(5种):
  • SVM::C_SVC :C类支持向量分类机。n类分组(n≥2),允许用异常值惩罚因子C进行不完全分类。
  • SVM::NU_SVC :opencv3.1线性可分svm例子及函数分析第2张类支持向量分类机。n类似然不完全分类的分类器。参数为opencv3.1线性可分svm例子及函数分析第2张取代C(其值在区间【0,1】中,nu越大,决策边界越平滑)。
  • SVM::ONE_CLASS :单分类器,所有的训练数据提取自同一个类里,然后SVM建立了一个分界线以分割该类在特征空间中所占区域和其它类在特征空间中所占区域。
  • SVM::EPS_SVR :opencv3.1线性可分svm例子及函数分析第4张类支持向量回归机。训练集中的特征向量和拟合出来的超平面的距离需要小于p。异常值惩罚因子C被采用。
  • SVM::NU_SVR :opencv3.1线性可分svm例子及函数分析第2张类支持向量回归机。opencv3.1线性可分svm例子及函数分析第2张代替了p。

<2>kernel_type:SVM的内核类型(4种):

  • SVM::LINEAR :线性内核,没有任何向映射至高维空间,线性区分(或回归)在原始特征空间中被完成,这是最快的选择。
opencv3.1线性可分svm例子及函数分析第7张.
  • SVM::POLY :多项式内核:
opencv3.1线性可分svm例子及函数分析第8张.
  • SVM::RBF :基于径向的函数,对于大多数情况都是一个较好的选择:
opencv3.1线性可分svm例子及函数分析第9张.
  • SVM::SIGMOID :Sigmoid函数内核:
opencv3.1线性可分svm例子及函数分析第10张.
<3>degree:内核函数(POLY)的参数degree。
<4>gamma:内核函数(POLY/ RBF/ SIGMOID)的参数opencv3.1线性可分svm例子及函数分析第11张
<5>coef0:内核函数(POLY/ SIGMOID)的参数coef0。
<6>Cvalue:SVM类型(C_SVC/ EPS_SVR/ NU_SVR)的参数C。
<7>nu:SVM类型(NU_SVC/ ONE_CLASS/ NU_SVR)的参数opencv3.1线性可分svm例子及函数分析第2张
<8>p:SVM类型(EPS_SVR)的参数opencv3.1线性可分svm例子及函数分析第13张
<9>class_weights:C_SVC中的可选权重,赋给指定的类,乘以C以后变成opencv3.1线性可分svm例子及函数分析第14张。所以这些权重影响不同类别的错误分类惩罚项。权重越大,某一类别的误分类数据的惩罚项就越大。
<10>term_crit:SVM的迭代训练过程的中止条件,解决部分受约束二次最优问题。您可以指定的公差和/或最大迭代次数。

CvTermCriteria

迭代算法的终止准则

#defineCV_TERMCRIT_ITER1

#defineCV_TERMCRIT_NUMBERCV_TERMCRIT_ITER

#defineCV_TERMCRIT_EPS2

typedefstructCvTermCriteria{

inttype;/*CV_TERMCRIT_ITER和CV_TERMCRIT_EPS二值之一,或者二者的组合*/

intmax_iter;/*最大迭代次数*/

doubleepsilon;/*结果的精确性*/

}

CvTermCriteria;

/*构造函数*/

inlineCvTermCriteriacvTermCriteria(inttype,intmax_iter,doubleepsilon);

PS:OpenCV2.x的版本中,SVM还有Parameters参数,更新到3.x版本后就取消了,改为如下图的set函数:
 svm->setType(SVM::Types::C_SVC);
 svm->setKernel(SVM::KernelTypes::LINEAR);
 svm->setTermCriteria (cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6));//100是迭代次数,1e-6是精确度。
上面的3-9都是有使用条件的,比如LINEAR为内核的时候,3-9都是不需要的,设置完如上代码后可以直接训练,也可以调用自动训练函数,那样的话其实意义不大:
svm->StatModel::train(trainingDataMat, SampleTypes::ROW_SAMPLE, labelsMat);
当我们选择另外三个内核的时候,需要对3-9分别进行设置,设置后可以进行直接训练:
复制代码
svm_ = cv::ml::SVM::create();
    svm_->setType(cv::ml::SVM::C_SVC);
    svm_->setKernel(cv::ml::SVM::RBF);
    svm_->setDegree(0.1);
    // 1.4 bug fix: old 1.4 ver gamma is 1  //1.4版本bug修复
    svm_->setGamma(1);
    svm_->setCoef0(0.1);
    svm_->setC(1);
    svm_->setNu(0.1);
    svm_->setP(0.1);
    svm_->setTermCriteria(cvTermCriteria(CV_TERMCRIT_ITER, 20000, 0.0001));
svm_->train(train_data);
复制代码
也可以进行自动训练trainAuto()函数
复制代码
Ptr<cv::ml::TrainData>tdata;    //将训练数据和标签整合成tdata
    tdata = TrainData::create(trainingDataMat, cv::ml::SampleTypes::ROW_SAMPLE, labelsMat);
    svm->trainAuto(tdata, 10,
        SVM::getDefaultGrid(SVM::C),
        SVM::getDefaultGrid(SVM::GAMMA),
        SVM::getDefaultGrid(SVM::P),
        SVM::getDefaultGrid(SVM::NU),
        SVM::getDefaultGrid(SVM::COEF),
        SVM::getDefaultGrid(SVM::DEGREE),
        true);
  • k_fold:交叉验证参数。训练集被分成k_fold的自子集。其中一个子集是用来测试模型,其他子集则成为训练集。所以,SVM算法复杂度是执行k_fold的次数。
  • *Grid:(6个)对应的SVM迭代网格参数。
  • balanced:如果是true则这是一个2类分类问题。这将会创建更多的平衡交叉验证子集。
复制代码

训练完成后保存txt或者xml文件:

svm->save("svm_image.xml");

OpenCV3.1中载入模型的语句:

//Ptr<SVM> svmp = SVM::create();
//svmp = SVM::load<SVM>("svm_image.xml"); Ptr<SVM> svmp = SVM::load<SVM>("svm_image.xml");

载入之后就可以进行预测了:

//返回的是预测数据距离决策面(超平面)的几何距离
float response = svmp->predict(sampleMat, noArray(), StatModel::Flags::RAW_OUTPUT);
//返回的是标签分类
float response = svmp->predict(sampleMat, noArray(), 0);
float response = svmp->predict(sampleMat);

免责声明:文章转载自《opencv3.1线性可分svm例子及函数分析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇BZOJ1021 [SHOI2008]循环的债务ScrollView的顶部下拉和底部上拉回弹效果下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

sklearn 之 单类支持向量机(One-Class SVM)

这里先列出 sklearn 官方给出的使用高斯核(RBF kernel) one class svm 实现二维数据的异常检测: #!/usr/bin/python # -*- coding:utf-8 -*- import numpy as np import matplotlib.pyplot as plt import matplotlib.font...

文本分类学习 (五) 机器学习SVM的前奏-特征提取(卡方检验续集)

前言: 上一篇比较详细的介绍了卡方检验和卡方分布。这篇我们就实际操刀,找到一些训练集,正所谓纸上得来终觉浅,绝知此事要躬行。然而我在躬行的时候,发现了卡方检验对于文本分类来说应该把公式再变形一般,那样就完美了。 目录:  文本分类学习(一)开篇  文本分类学习(二)文本表示  文本分类学习(三)特征权重(TF/IDF)和特征提取           ...

PCL行人检测

首先我们知道Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功,HOG+SVM进行行人检测的方法是法国研究人员Dalal在2005的CVPR上提出的,而如今虽然有很多行人检测算法不断提出,但基本都是以HOG+SVM的思路为主,那么PCL中也是利用这一思想来进行行人的检测, 总体思路: 1、提取正负样本hog特征 2、投入...

Halcon学习笔记之支持向量机(二)

例程:classify_halogen_bulbs.hdev 在Halcon中模式匹配最成熟最常用的方式该署支持向量机了,在本例程中展示了使用支持向量机对卤素灯的质量检测方法。通过这个案例,相信大家可以对支持向量机的使用有一个更加清晰的了解。在相当多的检测和识别的应用中,都可以使用相同的方法来解决分类问题。 图1. 卤素灯图像 大致原理: 一、准备阶段:...

spark算法实现——svm支持向量机

svm是一种分类算法,一般先分为两类,再向多类推广一生二,二生三,三生。。。 大致可分为: 线性可分支持向量机 硬间隔最大化hard margin maximization 硬间隔支持向量机 线性支持向量机 软间隔最大化soft margin maximization 软间隔支持向量机 非线性支持向量机 核函数kernel function...

支持向量机(SVM)(五)--软间隔

上一节讲线性SVM时,文末提到在线性可分的情况下,找到一个支持向量,可求得b 但是当出现下图实例时,一些异常点导致的线性不可分 针对这种情况SVM提出了软间隔(soft margin),相对于硬间隔来说,简单将线性SVM看做硬间隔。 回顾硬间隔时优化目标: min $frac{1}{2}left | w_{2} ight |_{2}^{2}$   $s....