python_手写数字识别案例、手写数字图片处理

  • 1、手写数字识别案例

步骤:

  1. 收集数据
    带有标签的训练数据集来源于trainingDigits文件夹里面所有的文件,接近2000个文件,每个文件中有32*32的二维数组,由01构成,文件名称就是该文件数据对应的标签类型(即一个数字)。
  2. 处理数据使其符合算法要求
    最终我们要求是一个二维数组作为数据源,所以需要将每一个文件对应的特征数据处理成一行,即1*1024,这样所有样本集就变成了2000行的1024列的大二维数组
  3. 根据以上得到的标签集合和大二维数据数据集,再确定一个k紧邻的k值,就可以作为输入条件进行训练了。
  4. 给定一个测试文件,将其跟第2步一样处理成为1*1024数组,作为未知样本,然后根据knn分类算法,进行分类操作,算法同电影分类案例。
    函数头:def getcls(cur,cls,dataSet,k): def getcls(cur,cls,dataSet,k)
    Cur:未知样本,cls:训练数据集标签集合,dataSet:训练数据集 k:最近的几个邻居

‘’’
#coding=utf-8
#手写数字识别案例
import numpy as np
import os
‘’‘fnames为所有的文件名,fname为每一个文件名,vec为一个1*1024的二维数组,f表示整个文件内容,line为某一行’’’
‘’‘函数用来根据样本集合和未知点判断最终未知点所属类别,knn’’’
def knncls(dataSet,cur,labels,k):
#1、判断当前点到每个样本点距离
a=np.tile(cur,(dataSet.shape[0],1)) #重复cur使其dataSet数组的shape相同
#a与dataSet距离
diff=dataSet-a;
diff=diff2
diff=np.sum(diff,axis=1)
diff=diff
0.5 #欧式距离
#对diff进行排序
indexes=np.argsort(diff) #返回值是距离在原来样本集合下标
#寻找前k个邻居的标签都是什么,确定了标签及出现次数{‘爱情’:11,‘动作’:80}
dic={}
for i in range(k):
key=labels[indexes[i]]
dic[key]=dic.get(key,0)+1
#对字典按照value进行排序,次数多的在前面
lst=sorted(dic.items(),key=lambda kv:kv[1],reverse=True)
return lst[0][0]

‘’‘创建一个训练集合20001024,未知数据就是11024’’’
def createDataSet():
#从traningset文件夹读取所有的文件,然后每个文件处理成一个1*1024的数组
fnames=os.listdir(‘D:/trainingDigits’)
dataSet=np.zeros((len(fnames),1024))#训练集合二维数组
labels=[]#分类标签
i=0
for fname in fnames:
#读取这个文件,然后将文件内容转为一维数组
vec=img2vec(‘D:/trainingDigits/’+fname)
dataSet[i,:]=vec[0]
labels.append(fname[0])
i+=1
return dataSet,labels #python可以返回两个值

‘’‘将图片变成一维数组’’’
def img2vec(fname):
#定义一个11024的数组
vec=np.zeros((1,1024))
f=open(fname,‘r’)
row=0
for line in f:
for j in range(32):
vec[0][row
32+j]=line[j] #例如vec[0][1]=line[1]
row+=1
return vec

if name==‘main’:
num=0
i=0
k=input(“请输入k值:”) #提示用户输入k值
k=int(k)
#创建训练集
dataSet,labels=createDataSet()
#定义一个未知数据
tnames=os.listdir(‘D:/testDigits’) #读取testDigits文件
curs=np.zeros((len(tnames),1024))#测试集合二维数组
for tname in tnames:
#读取这个文件,然后将文件内容转为一维数组
cur=img2vec(‘D:/testDigits/’+tname)
curs[i,:]=cur[0] #curs中是所有的文件内容
res=knncls(dataSet,cur,labels,k)
#判断正确的个数用num记录,正确时加一
if tname[0]==res:
num+=1
accuracy=round(100*num/curs.shape[0],3) #计算手写数字识别的正确率,用百分率表示
print(“正确率为:{}%”.format(accuracy))
‘’’

  • 2、手写数字图片处理

    处理问题:给定一张图片,对图片进行灰阶处理,然后进行二进制化,最终变成我们knn算法需要的样子。函数:将图片变成01
    

    将处理图片为二进制的函数定义在单独的一个py文件中,形成一个模块,方便别的模块进行导入。
    主要的流程就是将图片打开之后,进行降噪处理,然后将其灰度化,最后设置一个阙值将其二值化保存到一个32*32的数组中

import numpy as np
from PIL import Image
import img2vec as pic
import os
‘’‘函数用来根据样本集合和未知点判断最终未知点所属类别,knn’’’
def knncls(dataSet,cur,labels,k):
#1、判断当前点到每个样本点距离
a=np.tile(cur,(dataSet.shape[0],1))
#a与dataSet距离
diff=dataSet-a;
diff=diff2
diff=np.sum(diff,axis=1)
diff=diff
0.5 #欧式距离
#对diff进行排序
indexes=np.argsort(diff) #返回值是距离在原来样本集合下标
#寻找前k个邻居的标签都是什么,确定了标签及出现次数{‘爱情’:11,‘动作’:80}
dic={}
for i in range(k):
key=labels[indexes[i]]
dic[key]=dic.get(key,0)+1
#对字典按照value进行排序,次数多的在前面
lst=sorted(dic.items(),key=lambda kv:kv[1],reverse=True)
return lst[0][0]

