opencv SVM 使用
SVM是一種分類器,下面通過手寫0-9數字識別對其進行以下介紹。
1.首先準備訓練使用的手寫字型
如圖所示,將手寫字型分類放在不同的資料夾。
2.讀取圖片
//每種數字個數
const int count[10] = {5923,6742,5958,6131,5842,5421,5918,6265,5851,5949};
string filename = "shouxieziti/";
vector<Mat> imgin;
vector<int> number;
int sum = 0;
for(int i = 0; i < 10; i++){
string s;
stringstream ss;
ss<<i;
ss>>s;
for(int j = 1; j < count[i]+1; j++){
string s1;
stringstream ss1;
ss1<<j;
ss1>>s1;
if(j<10){
s1 = s+"_0000"+s1;
}else if(j < 100){
s1 = s+"_000"+s1;
}else if(j < 1000){
s1 = s+"_00"+s1;
}else{
s1 = s+"_0"+s1;
}
string in = filename + s + "/" + s1 +".jpg";
Mat img = imread(in,IMREAD_GRAYSCALE);
// imshow(in,img);
imgin.push_back(img);
number.push_back(i);
cout<<in<<" ok"<<" "<<img.channels()<<" "<<number[sum + j - 1]<<" "<<sum<<endl;
}
sum += count[i];
}
cout<<imgin.size()<<" "<<imgin[0].size()<<"have been read"<<endl;
圖片資訊的讀取由自己的儲存方式進行。
3.生成opencv中SVM需要的形式
Mat imgtrain((int)imgin.size(), 28*28, CV_32FC1);
Mat imglabel((int)imgin.size(), 1, CV_32SC1);
// cout<<imgtrain.channels()<<" "<<imglabel.channels()<<endl;
cout<<"creat train data..."<<endl;
for(int i = 0; i < (int)imgin.size(); i++){
Mat_<float>::iterator trainbegin = imgtrain.begin<float>() + 28*28*i;
Mat_<int>::iterator labelbegin = imglabel.begin<int>();
Mat_<uchar>::iterator inbegin = imgin[i].begin<uchar>();
for(int j = 0; j < 28*28; j++){
float data = (float)*(inbegin+j);
*(trainbegin+j) = (data+0.0)/255.0;
// if(data > 200){
// cout<<*(trainbegin+j)<<" "<<*(labelbegin+j);
// }
}
*(labelbegin+i) = number[i];
cout<<*(labelbegin+i)<<" ";
}
其中訓練資料是CV_32FC1型別;label資料是CV_32SC1型別。
另外,需要將資料進行歸一化,因為讀取的是灰度圖0-255範圍之內,所以我們將每個資料除以255就可以得到0-1之間的資料。
4.利用SVM進行訓練
//設定SVM引數
Ptr<ml::SVM> svm = ml::SVM::create();
svm->setType(ml::SVM::C_SVC);
svm->setKernel(ml::SVM::RBF);
svm->setGamma(0.01);
svm->setC(10.0);
svm->setTermCriteria(TermCriteria(CV_TERMCRIT_ITER, 1000,FLT_EPSILON));
//進行訓練
cout<<"trainning..."<<endl;
bool f = svm->train(imgtrain,ml::ROW_SAMPLE,imglabel);
// Ptr<ml::TrainData> traindata = ml::TrainData::create(imgtrain,ml::ROW_SAMPLE,imglabel);
// bool f = svm->trainAuto(traindata, 10);
// cout<<f<<endl;
//儲存訓練好的資料
cout<<"saving..."<<endl;
svm->save("train1.xml");
cout<<"save done..."<<endl;
5.讀取生成的train1.xml進行預測
Ptr<ml::SVM> svm = ml::StatModel::load<ml::SVM>("train1.xml");
cout<<"predicting..."<<endl;
vector<float> result;
int right = 0, wrong = 0;
Mat_<int>::iterator labelbegin = imglabel.begin<int>();
for(int i = 0; i < (int)imgtrain.rows; i++){
Mat sample = imgtrain.row(i);
result.push_back(svm->predict(sample));
cout<<result[i]<<endl;
if(abs(result[i] - *(labelbegin+i)) < 0.001){
right++;
}else{
wrong++;
}
}
cout<<"predict done... "<<right<<" right "<<wrong<<" wrong"<<endl;
cout<<"right rate "<<(float)right/(float)(right+wrong)<<endl;
cout<<"wrong rate "<<(float)wrong/(float)(right+wrong)<<endl;
6.通過訓練60000個樣本,能實現非常高的正確率。下圖是識別了10000個測試資料的結果
7.補充
學習過程中主要參考瞭如下連結:
https://www.cnblogs.com/cheermyang/p/5624333.html
手寫字型是由mnist手寫字型影像資料庫生成的,參考下列連結:
http://m.blog.csdn.net/fengbingchun/article/details/49611549
相關文章
- opencv SVM的使用OpenCV
- OpenCV中使用SVM簡介OpenCV
- opencv中SVMOpenCV
- opencv + SVM 程式碼OpenCV
- opencv SVM分類DemoOpenCV
- OpenCV進階---介紹SVMOpenCV
- OpenCV筆記(3)實現支援向量機(SVM)OpenCV筆記
- opencv python 基於SVM的手寫體識別OpenCVPython
- 【opencv3】 svm實現手寫體與人臉識別OpenCV
- OpenCL中的SVM使用案例
- OpenCV 基本使用OpenCV
- SVM
- 機器學習(3),opencv4.0中SVM各個引數的意義,設定機器學習OpenCV
- SVM-RFE使用及換kernal及estimator
- 使用vs2015+cmake編譯opencv+opencv_contrib編譯OpenCV
- SVM原理
- 在C#中使用OpenCV(使用OpenCVSharp)C#OpenCV
- 使用jupyter(IPython)開發opencvPythonOpenCV
- python中使用OpenCV畫線PythonOpenCV
- 如何在opencv下使用SIFTOpenCV
- 支援向量機(Support Vector Machine,SVM)—— 線性SVMMac
- SVM家族(一)
- Python機器學習筆記:SVM(1)——SVM概述Python機器學習筆記
- 使用 SVM 和決策樹進行整合學習
- 使用 OpenCV 進行文件矯正OpenCV
- 學習SVM(五)理解線性SVM的鬆弛因子
- 學習SVM(四) 理解SVM中的支援向量(Support Vector)
- Python機器學習筆記:SVM(3)——證明SVMPython機器學習筆記
- 支援向量機(SVM)
- 線性可分SVM
- Python機器學習筆記:SVM(2)——SVM核函式Python機器學習筆記函式
- OpenCV-android-sdk 配置以及使用(Java)OpenCVAndroidJava
- 使用opencv畫框,標出座標OpenCV
- python使用OpenCV設定圖片尺寸PythonOpenCV
- OpenCV使用ParallelLoopBody進行平行計算OpenCVParallelOOP
- 使用sklearn實現svm--用於機械故障分類
- 【Svm機器學習篇】Opencv3.4.1與C++實現對分類問題的訓練與預測】機器學習OpenCVC++
- SVM——支援向量機(完整)
- SVM_支援向量機