簡體   English   中英

Python OpenCV SVM實現

[英]Python OpenCV SVM implementation

所以我有一個矩陣,我的樣本圖像(都變成了矢量)通過PCA / LDA運行,並且一個矢量表示每個圖像所屬的類。 現在我想使用OpenCV SVM類來訓練我的SVM(我正在使用Python,OpenCV 2.3.1)。 但我在定義參數時遇到問題:

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

我堅持如何定義SVM的類型(線性等)和其他東西。 在C ++中,您可以通過以下方式定義它:svm_type = CvSVM :: C_SVC ... Python沒有。 C ++還有一個特殊的類來存儲這些參數 - > CvSVMParams。 有人能用Python給我一個例子嗎? 比如定義SVM類型,gamma等。

2.3.1文檔說它是這樣的:

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

什么是varIdx和sampleIdx,以及如何定義參數?

要使用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的庫的打開URL您的OpenCV的例子: https://github.com/Itseez/opencv/tree/master/samples/python2

改編自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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM