1. 程式人生 > >OpenCV學習筆記(二十六)——小試SVM演算法ml

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