背景
1.手写数字识别技术的含义
手写数字识别(Handwritten Digit Recognition)是光学字符识别技术的一个分支,是模式识别学科的一个传统研究领域。主要研究如何利用电子计算机自动辨认手写在纸张上的阿拉伯数字。手写数字识别分为脱机手写数字识别和联机手写数字识别。本文主要讨论脱机手写数字的识别。 随着信息化的发展,手写数字识别的应用日益广泛,研究高识别率、零误识率和低拒识率的高速识别算法具有重要意义。
2.手写数字识别技术的理论价值
由于手写数字识别本身的特点,对它的研究有重要的理论价值:
(1)阿拉伯数字是唯一被世界各国通用的符号,对手写体数字识别的研究基本上与文化背景无关,各地的研究工作者基于同一平台开展工作,有利于研究的比较和探讨。
(2) 手写数字识别应用广泛,如邮政编码自动识别,税表系统和银行支票自动处理等。这些工作以前需要大量的手工录入,投入的人力物力较多,劳动强度较大。手写数字识别的研究适应了无纸化办公的需要,能大大提高工作效率。
⑶由于数字类别只有 10 个,较其他字符识别率较高,可用于验证新的理论和做深入的分析研究。许多机器学习和模式识别领域的新理论和算法都是先用手写数字识别进行检验,验证理论的有效性,然后才应用到更复杂的领域当中。这方面的典型例子就是人工神经网络和支持向量机(Support Vector Machine)。
⑷手写数字的识别方法很容易推广到其它一些相关问题,如对英文之类拼音文字的识别。事实上,很多学者就是把数字和英文字母的识别放在一起研究的。
3.数字识别技术的难点
数字的类别只有 10
种,笔划简单,其识别问题似乎不是很困难。但事实上,一些测试结果表明,数字的正确识别率并不如印刷体汉字识别率高,甚至也不如联机手写体汉字识别率高,而只仅仅优于脱机手写体汉字识别。这其中的主要原因是:
⑴数字笔划简单,其笔划差别相对较小,字形相差不大,使得准确区分某些数字相当困难;
⑵数字虽然只有 10 种,且笔划简单,但同一数字写法千差万别,全世界各个国家各个地区的人都在用,其书写上带有明显的区域特性,很难做出可以兼顾世界各种写法的、识别率极高的通用性数字识别系统。
虽然目前国内外对脱机手写数字识别的研究已经取得了很大的成就,但是仍然存在两大难点:
一是识别精度需要达到更高的水平。手写数字识别没有上下文,数据中的每一个数据都至关重要。而数字识别经常涉及金融、财会领域,其严格性更是不言而喻。因此,国内外众多的学者都在为提高手写数字的识别率,降低误识率而努力。
二是识别的速度要达到很高的水平。数字识别的输入通常是很大量的数据,而高精度与高速度是相互矛盾的,因此对识别算法提出了更高的要求。
实现过程简说
首先,我们拿到了两个文件夹。
一个文件夹里的图片同来训练出一个分类器/模型
另一个文件夹的图片对训练出的分类器/模型性能进行评估
图片预处理
- 读取图片并打开
- 图片灰度化,将其降噪转化为黑白两色
- 保存新得到的图片
- 创建数组存入图片和标签
图片预处理我没有采用二值化的方法,因为我的数字图片比较清晰吧,我觉得对于这些数字没有必要,根据实际情况吧,但二值化对于后面的预测还是有点点影响的
构建模型
-
算法选择
以下列举三个算法代码都会实现(但选其中一个就可以了)KNN算法
逻辑回归算法
卷积神经网络 -
构建模型,训练,对模型进行评分
代码部分
image_process.py
from PIL import Image
import numpy as np
import os, re
import matplotlib.pylab as plt
def get_img_names(path):
file_names = os.listdir(path)
img_names = []
for i in file_names:
if re.findall('\d_\d+\.png', i) != []:
img_names.append(i)
return img_names
def get_img_data(path):
data = [] # 特征数据ÿ