项目说明

训练之后,即可识别手写数字图片如下(我用windows自带的画板画的,可能有点丑,见谅):

等等

数据集下载

链接:https://pan.baidu.com/s/1wWAuZxWUUhlCzRbIl-NE_g
提取码:nzjk

运行环境说明

运行在自己安装好jupyter的服务器上,安装可以参考:
在CentOS上安装jupyter notebook (支持外网访问)

  • python 3
  • numpy
  • pandas
  • pillow

注意事项

一定要保证路径正确,如果不希望做任何修改的话,请保证相对路径如下:

  • data

    • num

      • 下面是云盘下所有文件,包括testdata文件夹,traindata文件夹,若干个检测图片。
  • 此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算法的应用相关推荐

  1. python 安卓app按钮数字识别_Python 手写数字识别-knn算法应用

    knn算法代码: from numpy import * import operator import os def img2vector(filename): """ ...

  2. svm手写数字识别_KNN 算法实战篇如何识别手写数字

    上篇文章介绍了KNN 算法的原理,今天来介绍如何使用KNN 算法识别手写数字? 1,手写数字数据集 手写数字数据集是一个用于图像处理的数据集,这些数据描绘了 [0, 9] 的数字,我们可以用KNN 算 ...

  3. svm手写数字识别python_SVM算法识别手写体数字

    sklearn内部集成了一些手写体数字图片数据集,现在我们使用这些数据,用SVM支持向量机算法进行训练识别的练习.笔者习惯用pycharm,今天手痒,用一下Spyder编辑,顺便对比一下哪一个好用.废 ...

  4. 监督学习:KNN(K-近邻)算法实现手写数字识别的三种方法

    没人会看的开场白:本来觉得自己从数据建模转人工智能方向应该问题不大(自我感觉自己算法学的不错).结果一个K-邻近实现手写数字识别的代码就让我改了三四天.虽然网上这方面的代码是很多,但是我运行了好几个, ...

  5. Python(TensorFlow框架)实现手写数字识别系统

    手写数字识别算法的设计与实现 本文使用python基于TensorFlow设计手写数字识别算法,并编程实现GUI界面,构建手写数字识别系统.这是本人的本科毕业论文课题,当然,这个也是机器学习的基本问题 ...

  6. Python TensorFlow框架 实现手写数字识别系统

    手写数字识别算法的设计与实现 本文使用python基于TensorFlow设计手写数字识别算法,并编程实现GUI界面,构建手写数字识别系统.这是本人的本科毕业论文课题,当然,这个也是机器学习的基本问题 ...

  7. 【人工智能】利用C语言实现KNN算法进行手写数字识别

    KNN算法称为邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表. kNN算法的核心 ...

  8. 第7-3课:K 最邻近算法(KNN)与手写数字识别

    K 最近邻(KNN,K-Nearest Neighbor)算法是一类在数据挖掘领域常用的分类算法,该算法看似神秘,其实原理很简单,算法实现也很简单.KNN 算法在类别决策时,只参考极少量的相邻样本,也 ...

  9. kNN算法实现手写数字识别(机器学习)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.实验步骤 二.实验过程 1.收集数据:提供文本文件 2.准备数据:将图像转换为测试向量 3.测试算法:使用k-近邻 ...

最新文章

  1. 必填校验加变色,点击颜色消失
  2. 114. Flatten Binary Tree to Linked List【Medium】【将给定的二叉树转化为“只有右孩子节点”的链表(树)】...
  3. slf4j-api-1.5.8.jar
  4. 通过新浪云部署NideShop微信小程序商城(基于Node.js+MySQL+ThinkJS)
  5. 你了解MySQL 主从复制吗?
  6. 如何打造一款可靠的WAF(Web应用防火墙)
  7. 计算机动漫与游戏制作心得,学习课件制作的心得体会(精选10篇)
  8. php图书管理系统外文文献,JSP图书管理系统论文+源码+英文文献翻译+参考文献 第10页...
  9. (十二)GA-RPN----2019CVPR论文解读
  10. html embed自动播放,html embed标签怎么用
  11. 【前端知识之Vue】Vue常用的修饰符
  12. 服务器摆放需要预留U位么_让客厅大一倍的小户型沙发摆放技巧,赶快收藏好!
  13. 电商网站的mongodb设计
  14. 微服务电商实战(十一)搭建vue项目对接注册登陆接口,解决跨域问题,使用七牛云实现头像上传
  15. 关于PSINS运动轨迹仿真模块的理解和思考
  16. 以太网交换机可以家用吗_工业交换机的作用是什么?工业交换机可以家用吗?...
  17. Python3利用VirusTotal的vt库通过API上传样本
  18. Http/Https代理Python实现
  19. 【python机器学习】线性回归--梯度下降实现(基于波士顿房价数据集)
  20. DDN周报 | 6月11日-6月15日

热门文章

  1. 组织结构图 的最简单做法
  2. [luogu] P2345 MooFest G 树状数组
  3. 看完这篇Linux基本的操作你就会了
  4. 用U盘启动盘给Dell服务器装系统找不到RAID阵列解决办法
  5. flink1.13 upsert-kafka connector 实时报表 视频演示
  6. 名悦集团:冬季汽车保养怎么做才到位
  7. 强化学习之探索与利用(一)
  8. 【Redis核心原理和应用实践】应用 2:缓兵之计 —— 延时队列
  9. .NET高级工程师面试经历
  10. FFmpeg音视频核心技术精讲与实战-李超-ffmpeg开发使用笔记2