概述

带GUI界面的,基于python sklearn knn算法的手写数字识别器,可用于识别手写数字,训练数据集为mnist。

详细

代码下载:http://www.demodashi.com/demo/13039.html

前言

k-近邻(kNN, k-NearestNeighbor)算法是一种基本分类与回归方法,
通俗点来说,就是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的 k 个实例,这 k 个实例的多数属于某个类,就把该输入实例分为这个类。

python 第三方库scikit-learn(sklearn)提供了knn的分类器。

MNIST手写数字数据库(Mixed National Institute of Standards and Technology database)包含
70000张手写数字图片。这些数字是通过美国国家统计局的员工和美国高校的学生收集的。每张图片
都是28x28的灰度图。

用mnist数据集训练出一个knn分类器,对新输入的手写数字进行识别。

准备工作

1.安装必要的第三方库:

pip install scikit-learn 
pip install numpy
pip install wxPython

安装PIL,在以下地址下载PIL库进行安装:
http://effbot.org/media/downloads/PIL-1.1.7.win32-py2.7.exe
(或在http://effbot.org/downloads/ 中找到与你操作系统及python版本相对应
版本的PIL)

2.下载mnist数据集:
可以从以下地址下载mnist数据集。
http://yann.lecun.com/exdb/mnist/
如下:

项目结构图

整体的项目结构十分简单,一共两个脚本文件,一个是GUI界面脚本(digit_gui.py),
一个是分类器脚本(model.py)。
如下:

实现过程的部分代码展示

1. 在model.py中导入相关的库:

import numpy as np
import os
from PIL import Image
import random
from sklearn.neighbors import KNeighborsClassifier as knn
from sklearn.externals import joblib

2. 编写model.py中的相关函数,

将图片转为向量:

def img2vec(fname):'''将jpg等格式的图片转为向量'''im = Image.open(fname).convert('L')im = im.resize((28,28))tmp = np.array(im)vec = tmp.ravel()return vec

随机抽取1000张图片作为训练集:

def split_data(paths):'''随机抽取1000张图片作为训练集'''fn_list = os.llistdir(paths)X = []y = []d0 = random.sample(fn_list,1000)for i,name in enumerate(d0):y.append(name[0])X.append(img2vec(name))dataset = np.array([X,y])return X,y

构建分类器:

def knn_clf(X_train,label):'''构建分类器'''clf = knn()clf.fit(X_train,label)return clf

保存模型:

def save_model(model,output_name):'''保存模型'''joblib.dump(model,ouotput_name)

3. 训练模型:

X_train,y_label = split_data(file_path)
clf = knn_clf(X_train,y_label)
save_model(clf,'mnist_knn1000.m')

4. 在digit_gui.py中编写用户界面:
导入相关的库:

import wx
from collections import namedtuple
from PIL import Image
import os
import model

编写界面:

class MainWindow(wx.Frame):def __init__(self,parent,title):wx.Frame.__init__(self,parent,title=title,size=(600,-1))static_font = wx.Font(12, wx.SWISS, wx.NORMAL, wx.NORMAL)Size = namedtuple("Size",['x','y'])s = Size(100,50)sm = Size(100,25)self.fileName = Noneself.model = modelb_labels = [u'open',u'run']TipString = [u'选择图片', u'识别数字']funcs = [self.choose_file,self.run]'''create input area'''self.in1 = wx.TextCtrl(self,-1,size = (2*s.x,3*s.y))self.out1 = wx.TextCtrl(self,-1,size = (s.x,3*s.y))'''create button'''self.sizer0 = wx.FlexGridSizer(rows=1, hgap=4, vgap=2)self.sizer0.Add(self.in1)buttons = []for i,label in enumerate(b_labels):b = wx.Button(self, id = i,label = label,size = (1.5*s.x,s.y))buttons.append(b)self.sizer0.Add(b)      self.sizer0.Add(self.out1)'''set the color and size of labels and buttons'''  for i,button in enumerate(buttons):button.SetForegroundColour('red')button.SetFont(static_font)button.SetToolTipString(TipString[i])button.Bind(wx.EVT_BUTTON,funcs[i])'''layout'''self.SetSizer(self.sizer0)self.SetAutoLayout(1)self.sizer0.Fit(self)self.CreateStatusBar()self.Show(True)

界面如下:

