【问题标题】:creating svm with OpenCV-3.0.1 / python 2.7使用 OpenCV-3.0.1 / python 2.7 创建 svm
【发布时间】:2016-08-30 13:09:59
【问题描述】:

这是一个多么奇怪的系统。我在这里遇到了与此问题相同的问题: AttributeError: 'module' object has no attribute 'SVM_LINEAR' 但是我不能再向那个问题添加任何问题或 cmets,所以我不得不问几乎相同的问题。 无论如何,请帮助解决以下问题:

所以我刚刚注意到 CV-3.0.1 有卡方和交集内核,而我之前的 2.4.9 没有,所以我升级了(gentoo btw)。一切都在 2.4.9 中工作,我只想要 moar 内核选择(并且相交与我所做的 Yang et al 2009 说的效果很好)。

但是按照上面的方法对我没有用。

除了我平时:

import cv2

我已经尝试添加:

import cv2.ml

和/或

from cv2 import ml

他们不解决任何问题(我对 python 也很陌生,所以不确定我打算使用哪个)。

我的台词:

svm = cv2.SVM()

是什么导致了问题,我已经尝试将其更改为:

svm = cv2.ml.SVM()

这并不能解决问题,我得到的只是:

Traceback (most recent call last):
File "05traintestsift.py", line 12, in svm = cv2.SVM()
AttributeError: 'module' object has no attribute 'SVM'

或:

Traceback (most recent call last):
File "05traintestsift.py", line 12, in svm = cv2.ml.SVM()
AttributeError: 'module' object has no attribute 'SVM'

肯定有一些基本的方法可以让我缺少的东西再次工作吗?

nb:除了尝试新的内核类型之外的一切都在半小时前的 2.4.9 中工作,所以只是 3.0.1-r2 中的一些新语法发生了变化。

我还会注意到他们在此处的文档中的示例:http://docs.opencv.org/3.1.0/dd/d3b/tutorial_py_svm_opencv.html 也没有放入任何“.ml”,所以即使这样也没有更新(我复制了 svm = cv2.SVM()顺便说一句,他们示例的第 48 行的语法)。

我注意到,如果我只是删除该行,它会进一步了解代码,使用上一个问题中的 .ml 修复程序,它可以很好地接受我的参数:

svm_params = dict(kernel_type = cv2.ml.SVM_CHI2,svm_type = cv2.ml.SVM_C_SVC,C=7,gamma=3)

但是当我去训练时它找不到 svm:

svm.train(traindata,trainnames,params=svm_params)

(显然是因为我还没有创建 'svm' 对象)

【问题讨论】:

    标签: python opencv


    【解决方案1】:

    应该是这样的:

    trainingDataMat = np.array(*train_data*, np.float32)
    labelsMat = np.array([*label_data*], np.int32)
    
    svm = cv2.ml.SVM_create()
    svm.setType(cv2.ml.SVM_C_SVC)
    svm.setKernel(cv2.ml.SVM_LINEAR)
    # svm.setDegree(0.0)
    # svm.setGamma(0.0)
    # svm.setCoef0(0.0)
    # svm.setC(0)
    # svm.setNu(0.0)
    # svm.setP(0.0)
    # svm.setClassWeights(None)
    svm.setTermCriteria((cv2.TERM_CRITERIA_COUNT, 100, 1.e-06))
    svm.train(trainingDataMat, cv2.ml.ROW_SAMPLE, labelsMat)
    
    sample_data = np.array([*your_data*], np.float32)
    response = svm.predict(sample_data)
    

    【讨论】:

      【解决方案2】:

      您提到的示例适用于旧版本的 OpenCV。

      你可以在 opencv/sources/samples/python 中找到新的例子和很好的解释

      在新的 OpenCV 中,您应该如下使用 SVM:

      #SVM in OpenCV 3.1.0 for Python
      SVM = cv2.ml.SVM_create()
      SVM.setKernel(cv2.ml.SVM_LINEAR)
      SVM.setP(0.2)
      SVM.setType(cv2.ml.SVM_EPS_SVR)
      SVM.setC(1.0)
      
      #training
      SVM.train_auto(samples, cv2.ml.ROW_SAMPLE, responses)
      
      #predict
      output = SVM.predict(samples)[1].ravel()
      

      【讨论】:

        猜你喜欢
        • 2012-01-31
        • 2018-02-11
        • 2015-06-03
        • 2016-07-17
        • 2016-09-08
        • 2010-10-16
        • 2014-02-11
        • 1970-01-01
        • 2018-04-17
        相关资源
        最近更新 更多