环境配置
语言:python
平台:pycharm
库: cv2
numpy
keras(这个需要先安装fensorflow库)
写在前面:
手写数字识别,是很多深度学习教程里的入门第一例,但是这些教程往往只告诉了你怎么去构造神经网络,训练模型,最后得出一个准确率,但是很少有教程告诉如何运用这个你训练好模型去识别你自己手写的数字。所以本文会介绍如何对你拍下来的手写数字进行预处理,然后用训练好的模型去识别这个手写数字。
本文运用的方法是svm支持向量机的方式,是一种机器学习,而非深度学习,这种方法的优点是训练模型时的计算量小,60000张的数据集用cpu跑也可以2分钟左右结束。后期博主也将出一篇深度学习方法的手写数字识别。
不管用哪种方法,对于手写数字的图片的预处理都是一样的,所以本文着重介绍图片的预处理。
三个程序
1.训练(我也不是很能讲解清楚,网上有教程)
2.图像预处理(我主要介绍这部分)
3.测试
第一个程序:训练
这部分可以参考https://keras-lx.blog.csdn.net/article/details/111693750
import cv2
import numpy as np
from keras.datasets import mnist
from keras import utils
if __name__ == '__main__':
# 直接使用Keras载入的训练数据(60000, 28, 28) (60000,)
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
# 变换数据的形状并归一化
train_images = train_images.reshape(train_images.shape[0], -1) # (60000, 784)
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape(test_images.shape[0], -1)
test_images = test_images.astype('float32') / 255
# 将标签数据转为int32 并且形状为(60000,1)
train_labels = train_labels.astype(np.int32)
test_labels = test_labels.astype(np.int32)
train_labels = train_labels.reshape(-1, 1)
test_labels = test_labels.reshape(-1, 1)
# 创建svm模型
svm = cv2.ml.SVM_create()
# 设置类型为SVM_C_SVC代表分类
svm.setType(cv2.ml.SVM_C_SVC)
# 设置核函数
svm.setKernel(cv2.ml.SVM_POLY)
# 设置其它属性
svm.setGamma(3)
svm.setDegree(3)
# 设置迭代终止条件
svm.setTermCriteria((cv2.TermCriteria_MAX_ITER, 300, 1e-3))
# 训练
svm.train(train_images, cv2.ml.ROW_SAMPLE, train_labels)
svm.save('m