手写数字识别示例

本教程将指导如何使用Pythonscikit-learn库来识别手写数字图像。手写数字数据集包含了8x8像素的数字图像,将使用这些图像来展示如何进行图像识别

导入必要的库

首先,需要导入一些必要的Python库,包括matplotlib用于绘图,以及scikit-learn中的一些模块,如数据集、分类器和性能指标。

import matplotlib.pyplot as plt from sklearn import datasets, metrics, svm from sklearn.model_selection import train_test_split

加载手写数字数据集

手写数字数据集由8x8像素的灰度图像组成,将使用这些图像来训练和测试分类器。

digits = datasets.load_digits()

可以通过matplotlib来可视化数据集中的前四张图像,并在标题中显示每张图像代表的数字。

_, axes = plt.subplots(nrows=1, ncols=4, figsize=(10, 3)) for ax, image, label in zip(axes, digits.images, digits.target): ax.set_axis_off() ax.imshow(image, cmap=plt.cm.gray_r, interpolation="nearest") ax.set_title(f"Training: {label}")

图像分类

为了应用分类器,需要将图像展平,将每个8x8的灰度值数组转换为一维数组。这样,整个数据集将转换为形状为(n_samples, n_features)的数组,其中n_samples是图像数量,n_features是每个图像的像素总数。

n_samples = len(digits.images) data = digits.images.reshape((n_samples, -1))

接下来,创建一个分类器,这里使用的是支持向量分类器,并将其应用于训练数据。然后,可以使用这个分类器来预测测试数据集中的数字。

clf = svm.SVC(gamma=0.001) X_train, X_test, y_train, y_test = train_test_split(data, digits.target, test_size=0.5, shuffle=False) clf.fit(X_train, y_train)

还可以可视化测试样本,并显示预测的数字。

_, axes = plt.subplots(nrows=1, ncols=4, figsize=(10, 3)) for ax, image, prediction in zip(axes, X_test, predicted): ax.set_axis_off() image = image.reshape(8, 8) ax.imshow(image, cmap=plt.cm.gray_r, interpolation="nearest") ax.set_title(f"Prediction: {prediction}")

分类报告

分类报告将显示主要的分类指标,如精确度、召回率、F1分数和支持度。

print(f"Classification report for classifier {clf}:\n {metrics.classification_report(y_test, predicted)}\n")

此外,还可以绘制一个混淆矩阵,显示真实数字值和预测数字值之间的关系。

disp = metrics.ConfusionMatrixDisplay.from_predictions(y_test, predicted) disp.figure_.suptitle("Confusion Matrix") print(f"Confusion matrix:\n {disp.confusion_matrix}")

如果分类器的评估结果以混淆矩阵的形式存储,而不是以y_true和y_pred的形式,仍然可以按照以下方式构建分类报告。

y_true = [] y_pred = [] cm = disp.confusion_matrix for gt in range(len(cm)): for pred in range(len(cm)): y_true += [gt] * cm[gt][pred] y_pred += [pred] * cm[gt][pred] print("Classification report rebuilt from confusion matrix:\n " + metrics.classification_report(y_true, y_pred) + "\n")
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485