如何在python上加载SVM中的SIFT特性?

如何在python上加载SVM中的SIFT特性?,python,opencv,numpy,scikit-learn,svm,Python,Opencv,Numpy,Scikit Learn,Svm,我正在编写以下代码,以便在python上进行SVM培训。 我拍摄了两张图片作为训练,并对另一张图片进行测试 代码如下:- import cv2 import numpy as np from sklearn.svm import SVC img = cv2.imread("1.png") img = cv2.resize(img, (600,400)) sift = cv2.xfeatures2d.SIFT_create() (kps1, descs1) = sift.detectAndCom

我正在编写以下代码,以便在python上进行SVM培训。 我拍摄了两张图片作为训练,并对另一张图片进行测试

代码如下:-

import cv2
import numpy as np
from sklearn.svm import SVC

img = cv2.imread("1.png")
img = cv2.resize(img, (600,400))
sift = cv2.xfeatures2d.SIFT_create()
(kps1, descs1) = sift.detectAndCompute(img, None)
hist1 = np.hstack(descs1)

img = cv2.imread("11.png")
img = cv2.resize(img, (600,400))
sift = cv2.xfeatures2d.SIFT_create()
(kps11, descs11) = sift.detectAndCompute(img, None)
hist11 = np.hstack(descs11)

s = np.array(hist1)
d = np.array(hist11)

X = np.array((s,d))
y = np.array([1,2])

img = cv2.imread("2.png")
gray = cv2.resize(img, (600,400))
sift = cv2.xfeatures2d.SIFT_create()
(kps2, descs2) = sift.detectAndCompute(gray, None)
hist2 = np.hstack(descs2) 
v = np.array(hist2)

clf = SVC()
clf.fit(X, y) 
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
    decision_function_shape=None, degree=3, gamma='auto', kernel='rbf',
    max_iter=-1, probability=False, random_state=None, shrinking=True,
    tol=0.001, verbose=False)
print(clf.predict(v)) 
我使用SIFT的descs作为SVM的输入 它给出了以下错误:-

/usr/lib/python2.7/dist-packages/sklearn/utils/validation.py:386: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and willraise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample.
  DeprecationWarning)
Traceback (most recent call last):
  File "ex.py", line 37, in <module>
    print(clf.predict(v))
  File "/usr/lib/python2.7/dist-packages/sklearn/svm/base.py", line 568, in predict
    y = super(BaseSVC, self).predict(X)
  File "/usr/lib/python2.7/dist-packages/sklearn/svm/base.py", line 305, in predict
    X = self._validate_for_predict(X)
  File "/usr/lib/python2.7/dist-packages/sklearn/svm/base.py", line 474, in _validate_for_predict
    (n_features, self.shape_fit_[1]))
ValueError: X.shape[1] = 26112 should be equal to 35456, the number of features at training time
/usr/lib/python2.7/dist-packages/sklearn/utils/validation.py:386:DeprecationWarning:在0.17中不推荐将1d数组作为数据传递,在0.19中会引发ValueError。如果数据具有单个特征,请使用X.restrape(-1,1),如果数据包含单个样本,请使用X.restrape(1,-1)重塑数据。
弃用警告)
回溯(最近一次呼叫最后一次):
文件“ex.py”,第37行,在
打印(clf.预测(v))
文件“/usr/lib/python2.7/dist packages/sklearn/svm/base.py”,第568行,在predict中
y=super(BaseSVC,self)。预测(X)
文件“/usr/lib/python2.7/dist packages/sklearn/svm/base.py”,第305行,在predict中
X=自我验证,用于预测(X)
文件“/usr/lib/python2.7/dist packages/sklearn/svm/base.py”,第474行,在“验证”中,用于“预测”
(n_特征,自形_拟合[1]))
ValueError:X.shape[1]=26112应等于35456,即训练时的特征数

打印
X
v
的形状。第一个和第二个尺寸应相同(特征数量)。您确定
sift.detectAndCompute
总是为每个图像计算相同数量的描述符吗。如果没有,那么您可能需要首先纠正这个问题。我很确定
X
v
(或两者)都被转置了。在scikit中,学习行(
shape[0]
)表示训练样本,而列(
shape[1]
)表示功能。特征的数量必须是恒定的,这就是错误所抱怨的。另外,根据你的
y
你只有两个训练示例,我不知道你希望用它实现什么:S Try
X=np.row\u stack([S,d])