支持向量機(jī)(SVM)是通常由超平面定義的區(qū)別式分類器定拟。也就是說倦淀,給定標(biāo)記的訓(xùn)練數(shù)據(jù)(監(jiān)督式學(xué)習(xí))哥牍,SVM 算法輸出一個(gè)能夠分類新樣本的超平面。其核心的思想是找到給出的最大極小距離(margin)的超平面去訓(xùn)練樣本抡谐。
我上機(jī)器學(xué)習(xí)課的時(shí)候?qū)W到過,了解一點(diǎn)桐猬,但是理解的不是很深入麦撵。這里偏向應(yīng)用,所以公式之類的就不贅述了溃肪。直接看 OpenCV 的代碼吧免胃。
找資料的過程發(fā)現(xiàn)我用的是 OpenCV 3.0 的版本,但是網(wǎng)上的資料大多是 2.0 的版本惫撰,就很傷……
整個(gè)過程分為訓(xùn)練和利用訓(xùn)練好的模型進(jìn)行分類這兩個(gè)部分羔沙。
訓(xùn)練模型
訓(xùn)練模型的步驟及用到的主要函數(shù)如下:
(1)設(shè)置訓(xùn)練數(shù)據(jù)
在訓(xùn)練時(shí),需要把訓(xùn)練數(shù)據(jù)存儲(chǔ)為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)設(shè)置 SVM 的參數(shù)
在 OpenCV 2.0 版本中扼雏,SVM 的參數(shù)存儲(chǔ)在 CvSVMParams 類中,然后使用 CvSVM 類進(jìn)行訓(xùn)練莉撇。
然而呢蛤,在OpenCV 3.0 中,要直接對(duì) SMV 設(shè)置參數(shù)棍郎。示例代碼如下:
// 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)訓(xùn)練 SVM 分類器
訓(xùn)練的過程就只有一句代碼了:
// train operation
svm->train(trainingDataMat, cv::ml::SampleTypes::ROW_SAMPLE, labelsMat);
(4)儲(chǔ)存 SVM 分類器
訓(xùn)練好 SVM 分類器后需要將它儲(chǔ)存起來其障,在后續(xù)的代碼中就可以利用它進(jìn)行分類了。儲(chǔ)存的代碼也很簡(jiǎn)單:
// save svm
svm->save("mysvm.xml");
實(shí)現(xiàn)分類
(1)加載 SVM 分類器
把儲(chǔ)存好的分類器加載出來涂佃。
Ptr<SVM> mysvm = StatModel::load<SVM>("mysvm.xml");
(2)預(yù)測(cè)分類結(jié)果
使用 predict 函數(shù)預(yù)測(cè)分類結(jié)果励翼,函數(shù)原型如下蜈敢。輸入數(shù)據(jù),返回預(yù)測(cè)結(jié)果汽抚。
CV_WRAP virtual float predict( InputArray samples,
OutputArray results=noArray(), int flags=0 ) const = 0;
總結(jié)
以上就是 OpenCV 中 SVM 分類器的使用方法抓狭,我只是把最基本的步驟和所致用的函數(shù)列了出來≡焖福可以看出使用 OpenCV 庫(kù)函數(shù)來實(shí)現(xiàn) SVM 分類器還是很簡(jiǎn)單的否过,不需要理解SVM的具體原理。
網(wǎng)上寫 SVM 分類器的代碼都很復(fù)雜惭蟋,因?yàn)闇?zhǔn)備數(shù)據(jù)等等都是一個(gè)大工程苗桂,在我們使用的時(shí)候要根據(jù)具體情況自己寫。不過最核心的部分就是以上啦告组!
參考:
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