目录标题

  • 背景
  • 实现过程简说
    • 图片预处理
    • 构建模型
  • 代码部分

背景

1.手写数字识别技术的含义
手写数字识别(Handwritten Digit Recognition)是光学字符识别技术的一个分支,是模式识别学科的一个传统研究领域。主要研究如何利用电子计算机自动辨认手写在纸张上的阿拉伯数字。手写数字识别分为脱机手写数字识别和联机手写数字识别。本文主要讨论脱机手写数字的识别。 随着信息化的发展,手写数字识别的应用日益广泛,研究高识别率、零误识率和低拒识率的高速识别算法具有重要意义。

2.手写数字识别技术的理论价值

由于手写数字识别本身的特点,对它的研究有重要的理论价值:

(1)阿拉伯数字是唯一被世界各国通用的符号,对手写体数字识别的研究基本上与文化背景无关,各地的研究工作者基于同一平台开展工作,有利于研究的比较和探讨。

(2) 手写数字识别应用广泛,如邮政编码自动识别,税表系统和银行支票自动处理等。这些工作以前需要大量的手工录入,投入的人力物力较多,劳动强度较大。手写数字识别的研究适应了无纸化办公的需要,能大大提高工作效率。

⑶由于数字类别只有 10 个,较其他字符识别率较高,可用于验证新的理论和做深入的分析研究。许多机器学习和模式识别领域的新理论和算法都是先用手写数字识别进行检验,验证理论的有效性,然后才应用到更复杂的领域当中。这方面的典型例子就是人工神经网络和支持向量机(Support Vector Machine)。

⑷手写数字的识别方法很容易推广到其它一些相关问题,如对英文之类拼音文字的识别。事实上,很多学者就是把数字和英文字母的识别放在一起研究的。

3.数字识别技术的难点

数字的类别只有 10
种,笔划简单,其识别问题似乎不是很困难。但事实上,一些测试结果表明,数字的正确识别率并不如印刷体汉字识别率高,甚至也不如联机手写体汉字识别率高,而只仅仅优于脱机手写体汉字识别。这其中的主要原因是:

⑴数字笔划简单,其笔划差别相对较小,字形相差不大,使得准确区分某些数字相当困难;

⑵数字虽然只有 10 种,且笔划简单,但同一数字写法千差万别,全世界各个国家各个地区的人都在用,其书写上带有明显的区域特性,很难做出可以兼顾世界各种写法的、识别率极高的通用性数字识别系统。

虽然目前国内外对脱机手写数字识别的研究已经取得了很大的成就,但是仍然存在两大难点:

一是识别精度需要达到更高的水平。手写数字识别没有上下文,数据中的每一个数据都至关重要。而数字识别经常涉及金融、财会领域,其严格性更是不言而喻。因此,国内外众多的学者都在为提高手写数字的识别率,降低误识率而努力。

二是识别的速度要达到很高的水平。数字识别的输入通常是很大量的数据,而高精度与高速度是相互矛盾的,因此对识别算法提出了更高的要求。

实现过程简说

首先,我们拿到了两个文件夹。

一个文件夹里的图片同来训练出一个分类器/模型
另一个文件夹的图片对训练出的分类器/模型性能进行评估

图片预处理
  1. 读取图片并打开
  2. 图片灰度化,将其降噪转化为黑白两色
  3. 保存新得到的图片
  4. 创建数组存入图片和标签

图片预处理我没有采用二值化的方法,因为我的数字图片比较清晰吧,我觉得对于这些数字没有必要,根据实际情况吧,但二值化对于后面的预测还是有点点影响的

构建模型
  1. 算法选择
    以下列举三个算法代码都会实现(但选其中一个就可以了)

    KNN算法
    逻辑回归算法
    卷积神经网络

  2. 构建模型,训练,对模型进行评分

代码部分

image_process.py

from PIL import Image
import numpy as np
import os, re
import matplotlib.pylab as pltdef 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_namesdef get_img_data(path):data = []    # 特征数据(图像数组)labels = []    # 目标(标签)数据img = get_img_names(path)# print(img)img = np.array(img)# print(img.shape)n = int(img.shape[0] / 10) + 1    # 得到每个数字的图片数for i in range(10):for j in range(1, n):img = Image.open(path + "%d_%d.png" % (i, j))  # 打开图片# print(img)    # <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=38x41 at 0x21E8FD19748>img = img.resize((32, 32))      # 将图片化为32*32的img = img.convert('RGBA')     # "L"为灰度化raw_data = img.load()             # 得到图片的像素值# 将其降噪并转化为黑白两色for y in range(img.size[1]):for x in range(img.size[0]):if raw_data[x, y][0] < 90:raw_data[x, y] = (0, 0, 0, 255)for y in range(img.size[1]):for x in range(img.size[0]):if raw_data[x, y][1] < 136:raw_data[x, y] = (0, 0, 0, 255)for y in range(img.size[1]):for x in range(img.size[0]):if raw_data[x, y][2] > 0:raw_data[x, y] = (255, 255, 255, 255)# print(img)    # <PIL.Image.Image image mode=RGBA size=38x41 at 0x21E8FD19828>img.save(path + '%d_%d(%d).png' % (i, j, i))  # 保存,方便查看# 读取图片,一共有10个数字(0-9),每个有12张图片.图片命名格式为:_0_1.pngdigit = plt.imread(path + '%d_%d(%d).png' % (i, j, i))data.append(digit)    # 逐个图片添加labels.append(i)# 把列表转成数组data = np.array(data)labels = np.array(labels)# 查看数组形状# print(data.shape)     # (120,)# 随机显示一张图片(方便查看,上述操作后是否有变化)# index = np.random.randint(0, 20, size=1)[0]# img_ = data[index]# plt.figure(figsize=(0.3, 0.3))          # 设置画布宽为0.3,高为0.3# plt.imshow(img_, cmap='gray')         # 显示颜色为gray# plt.axis("off")     # 去掉坐标轴# plt.show()# print(labels[index])return data, labels

