我的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訓練的過程就是一個通過迭代方式解決約束條件下的二次優化問題,
這裡我們指定一個最大迭代次數和容許誤差,以允許算法在適當的條件下停止計算。
在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訓練的過程就是一個通過迭代方式解決約束條件下的二次優化問題,
這裡我們指定一個最大迭代次數和容許誤差,以允許算法在適當的條件下停止計算。
留言
張貼留言