用python实现的的手写数字识别器

概述

带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 = None
        self.model = model

        b_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 None
        else:
            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

时间: 2024-10-27 06:18:32

用python实现的的手写数字识别器的相关文章

Python scikit-learn 学习笔记—手写数字识别

这是一个手写数字的识别实验,是一个sklearn在现实中使用的案例.原例网址里有相应的说明和代码. 首先实验的数据量为1797,保存在sklearn的dataset里.我们可以直接从中获取.每一个数据是有image,target两部分组成.Image是一个尺寸为8*8图像,target是图像的类别,在我们看来类别就是手写的数字0-9. 代码一开始,将数据载入. <span style="font-family:Microsoft YaHei;"># Standard sci

基于python Knn 算法识别手写数字,计算准确率 ——第二弹

大家好~ 可爱的我又来了~ 今天我会分享一个简单的Knn算法实例,是小白的必备实例! 开始喽~ 首先我是用Jupyter新建的一个python文件 并且在相同文件夹中放了一个‘data’的图片文件夹里面从0-9个有5000张图片. 接下来是代码部分: 这是需要引用的部分数据包 建立X,y两个集合 digit =  cv2.imread('./data/%d/%d_%d.bmp'%(i,i,j)) #读取图片的位置 下面代码是转换数据类型 下面是输出结果 就这些啦!虽然还点粗糙但是我会努力哒~ 原

使用神经网络来识别手写数字【译(三)- 用Python代码实现

实现我们分类数字的网络 好,让我们使用随机梯度下降和 MNIST训练数据来写一个程序来学习怎样失败手写数字. 我们也难怪Python (2.7) 来实现.只有 74 行代码!我们需要的第一个东西是 MNIST数据.如果有 github 账号,你可以将这些代码库克隆下来, git clone https://github.com/mnielsen/neural-networks-and-deep-learning.git 或者你可以到这里 下载. Incidentally, 当我先前说到 MNIS

Python 手写数字识别-knn算法应用

在上一篇博文中,我们对KNN算法思想及流程有了初步的了解,KNN是采用测量不同特征值之间的距离方法进行分类,也就是说对于每个样本数据,需要和训练集中的所有数据进行欧氏距离计算.这里简述KNN算法的特点: 优点:精度高,对异常值不敏感,无数据输入假定 缺点:计算复杂度高,空间复杂度高 适用数据范围:数值型和标称型(具有有穷多个不同值,值之间无序)    knn算法代码: #-*- coding: utf-8 -*- from numpy import * import operatorimport

python实现KNN,识别手写数字

写了识别手写数字的KNN算法,如下图所示.参考链接http://blog.csdn.net/april_newnew/article/details/44176059. # -*- coding: utf-8 -*- import numpy as np import pandas as pd import os def readtxt(filename): text=[] f = open(filename,'r',encoding='utf-8') for line in f.readlin

KNN分类算法实现手写数字识别

需求: 利用一个手写数字"先验数据"集,使用knn算法来实现对手写数字的自动识别: 先验数据(训练数据)集: ?数据维度比较大,样本数比较多. ? 数据集包括数字0-9的手写体. ?每个数字大约有200个样本. ?每个样本保持在一个txt文件中. ?手写体图像本身的大小是32x32的二值图,转换到txt文件保存后,内容也是32x32个数字,0或者1,如下: 数据集压缩包解压后有两个目录:(将这两个目录文件夹拷贝的项目路径下E:/KNNCase/digits/) ?目录trainingD

07 训练Tensorflow识别手写数字

打开Python Shell,输入以下代码: 1 import tensorflow as tf 2 from tensorflow.examples.tutorials.mnist import input_data 3 4 # 获取数据(如果存在就读取,不存在就下载完再读取) 5 mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) 6 7 # 输入 8 x = tf.placeholder("flo

【转】机器学习教程 十四-利用tensorflow做手写数字识别

模式识别领域应用机器学习的场景非常多,手写识别就是其中一种,最简单的数字识别是一个多类分类问题,我们借这个多类分类问题来介绍一下google最新开源的tensorflow框架,后面深度学习的内容都会基于tensorflow来介绍和演示 请尊重原创,转载请注明来源网站www.shareditor.com以及原始链接地址 什么是tensorflow tensor意思是张量,flow是流. 张量原本是力学里的术语,表示弹性介质中各点应力状态.在数学中,张量表示的是一种广义的"数量",0阶张量

用BP人工神经网络识别手写数字

http://wenku.baidu.com/link?url=HQ-5tZCXBQ3uwPZQECHkMCtursKIpglboBHq416N-q2WZupkNNH3Gv4vtEHyPULezDb50ZcKor41PEikwv5TfTqwrsQ4-9wmH06L7bYD04u 用BP人工神经网络识别手写数字 yzw20091201上传于2013-01-31|暂无评价|356人阅读|13次下载|暂无简介|举报文档 在手机打开 赖勇浩( http://laiyonghao.com ) 这是我读工