【问题标题】:Python OpenCV SVM implementationPython OpenCV SVM 实现
【发布时间】:2012-01-31 01:17:01
【问题描述】:

所以我有一个矩阵,其中包含通过 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,参数如何定义?

【问题讨论】:

  • 我目前正在阅读文档,但与此同时,您可以使用替代解决方案:将矩阵转换为 numpy 并使用 sk-learn 进行机器学习任务。
  • timgluz THX 这正是我正在寻找的...您能否从答案中的链接中复制 SVM 部分,以便我接受它(以便其他人可以立即找到答案并u get credit)...SVM 部分是从第 79 行到第 91 行...

标签: python opencv classification svm


【解决方案1】:

要使用 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

【讨论】:

  • 这看起来很有希望。我已经在 ros.org 注册,但是当我输入我的姓名和密码以链接到 python 示例时,我得到了这个对话框并且无法通过它。 "要查看此页面,您必须在 code.ros.org:443 上登录此区域:"此 svn 区域是否有特殊名称/密码,超出我自己的?
  • 嗨!可悲的是,他们取消了该存储库的公开视图。我很快就会发布一些解决方法。
  • 此代码仅适用于 OpenCV 2。在 OpenCV 3 中,SVM 函数已从 cv2 移至 cv2.ml,为了创建模型,新函数为 cv2.ml.SVM_create()
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2013-02-08
    • 2015-06-03
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 2016-08-30
    • 1970-01-01
    • 2020-08-29
    相关资源
    最近更新 更多