700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > opencv(python)使用knn最近邻算法识别手写数字

opencv(python)使用knn最近邻算法识别手写数字

时间:2021-07-10 11:32:40

相关推荐

opencv(python)使用knn最近邻算法识别手写数字

knn最近邻算法是一种分类以及回归算法,算法原理是一个样本与样本集中k个样本最相似,如果这k个样本的大多数也属于同一个类别,则该样本也属于这一类。关于knn算法的详细原理读者可以在网上找一些资料了解下,这里主要介绍使用knn进行mnist手写数字的识别。

关于mnist数据的解析,读者可以自己从网上下载相应压缩文件,用python自己编写解析代码,由于这里主要研究knn算法,为了图简单,直接使用Keras的mnist手写数字解析模块。

本次代码运行环境为:

python 3.6.8

opencv-python 4.4.0.46

opencv-contrib-python 4.4.0.46

以下是使用knn进行手写数字的训练代码:

import cv2import numpy as npfrom keras.datasets import mnistfrom keras import utilsif __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')/255test_images=test_images.reshape(test_images.shape[0],-1)test_images=test_images.astype('float32')/255#将标签数据转为float32train_labels=train_labels.astype(np.float32)test_labels=test_labels.astype(np.float32)#传入knn的训练数据形状为(60000, 784) 训练标签为(60000,)#创建knn对象knn=cv2.ml.KNearest_create()#设置k值 默认的k=10knn.setDefaultK(5)#设置是分类还是回归knn.setIsClassifier(True)#开始训练knn.train(train_images,cv2.ml.ROW_SAMPLE,train_labels)#手写数字识别保存的knn模型非常大 有两百多兆knn.save('mnist_knn.xml')#进行模型准确率的测试 结果是一个元组 第一个值为数据1的结果test_pre=knn.predict(test_images)test_ret=test_pre[1]#计算准确率test_ret=test_ret.reshape(-1,)test_sum=(test_ret==test_labels)acc=test_sum.mean()print(acc)

使用knn进行手写数字训练后,得到了一个knn模型,这个模型文件有两百多兆,这也是knn算法的弊端,训练数据比较多,模型就会很大。

这个模型在测试数据上的准确率为0.9688,算的上非常高的准确率了,接下来使用这个knn模型进行单个手写数字的识别。

识别如下这上手写数字图片:

对手写数字图片进行识别的代码如下:

import cv2import numpy as npif __name__=='__main__':#读取图片img=cv2.imread('shuzi.jpg',0)img_sw=img.copy()#将数据类型由uint8转为float32img=img.astype(np.float32)#图片形状由(28,28)转为(784,)img=img.reshape(-1,)#增加一个维度变为(1,784)img=img.reshape(1,-1)#图片数据归一化img=img/255#载入knn模型knn=cv2.ml.KNearest_load('mnist_knn.xml')#进行预测img_pre=knn.predict(img)print(img_pre[1])cv2.imshow('test',img_sw)cv2.waitKey(0)

运行结果为:

由此可见,成功识别了该张手写数字图片。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。