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":
您可以看到我的图像的非零数字非常大.
我不知道为什么.我正在寻求帮助来解决我的问题.谢谢
我最好的选择是你的数据类型和数组形状有问题.
看起来你正在训练那种类型的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)