2011-12-31 55 views
10

所以我有一個矩陣與我的樣本圖像(全部變成矢量),它是通過PCA/LDA運行的,並且是一個表示每個圖像屬於哪一類的向量。現在我想使用OpenCV SVM類來訓練我的SVM(我正在使用Python,OpenCV 2.3.1)。但是我有一個定義的參數有問題:Python OpenCV支持向量機實現

test = cv2.SVM() 
test.train(trainData, responses, ????) 

我被困在如何定義SVM(線性等)和其他的東西的類型。在C++中,你可以通過聲明來定義它:svm_type = CvSVM :: C_SVC ... Python沒有。 C++也有一個特殊的類來存儲這些參數 - > CvSVMParams。有人可以給我一個Python的例子嗎?像定義SVM類型,伽瑪等

2.3.1文檔說,它是這樣的:

Python: cv2.SVM.train(trainData, responses[, varIdx[, sampleIdx[, params]]]) → retval 

什麼是varIdx和sampleIdx,以及如何定義的PARAMS?

+1

我正在閱讀文檔,但與此同時,您可以使用替代解決方案:將您的矩陣轉換爲numpy並使用sk-learn進行機器學習任務。 – timgluz 2012-01-01 00:23:16

+0

嗨!試試這些例子:https://code.ros.org/svn/opencv/trunk/opencv/samples/python2/letter_recog.py – timgluz 2012-01-01 00:59:07

+0

timgluz THX這正是我在找的東西......你能否複製SVM部分在答案中的鏈接,我可以接受它(以便其他人可以立即找到答案,你得到信用)... SVM部分是從79行到91 ... – Veles 2012-01-01 10:41:18

回答

18

要使用OpenCV的機器學習算法,你必須寫一些包裝類:

1.首先父類

class StatModel(object): 
    '''parent class - starting point to add abstraction'''  
    def load(self, fn): 
     self.model.load(fn) 
    def save(self, fn): 
     self.model.save(fn) 

2.最後SVM包裝:

class SVM(StatModel): 
    '''wrapper for OpenCV SimpleVectorMachine algorithm''' 
    def __init__(self): 
     self.model = cv2.SVM() 

    def train(self, samples, responses): 
     #setting algorithm parameters 
     params = dict(kernel_type = cv2.SVM_LINEAR, 
         svm_type = cv2.SVM_C_SVC, 
         C = 1) 
     self.model.train(samples, responses, params = params) 

    def predict(self, samples): 
     return np.float32([self.model.predict(s) for s in samples]) 

3.例子用法:

import numpy as np 
import cv2 

samples = np.array(np.random.random((4,2)), dtype = np.float32) 
y_train = np.array([1.,0.,0.,1.], dtype = np.float32) 

clf = SVM() 
clf.train(samples, y_train) 
y_val = clf.predict(samples) 

設置參數

設置參數很簡單 - 只寫保存的參數作爲鍵的字典。你應該看看原始文件來查看所有可能的參數和允許值:http://opencv.itseez.com/modules/ml/doc/support_vector_machines.html#cvsvmparams

是的,對於svm_type和kernel_type可能的值是在C++中,但有簡單的方法,這些常量轉換成Python表示,例如CvSVM :: C_SVC在Python中被編寫爲cv2.SVM_C_SVC。

前奏 要獲得機器學習算法的詳細包裝,看看letter-recog.py例如在OpenCV的例子在磁盤或存儲庫的OpenCV開放網址:https://github.com/Itseez/opencv/tree/master/samples/python2

+0

這看起來很有希望。我已在ros註冊。組織,但是當我輸入我的名字和密碼鏈接到python樣本時,我得到這個對話框,並且無法越過它。 「要查看此頁面,您必須在code.ros.org:443上登錄到此區域:」此svn區域是否有特殊名稱/密碼,超出我自己的範圍? – zerowords 2012-11-12 15:29:07

+0

嗨!可悲的是,他們取消了該存儲庫的公共視圖。我會很快發佈一些解決方法。 – timgluz 2012-11-13 08:57:23

+0

此代碼僅適用於OpenCV 2.在OpenCV 3中,SVM函數已從cv2移至cv2.ml,並創建該模型,新函數爲cv2.ml.SVM_create() – jpyams 2017-04-25 13:35:10

1

從timgluz版本改編,但使用「train_auto」而不是「train」。 cv2會爲我們找到參數「C」,「gamma」......。

import cv2 
import numpy as np 

class Learn: 
    def __init__(self, X, y): 
     self.est = cv2.SVM() 
     params = dict(kernel_type=cv2.SVM_LINEAR, svm_type=cv2.SVM_C_SVC) 
     self.est.train_auto(X, y, None, None, params, 3) #kfold=3 (default: 10) 

    def guess(self, X): 
     return np.float32([self.est.predict(s) for s in X]) 

X = np.array(np.random.random((6,2)), dtype = np.float32) 
y = np.array([1.,0.,0.,1.,0.,1.], dtype = np.float32) 
g = Learn(X,y).guess(X)