Python OpenCV SVM实现

时间:2011-12-31 11:37:43

标签: python opencv classification svm

所以我有一个矩阵,我的样本图像(都变成了矢量)通过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,以及如何定义参数?

2 个答案:

答案 0 :(得分: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。

<强>前奏 要获得更多机器学习算法的包装器,请查看磁盘上的opencv示例中的 letter-recog.py 示例或OpenCV存储库的打开URL:https://github.com/Itseez/opencv/tree/master/samples/python2

答案 1 :(得分: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)