2011-12-31 56 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)