SVM分类器在OpenCV中的使用

2018-04-03  本文已影响0人  温素年

支持向量机(SVM)是通常由超平面定义的区别式分类器。也就是说,给定标记的训练数据(监督式学习),SVM 算法输出一个能够分类新样本的超平面。其核心的思想是找到给出的最大极小距离(margin)的超平面去训练样本。

我上机器学习课的时候学到过,了解一点,但是理解的不是很深入。这里偏向应用,所以公式之类的就不赘述了。直接看 OpenCV 的代码吧。

找资料的过程发现我用的是 OpenCV 3.0 的版本,但是网上的资料大多是 2.0 的版本,就很伤……

整个过程分为训练和利用训练好的模型进行分类这两个部分。

训练模型

训练模型的步骤及用到的主要函数如下:

(1)设置训练数据

在训练时,需要把训练数据存储为Mat类的float类型,示例代码如下:

// training data
int labels[4] = { 1, -1, -1, -1 };
float trainingData[4][2] = { {501, 10}, {255, 10}, {501, 255}, {10, 501} };
cv::Mat trainingDataMat(4, 2, CV_32FC1, trainingData);
cv::Mat labelsMat(4, 1, CV_32SC1, labels);

(2)设置 SVM 的参数

在 OpenCV 2.0 版本中,SVM 的参数存储在 CvSVMParams 类中,然后使用 CvSVM 类进行训练。

然而,在OpenCV 3.0 中,要直接对 SMV 设置参数。示例代码如下:

// initial SVM
cv::Ptr<cv::ml::SVM> svm = cv::ml::SVM::create();
svm->setType(cv::ml::SVM::Types::C_SVC);
svm->setKernel(cv::ml::SVM::KernelTypes::LINEAR);
svm->setTermCriteria(cv::TermCriteria(cv::TermCriteria::MAX_ITER, 100, 1e-6));

(3)训练 SVM 分类器

训练的过程就只有一句代码了:

// train operation
svm->train(trainingDataMat, cv::ml::SampleTypes::ROW_SAMPLE, labelsMat);

(4)储存 SVM 分类器

训练好 SVM 分类器后需要将它储存起来,在后续的代码中就可以利用它进行分类了。储存的代码也很简单:

// save svm
svm->save("mysvm.xml");

实现分类

(1)加载 SVM 分类器

把储存好的分类器加载出来。

Ptr<SVM> mysvm = StatModel::load<SVM>("mysvm.xml");

(2)预测分类结果

使用 predict 函数预测分类结果,函数原型如下。输入数据,返回预测结果。

CV_WRAP virtual float predict( InputArray samples, 
    OutputArray results=noArray(), int flags=0 ) const = 0;

总结

以上就是 OpenCV 中 SVM 分类器的使用方法,我只是把最基本的步骤和所致用的函数列了出来。可以看出使用 OpenCV 库函数来实现 SVM 分类器还是很简单的,不需要理解SVM的具体原理。

网上写 SVM 分类器的代码都很复杂,因为准备数据等等都是一个大工程,在我们使用的时候要根据具体情况自己写。不过最核心的部分就是以上啦!


参考:
http://www.coin163.com/it/2260012286132365332/svm-opencv
https://blog.csdn.net/chaipp0607/article/details/68067098
https://blog.csdn.net/xuan_zizizi/article/details/71102018

上一篇下一篇

猜你喜欢

热点阅读