编写控件的回调函数:

    def run(self,evt):if self.fileName is None:self.raise_msg(u'请选择一幅图片')return Noneelse:model_path = os.path.join(origin_path,'mnist_knn1000.m')clf = model.load_model(model_path)ans = model.tester(self.fileName,clf)self.out1.Clear()self.out1.write(str(ans))def choose_file(self,evt):'''choose img'''dlg = wx.FileDialog(self, message="Choose a file",defaultDir=os.getcwd(), defaultFile="",wildcard=wildcard,style=wx.OPEN | wx.MULTIPLE | wx.CHANGE_DIR)if dlg.ShowModal() == wx.ID_OK:paths = dlg.GetPaths()dlg.Destroy()self.in1.Clear()self.in1.write(paths[0])self.fileName = paths[0]im = Image.open(self.fileName)im.show()else:return None

运行效果

代码下载:http://www.demodashi.com/demo/13039.html

注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

转载于:https://www.cnblogs.com/demodashi/p/9452947.html

用python实现的的手写数字识别器相关推荐

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

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

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

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

  3. BP神经网络理解原理——用Python编程实现识别手写数字(翻译英文文献)

    BP神经网络理解原理--用Python编程实现识别手写数字   备注,这里可以用这个方法在csdn中编辑公式: https://www.zybuluo.com/codeep/note/163962 一 ...

  4. Python徒手实现识别手写数字—图像识别算法(K最近邻)

    Python徒手实现识别手写数字-图像识别算法(K最近邻) 写在前面 这一段的内容可以说是最难的一部分之一了,因为是识别图像,所以涉及到的算法会相比之前的来说比较困难,所以我尽量会讲得清楚一点. 而且 ...

  5. 计算机毕业设计中用python神经网络编程实现手写数字识别

    本文实例为大家分享了python实现手写数字识别的具体代码,供大家参考,具体内容如下 import numpyimport scipy.special#import matplotlib.pyplot ...

  6. 基于Python的KNN实验手写数字识别

    资源下载地址:https://download.csdn.net/download/sheziqiong/86791480 资源下载地址:https://download.csdn.net/downl ...

  7. Python神经网络编程:手写数字的数据集MNIST

    识别人的笔迹这个问题相对复杂,也非常模糊,因此这是一种检验人工智能的理想挑战.这不像进行大量数字相乘那样明确清晰. 让计算机准确区分图像中包含的内容,有时也称之为图像识别问题.科学家对这个问题进行了几 ...

  8. Python徒手实现识别手写数字—图片的读入与处理

    写在前面 在上一篇文章Python徒手实现手写数字识别-大纲中,我们已经讲过了我们想要写的全部思路,所以我们不再说全部的思路. 我这一次将图片的读入与处理的代码写了一下,和大纲写的过程一样,这一段代码 ...

  9. python手机代码识别数字_利用python构建神经网络识别手写数字(附源代码)

    一.运行环境配置 本次实验的运行环境win10(bit64),采用python环境为3.7.6,安装Python环境推荐使用Anaconda.Anaconda是一个免费开源的Python和R语言的发行 ...

最新文章

  1. Spring @Autowired 注入为 null
  2. 每日一题:leetcode82. 删除排序链表中的重复元素 II
  3. 关于对象的引用作为参数,可以直接访问私有成员的问题
  4. Redis内存回收策略
  5. SAP MM模块-实施顾问岗位-面试手册-项目管理经验面试清单-英文
  6. IntelliJ IDEA 编辑器配置vue高亮显示
  7. css之多行文本输出
  8. keras实现nlp
  9. 百度地图java批量获得经纬度_批量调用百度地图API获取地址经纬度坐标
  10. 腐蚀rust服务器系统,腐蚀rust有哪些服务器命令 腐蚀rust服务器命令一览
  11. 12帧跑步动画分解图_今天给大家分享一个跑步动画教程和注意事项!希望有所帮助!...
  12. 云计算发展趋势-华为HCIA云计算学习笔记六
  13. cad二开之不通过netload加载命令(bundle文件的使用)
  14. python 基于卡方值分箱算法
  15. 联想蓝牙没有连接的地方计算机,联想笔记本连不上蓝牙怎么办 笔记本连接蓝牙耳机没声音解决方法...
  16. android实时抓取屏幕文字,Android录制屏幕的实现方法
  17. 在网页中点击链接就可以和在线好友QQ聊天
  18. python读取手机短信信息_python 自动获取手机短信验证码
  19. HBuilderX代码提示失效解决方案
  20. 如何激活iPhone XR和XS上的eSIM

热门文章

  1. 更改AngularJS的语法解析符号
  2. 程序员的圣诞节后-零
  3. virtualbox虚拟机上安装centOS的网络配置(安装centos时选择桥接网络)
  4. 洛谷2149 Elaxia的路线(dp+最短路)
  5. ESXi安装时遇到不识别的硬件的处理
  6. Instance2:login interface
  7. C语言复杂声明解读简明方法
  8. vue项目微信分享之后路由链接被破坏怎么办
  9. (MoMoCMS教程10)创建留言板
  10. jquery ui tabs