手写数字识别——KNN算法的应用
项目说明
训练之后,即可识别手写数字图片如下(我用windows自带的画板画的,可能有点丑,见谅):
等等
数据集下载
链接:https://pan.baidu.com/s/1wWAuZxWUUhlCzRbIl-NE_g
提取码:nzjk
运行环境说明
运行在自己安装好jupyter的服务器上,安装可以参考:
在CentOS上安装jupyter notebook (支持外网访问)
- python 3
- numpy
- pandas
- pillow
注意事项
一定要保证路径正确,如果不希望做任何修改的话,请保证相对路径如下:
- data
- num
- 下面是云盘下所有文件,包括testdata文件夹,traindata文件夹,若干个检测图片。
- num
- 此python文件
如果遇到环境问题,请自行查资料解决,一般情况下是只需要安装pillow就可以了,
pip install pillow -i https://pypi.tuna.tsinghua.edu.cn/simple
推荐安装jupyter,能够省去很多环境安装问题
具体实现代码
主要包括以下几部分代码:
- 把图片转换为txt文本文件
- 把txt文本文件写入转换为一维数组
- 读取label(即训练集的文件名的前缀)
- KNN 算法
- 训练,即把所有训练集中数据转换为二维数组
- 测试,加载图片,使用上面的函数查看识别结果
代码如下
from PIL import Image,ImageDraw
import operator
from numpy import *
from os import listdir
# 临时文件路径,表示将图片转换成的文本
TEXT_PATH = "data/num/test.txt"
# 训练文件的路径
TRAIN_PATH = "data/num/traindata"
# 图片转换为text文本文件
def image_to_text(img):# resizeimg = img.resize((32,32))width = img.size[0]height = img.size[1]# open 文本文件进行写操作fh = open(TEXT_PATH,'w')for j in range(height):for i in range(width):rgb = img.getpixel((i,j))r,g,b = rgb[0],rgb[1],rgb[2]if(r==255 and g==255 and b==255):fh.write('0')elif(r==0 and b==0 and g == 0):fh.write('1')# 为了解决既不是白也不是黑的问题else:fh.write('0')fh.write('\n')fh.close()
# 读数据写入一维数组
def datatoarray(filepath):ary=[]fh = open(filepath)# 把二维数组转换为一维数组for i in range(32):line = fh.readline()for j in range(32):ary.append(int(line[j]))return ary#取文件名前缀,类似于5_45取5
def seplabel(fname):label=int(fname.split("_")[0])return label# KNN算法
def knn(k,testdata,traindata,labels):# 获得训练数据的列数(即属性数目)traindatasize=traindata.shape[0]'''将测试数据(原本只有一行)复制成为traindatasize行,从而方便进行减法运算举个例子,测试数据和训练数据都有n列(即n个属性),测试数据只有一行,但是训练数据却有k行,为了让测试数据和所有的训练数据都进行计算,得到距离为了方便,扩充一下测试数据就可以了。列数不变,所以为1''' dif = tile(testdata,(traindatasize,1))-traindata# 计算距离sqdif = dif**2sumsqdif = sqdif.sum(axis=1)distance = sumsqdif**0.5# 排序sortdistance = distance.argsort()# 进行统计count={}for i in range(0,k):# 按照距离排序后,label中第i个最近的类型 + 1 vote = labels[sortdistance[i]]# 字典中该元素+1count[vote] = count.get(vote,0)+1# 排序,得到最近次数最多的sortcount = sorted(count.items(),key=operator.itemgetter(1),reverse=True)return sortcount[0][0]#建立训练数据
def traindata():labels=[]trainfile=listdir(TRAIN_PATH)num=len(trainfile)#长度1024(列),每一行存储一个文件#用一个数组存储所有训练数据,行:文件总数,列:1024trainarr=zeros((num,1024))for i in range(0,num):thisfname=trainfile[i]thislabel=seplabel(thisfname)labels.append(thislabel)trainarr[i,:]=datatoarray(TRAIN_PATH+"/"+thisfname)return trainarr,labels
# 入口
# 训练
trainarr,labels=traindata()for i in range(10):IMAGE_PATH = "data/num/"+str(i)+"_1.png"img = Image.open(IMAGE_PATH,'r')image_to_text(img)# 单个文件testarr=datatoarray(TEXT_PATH)# KNN算法获得结果rknn=knn(3,testarr,trainarr,labels)print(rknn)'''
# 6 7 9
IMAGE_PATH = "data/num/6_2.png"
img = Image.open(IMAGE_PATH)
image_to_text(img)# 单个文件
testarr=datatoarray(TEXT_PATH)# KNN算法获得结果
rknn=knn(3,testarr,trainarr,labels)
print(rknn)
'''
总结
重点放在KNN算法的应用上,KNN算法很容易理解,也很容易应用。
Smileyan
2019年12月10日 10:34
手写数字识别——KNN算法的应用相关推荐
- python 安卓app按钮数字识别_Python 手写数字识别-knn算法应用
knn算法代码: from numpy import * import operator import os def img2vector(filename): """ ...
- svm手写数字识别_KNN 算法实战篇如何识别手写数字
上篇文章介绍了KNN 算法的原理,今天来介绍如何使用KNN 算法识别手写数字? 1,手写数字数据集 手写数字数据集是一个用于图像处理的数据集,这些数据描绘了 [0, 9] 的数字,我们可以用KNN 算 ...
- svm手写数字识别python_SVM算法识别手写体数字
sklearn内部集成了一些手写体数字图片数据集,现在我们使用这些数据,用SVM支持向量机算法进行训练识别的练习.笔者习惯用pycharm,今天手痒,用一下Spyder编辑,顺便对比一下哪一个好用.废 ...
- 监督学习:KNN(K-近邻)算法实现手写数字识别的三种方法
没人会看的开场白:本来觉得自己从数据建模转人工智能方向应该问题不大(自我感觉自己算法学的不错).结果一个K-邻近实现手写数字识别的代码就让我改了三四天.虽然网上这方面的代码是很多,但是我运行了好几个, ...
- Python(TensorFlow框架)实现手写数字识别系统
手写数字识别算法的设计与实现 本文使用python基于TensorFlow设计手写数字识别算法,并编程实现GUI界面,构建手写数字识别系统.这是本人的本科毕业论文课题,当然,这个也是机器学习的基本问题 ...
- Python TensorFlow框架 实现手写数字识别系统
手写数字识别算法的设计与实现 本文使用python基于TensorFlow设计手写数字识别算法,并编程实现GUI界面,构建手写数字识别系统.这是本人的本科毕业论文课题,当然,这个也是机器学习的基本问题 ...
- 【人工智能】利用C语言实现KNN算法进行手写数字识别
KNN算法称为邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表. kNN算法的核心 ...
- 第7-3课:K 最邻近算法(KNN)与手写数字识别
K 最近邻(KNN,K-Nearest Neighbor)算法是一类在数据挖掘领域常用的分类算法,该算法看似神秘,其实原理很简单,算法实现也很简单.KNN 算法在类别决策时,只参考极少量的相邻样本,也 ...
- kNN算法实现手写数字识别(机器学习)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.实验步骤 二.实验过程 1.收集数据:提供文本文件 2.准备数据:将图像转换为测试向量 3.测试算法:使用k-近邻 ...
最新文章
- 必填校验加变色,点击颜色消失
- 114. Flatten Binary Tree to Linked List【Medium】【将给定的二叉树转化为“只有右孩子节点”的链表(树)】...
- slf4j-api-1.5.8.jar
- 通过新浪云部署NideShop微信小程序商城(基于Node.js+MySQL+ThinkJS)
- 你了解MySQL 主从复制吗?
- 如何打造一款可靠的WAF(Web应用防火墙)
- 计算机动漫与游戏制作心得,学习课件制作的心得体会(精选10篇)
- php图书管理系统外文文献,JSP图书管理系统论文+源码+英文文献翻译+参考文献 第10页...
- (十二)GA-RPN----2019CVPR论文解读
- html embed自动播放,html embed标签怎么用
- 【前端知识之Vue】Vue常用的修饰符
- 服务器摆放需要预留U位么_让客厅大一倍的小户型沙发摆放技巧,赶快收藏好!
- 电商网站的mongodb设计
- 微服务电商实战(十一)搭建vue项目对接注册登陆接口,解决跨域问题,使用七牛云实现头像上传
- 关于PSINS运动轨迹仿真模块的理解和思考
- 以太网交换机可以家用吗_工业交换机的作用是什么?工业交换机可以家用吗?...
- Python3利用VirusTotal的vt库通过API上传样本
- Http/Https代理Python实现
- 【python机器学习】线性回归--梯度下降实现(基于波士顿房价数据集)
- DDN周报 | 6月11日-6月15日