data.py

from image_process import get_img_data
from sklearn.neighbors import KNeighborsClassifier      # KNN算法
from sklearn.metrics import classification_report, confusion_matrix
import matplotlib.pyplot as plt# 得到训练集和测试集样本
data_tr, labels_tr = get_img_data("trainImages/")
data_te, labels_te = get_img_data("testImages/")
# (120, 32, 32, 4) (120,) (30, 32, 32, 4) (30,)
# 训练数据要为二维数组,如果不做转换会报如下错误,说4维数组不能做运算。报错: ValueError: Found array with dim 4. Estimator expected <= 2.
# data_tr = data_tr.reshape(120, -1)
# data_te = data_te.reshape(30, -1)
# print(data_tr.shape, labels_tr.shape, data_te.shape, labels_te.shape)    # (120, 4096) (120,) (30, 4096) (30,)# 使用KNN算法   n_neighbors: int,默认值为5,表示knn算法中选取离测试数据最近的k个点,
model = KNeighborsClassifier(n_neighbors=1)  # 构建模型
model.fit(data_tr.reshape(120, -1), labels_tr)      # 训练模型
pre = model.predict(data_te.reshape(30, -1))       # 预测
print(pre)
# 对训练后的模型进行评分(# 模型在测试集上的精度)
acc = model.score(data_te.reshape(30, -1), labels_te)
print(acc)
# 性能评价
print(confusion_matrix(labels_te, pre))         # confusion_matrix:混淆矩阵
print(classification_report(labels_te, pre))# 可视化预测结果
# 画布大小10行10列,每行高为1,每列宽为1.5
plt.figure(figsize=(10*1, 10*1.5))
for i in range(30):#绘制子图axes = plt.subplot(10, 10, i+1)#测试数据为500张,绘制其中的30张axes.imshow(data_te[i], cmap='gray')#添加标题t = labels_te[i]p = pre[i]axes.set_title('True:%d\nPred:%d' % (t, p))#不显示坐标刻度axes.axis('off')
plt.savefig('axes.png')
plt.show()

KNN算法的正确率不是特别高,如果想要达到0.9几的可以尝试卷积神经网络
这里有设计了一个知识点:监督算法和无监督算法

结果:

[1 0 0 1 1 1 2 1 7 3 7 3 4 1 4 5 5 6 6 6 6 7 7 7 8 6 8 9 3 9]
0.7333333333333333
[[2 1 0 0 0 0 0 0 0 0][0 3 0 0 0 0 0 0 0 0][0 1 1 0 0 0 0 1 0 0][0 0 0 2 0 0 0 1 0 0][0 1 0 0 2 0 0 0 0 0][0 0 0 0 0 2 1 0 0 0][0 0 0 0 0 0 3 0 0 0][0 0 0 0 0 0 0 3 0 0][0 0 0 0 0 0 1 0 2 0][0 0 0 1 0 0 0 0 0 2]]precision    recall  f1-score   support0       1.00      0.67      0.80         31       0.50      1.00      0.67         32       1.00      0.33      0.50         33       0.67      0.67      0.67         34       1.00      0.67      0.80         35       1.00      0.67      0.80         36       0.60      1.00      0.75         37       0.60      1.00      0.75         38       1.00      0.67      0.80         39       1.00      0.67      0.80         3accuracy                           0.73        30macro avg       0.84      0.73      0.73        30
weighted avg       0.84      0.73      0.73        30Process finished with exit code 0

