引言
本文基于OpenCV库和SVM算法,将MNIST用作训练集,在白板中绘制任意个数的手写数字,并对每个包含手写数字的图像进行处理作为测试集,预测图像中的数字并顺序输出。
本文记录了手写数字图像处理和机器学习图像识别的完整流程,可供初学者参考,其中还有许多可以改进的地方,欢迎各位提出意见和建议。
结果展示
识别结果:123
识别结果:67899876
识别结果:5201314
需要用到的库
import numpy as np
import matplotlib.pyplot as plt
import datetime as dt
import cv2
from sklearn.preprocessing import MinMaxScaler
from sklearn.svm import NuSVC
import torch
from torchvision import datasets
from torchvision.transforms import ToTensor
画图函数
def myplot(arr):
plt.imshow(arr, cmap='gray', vmin=0, vmax=255)
plt.xticks(ticks=[])
plt.yticks(ticks=[])
plt.show()
plt.close()
准备训练数据集
手写数字训练集选择MNIST,该数据集来自美国国家标准与技术研究所,手写数字图像的像素大小为28*28,特征数为784。Torchvision. datasets中包含了大量用于机器学习模型训练的图像数据集,通过datasets.MNIST()方法下载/导入该数据集。由于MNIST训练集和测试集的样本数均较大,这里加载测试集的10000幅图像即可。
test_data = datasets.MNIST(root='data', train=False, download=True, transform=ToTensor())

下载后测试集数据和标签的文件名分别为“t10k-images-idx3-ubyte”、“t10k-labels-idx1-ubyte”,将test_data中的数据和标签均另存为npy文件,以我们熟悉的numpy ndarray类型进行读取。
Xdata = np.empty(shape=(10000, 28 * 28), dtype=np.float16)
Ydata = np.empty(shape=10000, dtype=np.uint8)
for idx, vari in enumerate(test_data):
arr = vari[0].numpy()
Xdata[idx, :] = arr.ravel()
Ydata[idx] = vari[1]
np.save("./Dataset/Xdata.npy", Xdata)
np.save("./Dataset/Ydata.npy", Ydata)