Scikit-learn SVM数字识别

VIC*_*TOR 5 python image image-processing scikit-learn

我想制作一个程序来识别图像中的数字.我按照scikit中的教程学习.

我可以训练和适应svm分类器,如下所示.

首先,我导入库和数据集

from sklearn import datasets, svm, metrics

digits = datasets.load_digits()
n_samples = len(digits.images)
data = digits.images.reshape((n_samples, -1))
Run Code Online (Sandbox Code Playgroud)

其次,我创建了SVM模型并使用数据集对其进行训练.

classifier = svm.SVC(gamma = 0.001)
classifier.fit(data[:n_samples], digits.target[:n_samples])
Run Code Online (Sandbox Code Playgroud)

然后,我尝试阅读自己的图像并使用该功能predict()识别数字.

这是我的形象: 在此输入图像描述

我将图像重塑为(8,8),然后将其转换为1D阵列.

img = misc.imread("w1.jpg")
img = misc.imresize(img, (8, 8))
img = img[:, :, 0]
Run Code Online (Sandbox Code Playgroud)

最后,当我打印出预测时,它返回[1]

predicted = classifier.predict(img.reshape((1,img.shape[0]*img.shape[1] )))
print predicted
Run Code Online (Sandbox Code Playgroud)

无论我使用其他人的图像,它仍然会返回[1]

在此输入图像描述 在此输入图像描述

当我打印出数字"9" 的" 默认"数据集时,它看起来像:在此输入图像描述

我的图片编号"9":

在此输入图像描述

您可以看到我的图像的非零数字非常大.

我不知道为什么.我正在寻求帮助来解决我的问题.谢谢

Dr *_*r K 5

我最好的选择是你的数据类型和数组形状有问题.

看起来你正在训练那种类型的numpy数组np.float64(或者可能np.float32在32位系统上,我不记得了)以及每个图像都有形状的地方(64,).

同时,在代码中调整大小操作之后,用于预测的输入图像具有类型uint8和形状(1, 64).

我会首先尝试更改输入图像的形状,因为dtype转换通常只是按照您的预期工作.所以改变这一行:

predicted = classifier.predict(img.reshape((1,img.shape[0]*img.shape[1] )))

对此:

predicted = classifier.predict(img.reshape(img.shape[0]*img.shape[1]))

如果这不能解决问题,您可以随时尝试重建数据类型

img = img.astype(digits.images.dtype).

我希望有所帮助.通过代理进行调试比实际坐在电脑前要困难得多:)

编辑:根据SciPy文档,训练数据包含0到16之间的整数值.输入图像中的值应缩放以适合相同的间隔.(http://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_digits.html#sklearn.datasets.load_digits)