支持向量机实现任意个数手写数字识别(opencv+sklearn)

引言

本文基于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())
MNIST手写数字图像示例

下载后测试集数据和标签的文件名分别为“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)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值