OpenCV學習筆記(二十六)——小試SVM演算法ml
總感覺自己停留在碼農的初級階段,要想更上一層,就得靜下心來,好好研究一下演算法的東西。OpenCV作為一個計算機視覺的開源庫,肯定不會只停留在數字影象處理的初級階段,我也得加油,深入研究它的演算法庫。就從ml入手吧,最近做東西遇到隨機森林,被搞的頭大,深深感覺自己肚子裡貨太少,關鍵時刻調不出東西來。切勿浮躁,一點點研究吧。
這次就先介紹一下機器學習中的一個常用演算法SVM演算法,即支援向量機Support Vector Machine(SVM),是一種有監督學習方法,更多介紹請見維基百科http://zh.wikipedia.org/wiki/SVM。
OpenCV開發SVM演算法是基於LibSVM軟體包開發的,LibSVM是臺灣大學林智仁(Lin Chih-Jen)等開發設計的一個簡單、易於使用和快速有效的SVM模式識別與迴歸的軟體包。用OpenCV使用SVM演算法的大概流程是
1)設定訓練樣本集
需要兩組資料,一組是資料的類別,一組是資料的向量資訊。
2)設定SVM引數
利用CvSVMParams類實現類內的成員變數svm_type表示SVM型別:
CvSVM::C_SVC C-SVC
CvSVM::NU_SVCv-SVC
CvSVM::ONE_CLASS一類SVM
CvSVM::EPS_SVRe-SVR
CvSVM::NU_SVRv-SVR
成員變數kernel_type表示核函式的型別:
CvSVM::LINEAR線性:u‘v
CvSVM::POLY多項式:(r*u'v + coef0)^degree
CvSVM::RBFRBF函式:exp(-r|u-v|^2)
CvSVM::SIGMOIDsigmoid函式:tanh(r*u'v + coef0)
成員變數degree針對多項式核函式degree的設定,gamma針對多項式/rbf/sigmoid核函式的設定,coef0針對多項式/sigmoid核函式的設定,Cvalue為損失函式,在C-SVC、e-SVR、v-SVR中有效,nu設定v-SVC、一類SVM和v-SVR引數,p為設定e-SVR中損失函式的值,class_weightsC_SVC的權重,term_crit為SVM訓練過程的終止條件。其中預設值degree = 0,gamma = 1,coef0 = 0,Cvalue = 1,nu = 0,p = 0,class_weights = 0
3)訓練SVM
呼叫CvSVM::train函式建立SVM模型,第一個引數為訓練資料,第二個引數為分類結果,最後一個引數即CvSVMParams
4)用這個SVM進行分類
呼叫函式CvSVM::predict實現分類
5)獲得支援向量
除了分類,也可以得到SVM的支援向量,呼叫函式CvSVM::get_support_vector_count獲得支援向量的個數,CvSVM::get_support_vector獲得對應的索引編號的支援向量。
實現程式碼如下:
// step 1:
float labels[4] = {1.0, -1.0, -1.0, -1.0};
Mat labelsMat(3, 1, CV_32FC1, labels);
float trainingData[4][2] = { {501, 10}, {255, 10}, {501, 255}, {10, 501} };
Mat trainingDataMat(3, 2, CV_32FC1, trainingData);
// step 2:
CvSVMParams params;
params.svm_type = CvSVM::C_SVC;
params.kernel_type = CvSVM::LINEAR;
params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);
// step 3:
CvSVM SVM;
SVM.train(trainingDataMat, labelsMat, Mat(), Mat(), params);
// step 4:
Vec3b green(0, 255, 0), blue(255, 0, 0);
for (int i=0; i<image.rows; i++)
{
for (int j=0; j<image.cols; j++)
{
Mat sampleMat = (Mat_<float>(1,2) << i,j);
float response = SVM.predict(sampleMat);
if (fabs(response-1.0) < 0.0001)
{
image.at<Vec3b>(j, i) = green;
}
else if (fabs(response+1.0) < 0.001)
{
image.at<Vec3b>(j, i) = blue;
}
}
}
// step 5:
int c = SVM.get_support_vector_count();
for (int i=0; i<c; i++)
{
const float* v = SVM.get_support_vector(i);
}
相關推薦
OpenCV學習筆記(二十六)——小試SVM演算法ml OpenCV學習筆記(二十七)——基於級聯分類器的目標檢測objdect OpenCV學習筆記(二十八)——光流法對運動目標跟蹤Video Ope
OpenCV學習筆記(二十六)——小試SVM演算法ml 總感覺自己停留在碼農的初級階段,要想更上一層,就得靜下心來,好好研究一下演算法的東西。OpenCV作為一個計算機視覺的開源庫,肯定不會只停留在數字影象處理的初級階段,我也得加油,深入研究它的演算法庫。就從ml入手
OpenCV學習筆記(二十六)——小試SVM演算法ml
總感覺自己停留在碼農的初級階段,要想更上一層,就得靜下心來,好好研究一下演算法的東西。OpenCV作為一個計算機視覺的開源庫,肯定不會只停留在數字影象處理的初級階段,我也得加油,深入研究它的演算法庫。就從ml入手吧,最近做東西遇到隨機森林,被搞的頭大,深深感覺自己肚子裡貨太
Linux學習筆記(二十六)grep
grepgrepgrep [-cinvABC] ‘word‘ filename -c 行數-i 不區分大小寫-n 顯示行號-v 取反-r 遍歷所有子目錄-A 後面跟數字,過濾出符合要求的行以及下面n行-B 同上,過濾出符合要求的行以及上面n行-C 同上,同時過濾出符合要求的行以及上下各n行 mkdir /tm
Effective_STL 學習筆記(二十六) 儘量使用 iterator 代替 const_iterator,reverse_iterator和const_reverse_iterator
每個標準容器類都提供四種迭代器型別,對於container<T>而言: 1 iterator // 的作用相當於T*, 2 const_iterator // 相當於 const T*(也可 T const*) 3
Django學習筆記(二十六):閱讀計數和優化計數(防重新整理)
閱讀計數主要就是記錄網頁被瀏覽的次數,防刷的方法就是記錄瀏覽的cookie,使每個cookie只能增加一次閱讀數, 當然,刪除cookie和關閉瀏覽器就可以重新增加閱讀數,更加優化的方法還在學習中,先分享這個我會的 models.py的程式碼 class Books(m
小白的資料結構與演算法學習筆記(二十六)----廣義表
一、廣義表的概述 首先回憶一下原子型別和結構型別,簡單說來,原子型別就是不可再分的型別,結構型別就是可以再分的型別。我們前面講的線性表要求每個元素都是原子型別,而廣義表作為線性表的推廣,它的元素可以是原子型別,也可以是個表。元素是原子型別,叫原子結點;元素是表,叫表結點。
OpenCV學習筆記(三十六)——Kalman濾波做運動目標跟蹤
kalman濾波大家都很熟悉,其基本思想就是先不考慮輸入訊號和觀測噪聲的影響,得到狀態變數和輸出訊號的估計值,再用輸出訊號的估計誤差加權後校正狀態變數的估計值,使狀態變數估計誤差的均方差最小。具體它的原理和實現,我想也不用我在這裡費口舌,但這個理論基礎必須的有,必須得知道想
python OpenCV學習筆記(二十五):傅立葉變換(Fourier Transform )
傅立葉變換用於分析各種濾波器的頻率特性。對於影象,二維離散傅立葉變換(2D Discrete Fourier Transform/DFT)用於尋找頻域。快速傅立葉變換(Fast Fourier Transform/FFT)的快速演算法用於計算DFT。
OpenCV學習筆記(二十一)——簡單的單目視覺測距嘗試
前言: 視覺測距作為機器視覺領域內基礎技術之一而受到廣泛的關注,其在機器人領域內佔有重要的地位,廣泛應用於機器視覺定位、目標跟蹤、視覺避障等。機器視覺測量主要分為:單目視覺測量、雙目視覺測量、結構光視覺測量等。結構光由於光源的限制,應用的場合比較固定;
OpenCV學習筆記(二十五)——OpenCV圖形介面設計Qt+VS2008
一直對MFC對OpenCV的支援不好而耿耿於懷,瞭解了Qt對OpenCV支援很好,但網上這方面的資料很少。大部分的圖形互動的設計都是基於OpenCV2.0之前的資料結構lpImage進行的。最近得到了一本好書《OpenCV 2 Computer Vision Applica
OpenCV學習筆記(二十一)——車輛識別和跟蹤
今天在GitHub上看到一個對車輛訓練好的模型,即xml檔案,於是拿來測試了一個效果。我用這個xml檔案對視訊中的每一幀畫面進行簡單的車輛識別定位,演示程式碼如下:import cv2 import numpy as np camera = cv2.VideoCa
python OpenCV學習筆記(二十七):Hough線變換
Hough變換是一種很流行的技術,可以檢測任何可以用數學的形式來表示的形狀。即使它被破壞或變形,它也能檢測出它的形狀。我們將會看到它是如何工作的。 一條線可以表示成y = mx + c或引數形式,像ρ=xcosθ+ysinθ,其中ρ是從原點到直線的垂直
tensorflow學習筆記(二十六):構建TF程式碼
如何構建TF程式碼 batch_size: batch的大小 mini_batch: 將訓練樣本以batch_size分組 epoch_size: 樣本分為幾個min_batch num_epoch : 訓練幾輪 讀程式碼的時候應該關注的幾部分
openCV學習筆記(二十) —— 影象濾波 —— 線性濾波(方框濾波、均值濾波、高斯濾波)
影象濾波簡介 方框濾波——boxFilter() 原理 方框濾波程式 #include<opencv2/opencv.hpp> #include <vector> #include <time.h> using
opencv學習筆記(二十)——形態學濾波
開運算 處理過程:先腐蝕後膨脹。 功能:用於消除小物體,在纖細點處分離物體,並且在平滑較大物體的邊界的同時不明顯改變其面積,同時抑制比結構元小的亮細節。 使用例項: #include<opencv2/opencv.hpp> void main
opencv學習筆記(二十)cvFilter2D()卷積以及卷積邊界的處理
20.1**cvFilter2D()卷積:** void cvFilter2D( const CvArr* src, CvArr* dst, const CvMat* kernel, CvPoint anchor=c
Python學習筆記(二十四)StringIO和BytesIO
nbsp from 寫入 enc print == world! byte 初始化 StringIO 很多時候,數據讀寫不一定是文件,也可以在內存中讀寫。 StringIO顧名思義就是在內存中讀寫str。 要把str寫入StringIO,我們需要先創建一個String
Python學習筆記(二十八)多線程
oop 模擬 筆記 標準庫 函數 只需要 pre 開始 print 摘抄自:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431928238187
Python學習筆記(二十一)
準備 for ring 價格 python use imp pri exce 使用ElementTree解析XML文件 # 導入Python中內置的處理XML文件的模塊try: import xml.etree.cElementTree as ETexcept Imp
Java學習筆記(二十一):類型轉換和instanceof關鍵字
方法 png true feed out 實例 strong 運算符 nbsp 基本數據類型轉換: 自動類型轉換:把大類型的數據賦值給大類型的變量(此時的大小指的是容量的範圍) 1 byte b = 12; //byte是一個字節 2 int i = b; //i