机器学习之手写数字图片数据处理及识别相关推荐

  1. 机器学习入门-用KNN实现手写数字图片识别(包含自己图片转化)

    Python实现KNN手写数字图片识别 1.数据集格式 2.把自己图片转化为数据集格式(把宽高是32像素x32像素的黑白图像转换为文本格式) 3.用数据集实现 4.运行结果 4.代码下载地址 KNN是 ...

  2. Dataset之MNIST:MNIST(手写数字图片识别+ubyte.gz文件)数据集简介、下载、使用方法(包括数据增强)之详细攻略

    Dataset之MNIST:MNIST(手写数字图片识别+ubyte.gz文件)数据集简介+数据增强(将已有MNIST数据集通过移动像素上下左右的方法来扩大数据集为初始数据集的5倍) 目录 MNIST ...

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

    python_手写数字识别案例.手写数字图片处理 1.手写数字识别案例 步骤: 收集数据 带有标签的训练数据集来源于trainingDigits文件夹里面所有的文件,接近2000个文件,每个文件中有3 ...

  4. 02:一文全解:利用谷歌深度学习框架Tensorflow识别手写数字图片(初学者篇)

    标签(空格分隔): 王小草Tensorflow笔记 笔记整理者:王小草 笔记整理时间2017年2月24日 Tensorflow官方英文文档地址:https://www.tensorflow.org/g ...

  5. Dataset之MNIST:MNIST(手写数字图片识别及其ubyte.gz文件)数据集简介、下载、使用方法(包括数据增强)之详细攻略

    Dataset之MNIST:MNIST(手写数字图片识别及其ubyte.gz文件)数据集简介.下载.使用方法(包括数据增强,将已有MNIST数据集通过移动像素上下左右的方法来扩大数据集为初始数据集的5 ...

  6. 手写数字图片识别+导入csv训练集+预测训练集+csv导出预测结果

    手写数字图片识别+导入csv训练集+预测训练集+csv导出预测结果 题目来源: Dataset之MNIST:MNIST(手写数字图片识别+csv文件)数据集简介.下载.使用方法之详细攻略 导入csv训 ...

  7. 机器学习:手写数字识别(Hand-written digits recognition)小项目

    该项目的所有代码在我的github上,欢迎有兴趣的同学与我探讨研究~ 地址:Machine-Learning/machine-learning-ex3/ 1. Introduction 手写数字识别( ...

  8. Tensorflow学习教程------模型参数和网络结构保存且载入,输入一张手写数字图片判断是几...

    首先是模型参数和网络结构的保存 #coding:utf-8 import tensorflow as tf from tensorflow.examples.tutorials.mnist impor ...

  9. DL之CNN:利用卷积神经网络算法(2→2,基于Keras的API-Functional)利用MNIST(手写数字图片识别)数据集实现多分类预测

    DL之CNN:利用卷积神经网络算法(2→2,基于Keras的API-Functional)利用MNIST(手写数字图片识别)数据集实现多分类预测 目录 输出结果 设计思路 核心代码 输出结果 下边两张 ...

  10. DL之CNN:利用卷积神经网络算法(2→2,基于Keras的API-Sequential)利用MNIST(手写数字图片识别)数据集实现多分类预测

    DL之CNN:利用卷积神经网络算法(2→2,基于Keras的API-Sequential)利用MNIST(手写数字图片识别)数据集实现多分类预测 目录 输出结果 设计思路 核心代码 输出结果 1.10 ...

最新文章

  1. js进阶 13-5 jquery队列动画如何实现
  2. Web 静态文件版本升级代码
  3. File not found 错误 nginx
  4. CentOS下为Web网站性能做测试
  5. 95-290-362-源码-内存管理-Buffer-LocalBufferPool
  6. DEDE_5.7星星评分插件首发!
  7. python控制安捷伦频谱仪_安捷伦频谱仪使用说明
  8. python椭圆花瓣_python之花瓣美女下载详解
  9. Linux查看opencv版本
  10. Ansys模态计算结果图片批量导出命令流
  11. excel常用函数大全及示例(一)
  12. 关掉计算机usb接口,bios中不小心把电脑的USB接口给关闭了,怎么样开启
  13. 杭电OJ 11页2025//查找其中的最大字母,在该字母后面插入字符串“(max)”
  14. 深入探讨IGP协议:OSPF与ISIS的区别(区域类型比较,邻接关系比较,DR和DIS比较,如何计算路由以及性能的比较)
  15. php上一页下一页代码博客,连接数据库上一页下一页_帮助文档_Thinkphp手册
  16. 西门子医疗与全景医学共推基层医疗远程影像诊断全面应用;汤臣倍健捐赠670万元营养品与合作伙伴共同支援西安、珠海抗疫 | 医药健闻...
  17. 如何去远程控制公司电脑 这三样必备一样也不能少
  18. 如何识别哭泣csdn_你上一次流泪是什么时候?| 研究:几乎不哭泣的4类人
  19. 读《Microservices》有感
  20. Excel一个单元格中输入度分秒转换成小数(如256.3246(读256度32分46秒))

热门文章

  1. 李飞飞团队造出“窥视未来”新AI:去哪干啥一起猜,准确率压倒老前辈
  2. 二维码扫描枪中文开发指导
  3. 探讨下app的包为什么抓不到
  4. Android 显示大尺寸图片
  5. Pandas数据分析——从0.3到0.8学习指南
  6. 【其他】bilibili下载的m4s格式视频如何还原为mp4
  7. 随机游走 推荐系统论文阅读
  8. aop:aspectj-autoproxy作用
  9. 利用Python实现自动投票以及自动爬虫IP代理
  10. 笔记1-P2P后台管理系统