支持向量机(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
网友评论