‘’‘创建一个训练集合20001024,未知数据就是11024’’’
def createDataSet():
#从traningset文件夹读取所有的文件,然后每个文件处理成一个1*1024的数组
fnames=os.listdir(‘D:/trainingDigits’) #注意是/而不是
dataSet=np.zeros((len(fnames),1024))#训练集合二维数组
labels=[]#分类标签
i=0
for fname in fnames:
#读取这个文件,然后将文件内容转为一维数组
vec=img2vec(‘D:/trainingDigits/’+fname)
dataSet[i,:]=vec
labels.append(fname[0])
i+=1
return dataSet,labels

‘’‘将图片变成一维数组’’’
def img2vec(fname):
#定义一个11024的数组
vec=np.zeros((1,1024))
f=open(fname,‘r’)
row=0
for line in f:
for j in range(32):
vec[0][row
32+j]=line[j]
row+=1
return vec

if name==‘main’:
#创建训练集
dataSet,labels=createDataSet()
#定义一个未知数据
testfile=‘test.png’
#将图片处理成txt文件,里面是0、1
pic.picTo01(testfile)
cur=img2vec(“test.txt”)
res=knncls(dataSet,cur,labels,3)
print(res)

附代码链接:
http://localhost:8888/notebooks/cyl_day4(手写数字识别).ipynb

手写数字识别案例、手写数字图片处理相关推荐

  1. 机器学习算法 08 —— 支持向量机SVM算法(核函数、手写数字识别案例)

    文章目录 系列文章 支持向量机SVM算法 1 SVM算法简介 1.1 引入 1.2 算法定义 2 SVM算法原理 2.1 线性可分支持向量机 2.2 SVM计算过程与算法步骤(有点难,我也没理解透,建 ...

  2. 深度学习-Pytorch:项目标准流程【构建、保存、加载神经网络模型;数据集构建器Dataset、数据加载器DataLoader(线性回归案例、手写数字识别案例)】

    1.拿到文本,分词,清晰数据(去掉停用词语): 2.建立word2index.index2word表 3.准备好预训练好的word embedding 4.做好DataSet / Dataloader ...

  3. matlab朴素贝叶斯手写数字识别_TensorFlow手写数字识别(一)

    本篇文章通过TensorFlow搭建最基础的全连接网络,使用MNIST数据集实现基础的模型训练和测试. MNIST数据集 MNIST数据集 :包含7万张黑底白字手写数字图片,其中55000张为训练集, ...

  4. 完整代码及解析!!手写数字识别系统(手写数字测试识别 + pytoch实现 + 完整代码及解析)

    基于深度学习的手写数字识别系统 一.实验目的 ​ 1.任选实验环境及深度学习框架,实现手写数字识别系统: ​ 2.掌握所采用的深度血迹框架构建方式. 二.实验理论基础 1.MNIST数据集 ​ MNI ...

  5. python 仪表数字识别,利用Python进行数字识别

    思路 通过Python实现KNN算法.而KNN算法就是K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一.该方法的思路是:如果一 ...

  6. mnist手写数字识别_手写数字识别

    案例: 基于mnist数据集,建立mlp模型,实现0-9数字的十分类任务: 1.实现mnist数据载入,可视化图形数字 2.完成数据预处理:图像数据维度转换与归一化.输出结果格式转换 3.计算模型在预 ...

  7. python手写字母识别_手写字母数字识别_Python_SDK调用(一)

    解压SDK压缩包 ##所提供的测试代码中的信息如下所示: option = {} option["side"] = "front" try: response= ...

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

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

  9. linux手写数字识别,mnist手写数字识别与图片预处理

    用户mnist训练了一个模型,想用自己的图片进行测试,需要将自己的图片进行预处理为mnist需要的1*784的二维张量. 因为MNIST数据是28*28的黑底白字图像,而且输入时要将其拉直,也就是可以 ...

最新文章

  1. abap--关于sap地址,传真,邮箱的地址读取
  2. 23种设计模式C++源码与UML实现--责任链模式
  3. MYSQL ERROR CODE 错误编号的意义
  4. 深度学习——02、深度学习入门 8-14
  5. 几行代码搞定树形文本转XML和JSON
  6. vscode 编辑器快捷键
  7. 使用phpunit新建项目
  8. Python之对list进行切片
  9. 计算机组策略怎么设置远程桌面,如何利用组策略编辑器对远程桌面进行管理
  10. B - Zhu and 772002(高斯消元解异或方程)
  11. Linux 下修改时间和时区
  12. hbuilder TODO插件
  13. uniapp打包后高德地图定位失败解决
  14. 最原始最古老的家谱是哪种?采取怎样的形式传承给后代?
  15. kbd通达2017版破解后,自定义菜单无法调用表单开启流程/kbdkbd 错误,请联系管理员 /general/approve_center/new/insert.php/kbd
  16. 【DSA_Fall2020】2. Trees (Templates in C)
  17. 18. 图像分类、分割
  18. Python 计算一年有多少秒
  19. zoj 2965 Accurately Say CocaCola!
  20. js实现记住账号密码——学习笔记

热门文章

  1. linux操作系统培训_Linux 内容和工作定位
  2. 英语中学生测试软件,中考英语口语测试软件.doc
  3. 【华人学者风采】钱煦 加州大学圣地亚哥分校
  4. [Jupyter Notebook]导出好看的中文PDF
  5. 微信公众号扫码关注并打开指定页面的解决方案
  6. 力扣刷题day32|738单调递增的数字、714买卖股票的最佳时机含手续费、968监控二叉树
  7. 智星云服务器之云主机使用教程简记
  8. pythonsklearn做手写识别_Python scikit-learn 学习笔记—手写数字识别
  9. 变分原理(Variational Principle)
  10. 实验三 LZW编解码实验