# DigitalRecognition **Repository Path**: sailsailone/digital-recognition ## Basic Information - **Project Name**: DigitalRecognition - **Description**: 郑州大学数字图像大作业:PyQt5图形界面+Keras/OpenCV手写数字识别ORC模型 - **Primary Language**: Python - **License**: ISC - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-12-21 - **Last Updated**: 2023-03-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 题目四:手写体数字的识别 ### -----基于PyQt5的手写数字识别桌面应用程序 **|** **目录** - 一、**介绍** 1. 开发环境 2. 软件设计思路过程 - 二、**源代码解析** 1. 数字识别部分 2. GUI部分 - 三、**应用程序功能展示** ## 一、介绍: 用PyQt5制作的数字识别桌面软件,可实现: (1)能够读取和存储图像,对图像进行去噪和对比度增强; (2)对图像中的不同数字进行分割; (3)识别出图像中数字的真实值; (4)设计软件界面。 ![](https://secure2.wostatic.cn/static/rwKxwdwiQqomr6FEu8MBdt/image.png?auth_key=1679879377-kHoaaeFotTCw4JqCkdbR3K-0-6663f6713f6cc2cab0fe438842752d4c) ### 1.1开发环境: **系统:** windows10 **处理器:** Intel(R) Core(TM) i5-9300H CPU @ 2.40GHz **开发软件:** Pycharm 2022.3 **Python版本:** python3.6.5 **QT版本:** PyQt5 **Anaconda-env**包环境: ![](https://secure2.wostatic.cn/static/hB1MqFnumt6Fgx1zGsaks7/image_1.png?auth_key=1679879377-fzNfC1nQsDNjtzgKrj2xjq-0-d2fcc5adce6c1ee36a7ecd77be0a89cc) ### 1.2软件设计过程: 1. 使用**Keras**框架训练模型,在工程文件中生成模型my_mnist_model.h5; 2. 设计图形界面**MainWindow**: 在pycharm中配置pyqt5-tools工具,使用**PyQt5 Designer**完成基本图形界面布局,生成PaintBoard.ui,再使用PyUIC5将PaintBoard.ui转为[PaintBoard.py](http://PaintBoard.py) ; ![](https://secure2.wostatic.cn/static/dBi49d52MZoRgzZaVysKBt/image_2.png?auth_key=1679879377-vPPcYk5tnyj8zqckuvip9e-0-3975a0295f4dbfd3162f376786a487c8) 1. 创建**启动程序**CallWindows.py : 用于启动图形界面程序PaintBoard.py ;打包工程时会将此文件打包为exe可执行文件 1. 设计**手写板程序**: 设计Skatchpad.py,实现最基本的画图功能,并在PaintBoard.py的主界面初始化函数setupUi中引入手写板程序,将其设为私有变量__paintBoard; from Sketchpad import Sketchpad # 画板区域 self.__paintBoard = Sketchpad(self) # 设定画板区域位置(30,110),画板大小为(611,461) self.__paintBoard.setGeometry(QtCore.QRect(30, 110, 611, 461)) Python 1. 在PaintBoard.py 中增加**数字识别相关函数**; ![](https://secure2.wostatic.cn/static/owQ8A5zhTjLU1sxd4F7Jz7/image_3.png?auth_key=1679879377-f28QHR8z3k22Wcy6SjJ2AK-0-6ad52cd98a32386a2cd933f00fdcecf0) 1. 给控件**关联功能函数**: 在PaintBoard.py 的Ui_MainWindow类中增加图形界面上各**控件的功能函数**,并在图形界面初始化函数setupUi中,将功能函数与控件按钮相关联在一起; ![](https://secure2.wostatic.cn/static/n4craqwakasjq6FXhz8GUf/image_4.png?auth_key=1679879377-hq1sKZM5FgBbT7pScU1yXZ-0-d48693e9fcec8342facce516a41c7d6f) # 将savebutton按键按下信号与保存函数相关联 self.savebutton.clicked.connect(self.on_btn_Save_Clicked) ![](https://secure2.wostatic.cn/static/5JTT66vWnVuh35EXfXep6r/image.jpeg?auth_key=1679879377-bubRnMhmUtN6hGNoB783s8-0-a65fdc2026a7836b566ecb2651ca9797) 8.打包: 成功运行后,在Anaconda Prompt相应的env环境中使用pyinstaller将工程打包为可执行文件,打包命令为: pyinstaller -F -w CallWindows.py --hidden-import Sketchpad.py --hidden-import PaintBoard.py --hidden-import model.py --hidden-import my_mnist_model.h5 --hidden-import PyQt5 --hidden-import sys --hidden-import cv2 --hidden-import numpy --hidden-import matplotlib --hidden-import keras --hidden-import os Python 打包后生成可跨平台运行的桌面程序(该程序必须包含以下文件,否则会运行失败); ![](https://secure2.wostatic.cn/static/r5tDnWGwMiYdjpjd57joCC/image_5.png?auth_key=1679879377-fdRjvrVrgS1bkcttq54Pgm-0-4d3704cecd701fcaefca4d1e536e9305) ## 二、源代码解析 ### 2.1数字识别部分 #### 2.1.1 model.py 这是一个使用*Keras*框架训练模型的代码,用于识别*MNIST*手写数字数据集中的数字图像。 首先,通过导入MNIST数据集并使用matplotlib库显示其中一个图像来加载数据。MNIST 数据集是一个常用的手写数字识别数据集,包含了 60,000 张训练图像和 10,000 张测试图像。 ![](https://secure2.wostatic.cn/static/na1os6mEb1EsGzm4rcg6NT/image_6.png?auth_key=1679879377-uJkR9vbLJakHVTPpj96ECa-0-9585bab215f594de2257edadabd866c9) 程序首先使用 keras.datasets 中的 mnist.load_data 函数导入 MNIST 数据集。然后使用 matplotlib.pyplot 库中的 imshow 函数将一张训练图像和对应的标签显示出来。 接着,程序对训练和测试数据进行预处理。首先使用 numpy.reshape 函数将图像数据转换为 (28, 28, 1) 的形状,然后使用 numpy.astype 函数将图像数据转换为浮点类型,并将图像像素值除以 255 归一化。最后,使用 keras.utils.np_utils 中的 to_categorical 函数将标签转换为 one-hot 编码。 程序中的 model_conv 函数定义了一个卷积神经网络模型。该模型包含三个卷积层和两个全连接层,使用 ReLU 激活函数。最后,使用交叉熵损失函数和 RMSProp 优化器编译模型。 接下来,程序使用训练数据训练模型,并使用测试数据评估模型的性能。最后,使用 model.save 函数将模型保存为文件 my_mnist_model.h5。 ![](https://secure2.wostatic.cn/static/oB8JrexLuowbgSmySpbMgy/image_7.png?auth_key=1679879377-4vWPdqMzMa2MFVTvenDUYy-0-7769817a563676edb01a1ebe1c8aec4a) 这个程序的目的是构建一个可以在 MNIST 数据集上进行手写数字识别的模型。程序使用卷积神经网络构建模型,并在训练过程中,使用 model.fit 函数对模型进行训练。该函数接收训练数据和标签以及训练的轮数(这里为 5 轮)、批量大小(这里为 64)和验证数据的比例(这里为 10%)作为参数。 训练过程中,模型会在训练数据上进行训练,并在验证数据上进行评估,以验证模型的性能是否有所提高。 在训练结束后,使用 model.evaluate 函数对模型在测试数据上的性能进行评估。该函数返回损失值和准确率,并打印。 最后,使用 model.save 函数将训练好的模型保存为文件 my_mnist_model.h5,以便在后续使用时直接调用。 #### 2.1.2 PaintBoard.py 1. accessPiexl 函数用于将图像中的**像素取反**。接收一个图像参数 img,并将图像中每个像素的值设为 255 减去原来的值。