我的Machine Learning_初章_opencv_SVM_範例執行不了問題解決

首先   我的開發環境為  vs2013    opencv2411

在opencv預設路徑中   存有   範例檔

我們要來研究   SVM  的範例












當執行時 會出現  一堆錯誤




























莫急 ~莫慌~ 莫害怕~

檢查兩個地方


第一.標頭有沒有引用到  ml.hpp

ml  就是  Machine Learning 之  縮寫

機器學習之模組(統計模型、分類演算法)

Ex:  Random trees 、  Neural Networks 、 Support Vector Machine 、 Boosting等等
























第二. 如果之前有參考到  這篇教學文

我與Kinect v2 的 第三天_利用opencv結合Kinect API 讀取深度影像(C++)

http://coolmandiary.blogspot.tw/2016/02/kinect-v2-opencvkinect-api-c.html


裡面有提到  opencv  的配置

在 第三步驟

在   連結器 -----> 輸入------->其他相依性   

在  kernel32  字眼前  加入  以下字串 

opencv_videostab2411d.lib;opencv_photo2411d.lib;opencv_objdetect2411d.lib;opencv_video2411d.lib;opencv_imgproc2411d.lib;opencv_core2411d.lib;opencv_highgui2411d.lib;opencv_ml2411d.lib」




我們少加了   ml 喔!!!!!


經過上述兩個檢查  和修正

就可以  秀出  範例 程式執行結果

























分析  代碼

Step1// Data for visual representation
用Mat宣告一個存取 可視化數據的矩陣

這裡如果用預設  寬 = 512 高 = 512  會有跑不完的0出現喔

在此先縮小觀察

可以印出來看  陣列目前狀態

















Step1中   Mat  是使用此格式

Mat( 橫列(高度) , 直行(寬度) , CV_[位元數][有無符號]C[通道數] );



======================================================================
Step2. // Set up training data
建立訓練樣本


函數CvSVM::train要求訓練數據儲存於float類型的Mat結構中,
因此我們定義了以下矩陣






























float labels[4] = { 1.0, -1.0, -1.0, -1.0 };
Mat labelsMat(4, 1, CV_32FC1, labels);
//// 建立一個一維矩陣,大小為 4,型態為單通道 float 浮點數


float trainingData[4][2] = { { 501, 10 }, { 255, 10 }, { 501, 255 }, { 10, 501 } };
Mat trainingDataMat(4, 2, CV_32FC1, trainingData);
//// 建立一個二維矩陣,大小為 8,型態為單通道 float 浮點數



C++:

bool CvSVM::train(const CvMat* trainData,
                                const CvMat* responses,
                                const CvMat* varIdx=0,
                                const CvMat* sampleIdx=0,
                                CvSVMParams params=CvSVMParams()
                                )
======================================================================





Step3. // Set up SVM's parameters
設置SVM參數

此範例是以
「可線性分割」分兩類訓練樣本
簡單說明SVM的基本原理











C++:
CvSVMParams:: CvSVMParams ( int  svm_type ,          //SVM類型
                                                         int  kernel_type ,     //SVM核類型
                                                         double  degree ,
                                                         double  gamma ,
                                                         double  coef0 ,
                                                         double  Cvalue ,
                                                         double  nu ,
                                                         double  p ,
                                                         CvMat*  class_weights ,
                                                         CvTermCriteria  term_crit  //算法終止條件
                                                        )

這裡參數選擇

svm_type -->選擇了CvSVM::C_SVC類型(最常被使用的SVM類型)

該類型可以用於n-類分類問題(n 大於等於 2)。

這個參數定義在CvSVMParams.svm_type屬性中





kernel_type -->選擇了CvSVM::LINEAR表示不需要進行映射
核函數的目的是為了將訓練樣本映射到更有利於可線性分割的樣本集。
映射的結果是增加了樣本向量的維度,這一過程通過核函數完成。

這個參數定義在CvSVMParams.kernel_type屬性中




term_crit
 SVM訓練的過程就是一個通過迭代方式解決約束條件下的二次優化問題,
這裡我們指定一個最大迭代次數和容許誤差,以允許算法在適當的條件下停止計算。








留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

Architecture(架構) 和 Framework(框架) 有何不同?_軟體設計前的事前規劃的藍圖概念

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header