Python实现手写体数字图片识别+GUI界面+画板数字识别


Python实现手写体数字图片识别+GUI界面+画板数字识别文章插图
__pycache__文件夹是Python自动生成的 , 详细了解其他各个文件在之后部分会依次介绍
图片识别版本:python3.6tensorflow 1.13.1(一定要安装1.几版本 , 不要安装2.几)运行时可能有很多warning , 不影响运行结果此部分大多程序参考《TensorFlow实战Google深度学习框架》
【Python实现手写体数字图片识别+GUI界面+画板数字识别】这里使用的是基于全连接层网络结构的神经网络 , 对数字识别已经有了不错的效果 , 但使用卷积神经网络还可以提高正确率(大约99.2%) , 比如LeNet-5模型()
在开始正式做之前 , 先看几篇博客大致了解一下MNIST数据集:MNIST是深度学习的经典入门demo , 他是由6万张训练图片和1万张测试图片构成的 , 每张图片都是28*28的灰度图 , 像素取值为0~1 。 这些图片是采集的不同的人手写从0到9的数字 。 TensorFlow将这个数据集和相关操作封装到了库中 , 每一张图片是一个长度为784的一维数组 。 下面展示一些 内联代码片 。
from tensorflow.examples.tutorials.mnist import input_data1会自动下载封装好的数据集 。 但是我自己引入minst数据集会报各种各样的错误 , 印象最深刻的是
Python实现手写体数字图片识别+GUI界面+画板数字识别文章插图
我以为是自己tensorflow和python版本的问题 , 因为我同学就很顺利就成功了 , 说真的浪费了好多时间在这个问题上 , 最后终于发现是数据集的原因 , 都快高兴哭了MNIST_data就是我根据这篇博客下载的tensorflow_mnist数据集接下来是数字图片识别相关的文件:mnist_inference.py文件定义了前向传播过程以及神经网络的参数 。 三层全连接网络结构 , 通过加入隐藏层实现了多层网络结构 。 mnist_train.py定义了神经网络的训练过程 。 运行mnist_train.py文件便会开始训练模型 , MNIST_model文件已经有训练好的模型 , 你也可以删掉或修改然后重新训练 。 MNIST_model文件夹保存了已经训练30000次的模型mnist_eval.py文件定义了测试过程 。 运行mnist_eval.py文件就是计算在mnist数据集上测试1万张图片的正确率 。 比如在MNIST数据集10000张测试图片上的正确率
Python实现手写体数字图片识别+GUI界面+画板数字识别文章插图
picture文件夹存放的是自己手写数字的图片app.py文件实现了测试自己手写数字的图片 。 运行后直接识别picture文件夹里的所有图片 。
遇到的困难

  • 不知道模型训练好了怎么测试自己手写的图片mnist_inference.py、mnist_train.py 和 mnist_eval.py这三个文件已经可以实现训练模型和测试正确率 。 之后怎么测试自己的图片呢?输入节点是长度为784的数组 , 所以得把自己的图片转化为长度是784的数组 , 才能输入到模型里 , 才能得到结果 。 代码在app.py里的image_prepare()函数 , 通过使用图像处理库PIL把图片转化为灰度图并且修改尺寸为28*28 , 然后转化为数组 。
  • 测试自己手写图片的正确率太低在mnist测试数据集上的正确率有98%以上 , 而测试自己手写数字的正确率太低了 , 大部分数字都被识别成8 。 这部分我参考了 , 从这里我们可以看出找到几个原因
  • mnist数据集图片是黑底白字 , 而我们平时都是白底黑字 , 所以要对测试图片灰度反转 。 修改后已经可以识别几个数字了 , 但还是很多被识别成了8 。 原因是自己拍的图片有很多噪点 , 直接输入给模型就因为噪点太多 , 被误认为是8 。
  • 二值化来降噪使用opencv二值化图像cv2.threshold(img,127,255,cv2.THRESH_BINARY)虽然还有少量噪点 , 但已经有很好的识别效果了 。 (还可以再调整阈值)
  • 对自己手写图片的选取可以参考:
Gui界面run1.py是界面文件timg是界面背景图 , 你也可以自己选
Python实现手写体数字图片识别+GUI界面+画板数字识别文章插图
Python实现手写体数字图片识别+GUI界面+画板数字识别文章插图
利用PyQt画界面按钮和文本框的介绍网上有很多 。 直接拿过来用就好 。 这部分的关键是怎么把app.py的思路搬进run1.py 。 如果你的app.py运行顺利的话 , 这部分也不会很难 。 这部分我有两个错误:
  • 代码顺序引起的问题错误代码:
evaluate(pic)def evaluate(pic):。。。 123改正代码:
def evaluate(pic):。。。 evaluate(pic)123