这是多么奇怪的系统.我遇到了与此问题相同的问题: AttributeError:'module'对象没有属性'SVM_LINEAR' 但是我不能再向该问题添加任何问题或评论,所以我不得不问几乎相同的问题.无论如何,请帮助以下:
所以我只注意到CV-3.0.1有卡方和交叉核,而我以前的2.4.9没有,所以我升级了(gentoo btw).一切都在2.4.9中工作,我只是想要moar内核选择(并且交叉与我正在做的事情很好地说Yang et al 2009).
但是按照上面的说法对我来说并没有用.
除了我平时:
import cv2
Run Code Online (Sandbox Code Playgroud)
我试过添加:
import cv2.ml
Run Code Online (Sandbox Code Playgroud)
和/或
from cv2 import ml
Run Code Online (Sandbox Code Playgroud)
他们没有修复任何东西(我对python也不熟悉,所以不确定哪些是我的意思).
我的专栏:
svm = cv2.SVM()
Run Code Online (Sandbox Code Playgroud)
是导致问题的原因,我已经尝试将其更改为:
svm = cv2.ml.SVM()
Run Code Online (Sandbox Code Playgroud)
这并没有解决它,我得到的仍然是:
Traceback (most recent call last):
File "05traintestsift.py", line 12, in svm = cv2.SVM()
AttributeError: 'module' object has no attribute 'SVM'
Run Code Online (Sandbox Code Playgroud)
要么:
Traceback (most recent call last):
File "05traintestsift.py", line 12, in svm = cv2.ml.SVM()
AttributeError: 'module' object has no attribute 'SVM'
Run Code Online (Sandbox Code Playgroud)
当然有一些基本的方法可以让我的东西再次运作,我错过了吗?
nb:除了尝试新的内核类型之外的所有内容都是在半小时前在2.4.9中工作的,所以它纯粹是3.0.1-r2中的一些新语法发生了变化.
我还要注意他们在这里的文档中的例子:http://docs.opencv.org/3.1.0/dd/d3b/tutorial_py_svm_opencv.html也没有输入任何'.ml',所以即便如此没有更新(我从他们的例子btw的第48行复制了svm = cv2.SVM()语法).
我注意到,如果我只是删除该行,它会进一步通过代码,使用上一个问题中的.ml修复它接受我的参数:
svm_params = dict(kernel_type = cv2.ml.SVM_CHI2,svm_type = cv2.ml.SVM_C_SVC,C=7,gamma=3)
Run Code Online (Sandbox Code Playgroud)
但是当我去训练它时找不到svm:
svm.train(traindata,trainnames,params=svm_params)
Run Code Online (Sandbox Code Playgroud)
(显然是因为我还没有创建'svm'对象)
它应该是这样的:
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)
Run Code Online (Sandbox Code Playgroud)
小智 5
您提到的示例是旧版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()
Run Code Online (Sandbox Code Playgroud)