Python如何实现带GUI界面的手写数字识别
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章给大家分享的是有关Python如何实现带GUI界面的手写数字识别的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.效果图有点low,轻喷点击选择图片会优先从当前目录
千家信息网最后更新 2025年11月07日Python如何实现带GUI界面的手写数字识别
这篇文章给大家分享的是有关Python如何实现带GUI界面的手写数字识别的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
1.效果图
有点low,轻喷


点击选择图片会优先从当前目录查找
2.数据集
这部分我是对MNIST数据集进行处理保存
对应代码:
import tensorflow as tfimport matplotlib.pyplot as pltimport cv2from PIL import Imageimport numpy as npfrom scipy import misc(x_train_all,y_train_all),(x_test,y_test) = tf.keras.datasets.mnist.load_data()x_valid,x_train = x_train_all[:5000],x_train_all[5000:]y_valid,y_train = y_train_all[:5000],y_train_all[5000:]print(x_valid.shape,y_valid.shape)print(x_train.shape,y_train.shape)print(x_test.shape,y_test.shape)#读取单张图片def show_single_img(img_arr,len=100,path='/Users/zhangcaihui/Desktop/case/jpg/'): for i in range(len):#我这种写法会进行覆盖,只能保存10张照片,想保存更多的数据自己看着改 new_im = Image.fromarray(img_arr[i]) # 调用Image库,数组归一化 #new_im.show() #plt.imshow(img_arr) # 显示新图片 label=y_train[i] new_im.save(path+str(label)+'.jpg') # 保存图片到本地#显示多张图片def show_imgs(n_rows,n_cols,x_data,y_data): assert len(x_data) == len(y_data) assert n_rows * n_cols < len(x_data) plt.figure(figsize=(n_cols*1.4,n_rows*1.6)) for row in range(n_rows): for col in range(n_cols): index = n_cols * row + col plt.subplot(n_rows,n_cols,index+1) plt.imshow(x_data[index],cmap="binary",interpolation="nearest") plt.axis("off") plt.show()#show_imgs(2,2,x_train,y_train)show_single_img(x_train)3.关于模型
我保存了了之前训练好的模型,用来加载预测
关于tensorflow下训练神经网络模型:手把手教你,MNIST手写数字识别
训练好的模型model.save(path)即可
4.关于GUI设计
1)排版
#ui_openimage.py# -*- coding: utf-8 -*-# from PyQt5 import QtCore, QtGui, QtWidgets# from PyQt5.QtCore import Qtimport sys,timefrom PyQt5 import QtGui, QtCore, QtWidgetsfrom PyQt5.QtWidgets import *from PyQt5.QtCore import *from PyQt5.QtGui import *class Ui_Form(object): def setupUi(self, Form): Form.setObjectName("Form") Form.resize(1144, 750) self.label_1 = QtWidgets.QLabel(Form) self.label_1.setGeometry(QtCore.QRect(170, 130, 351, 251)) self.label_1.setObjectName("label_1") self.label_2 = QtWidgets.QLabel(Form) self.label_2.setGeometry(QtCore.QRect(680, 140, 351, 251)) self.label_2.setObjectName("label_2") self.btn_image = QtWidgets.QPushButton(Form) self.btn_image.setGeometry(QtCore.QRect(270, 560, 93, 28)) self.btn_image.setObjectName("btn_image") self.btn_recognition = QtWidgets.QPushButton(Form) self.btn_recognition.setGeometry(QtCore.QRect(680,560,93,28)) self.btn_recognition.setObjectName("bnt_recognition") #显示时间按钮 self.bnt_timeshow = QtWidgets.QPushButton(Form) self.bnt_timeshow.setGeometry(QtCore.QRect(900,0,200,50)) self.bnt_timeshow.setObjectName("bnt_timeshow") self.retranslateUi(Form) self.btn_image.clicked.connect(self.slot_open_image) self.btn_recognition.clicked.connect(self.slot_output_digital) self.bnt_timeshow.clicked.connect(self.buttonClicked) self.center() QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): #设置文本填充label、button _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "数字识别系统")) self.label_1.setText(_translate("Form", "点击下方按钮")) self.label_1.setStyleSheet('font:50px;') self.label_2.setText(_translate("Form", "0~9")) self.label_2.setStyleSheet('font:50px;') self.btn_image.setText(_translate("Form", "选择图片")) self.btn_recognition.setText(_translate("From","识别结果")) self.bnt_timeshow.setText(_translate("Form","当前时间")) # 状态条显示时间模块 def buttonClicked(self): # 动态显示时间 timer = QTimer(self) timer.timeout.connect(self.showtime) timer.start() def showtime(self): datetime = QDateTime.currentDateTime() time_now = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) #self.statusBar().showMessage(time_now) #self.bnt_timeshow.setFont(QtGui.QFont().setPointSize(100)) self.bnt_timeshow.setText(time_now) def center(self):#窗口放置中央 screen = QDesktopWidget().screenGeometry() size = self.geometry() self.move((screen.width() - size.width()) / 2, (screen.height() - size.height()) / 2) def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: self.close()2)直接运行这个文件(调用1)
#ui_main.pyimport randomfrom PyQt5.QtWidgets import QFileDialogfrom PyQt5.QtGui import QPixmapfrom ui_openimage import Ui_Formimport sysfrom PyQt5 import QtWidgets, QtGuifrom PyQt5.QtWidgets import QMainWindow, QTextEdit, QAction, QApplicationimport os,sysfrom PyQt5.QtCore import Qtimport tensorflowfrom tensorflow.keras.models import load_modelfrom tensorflow.keras.datasets import mnistfrom tensorflow.keras import modelsfrom tensorflow.keras import layersfrom tensorflow.keras.utils import to_categoricalimport tensorflow.keras.preprocessing.image as imageimport matplotlib.pyplot as pltimport numpy as npimport cv2import warningswarnings.filterwarnings("ignore")class window(QtWidgets.QMainWindow,Ui_Form): def __init__(self): super(window, self).__init__() self.cwd = os.getcwd() self.setupUi(self) self.labels = self.label_1 self.img=None def slot_open_image(self): file, filetype = QFileDialog.getOpenFileName(self, '打开多个图片', self.cwd, "*.jpg, *.png, *.JPG, *.JPEG, All Files(*)") jpg = QtGui.QPixmap(file).scaled(self.labels.width(), self.labels.height()) self.labels.setPixmap(jpg) self.img=file def slot_output_digital(self): '''path为之前保存的模型路径''' path='/Users/zhangcaihui/PycharmProjects/py38_tf/DL_book_keras/save_the_model.h6' model= load_model(path) #防止不上传数字照片而直接点击识别 if self.img==None: self.label_2.setText('请上传照片!') return img = image.load_img(self.img, target_size=(28, 28)) img = img.convert('L')#转灰度图像 x = image.img_to_array(img) #x = abs(255 - x) x = np.expand_dims(x, axis=0) print(x.shape) x = x / 255.0 prediction = model.predict(x) print(prediction) output = np.argmax(prediction, axis=1) print("手写数字识别为:" + str(output[0])) self.label_2.setText(str(output[0]))if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) my = window() my.show() sys.exit(app.exec_())5.缺点
界面low
只能识别单个数字
其实可以将多数字图片进行裁剪分割,这就涉及到制作数据集了
6.遗留问题
我自己手写的数据照片处理成28281送入网络预测,识别结果紊乱。
反思:自己写的数据是RGB,且一张几KB,图片预处理后,按28*28读入失真太严重了,谁有好的方法可以联系我!!!
其他的水果识别系统,手势识别系统啊,改改直接套!
感谢各位的阅读!关于"Python如何实现带GUI界面的手写数字识别"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
图片
数字
数据
模型
时间
照片
界面
更多
系统
训练
内容
按钮
篇文章
结果
网络
处理
选择
不错
了了
紊乱
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
深信服网络安全号
小型机 pc 服务器
阿里云数据库为甚么不正确
香港梯子服务器
数据库技术的基础是什么技术
网络安全宣传周河北
discuz 多数据库
软件开发工程师干什么工作
网络安全工程师考证价格
数据库原理与技术视频
数据库的升级版
上海淡漾互联网科技
身份证照片和数据库不匹配
我的世界服务器这么开
第8次人口普查主要数据库
学校网络安全活动主题班会
怎样删除dns服务器
数据库索引的原则
wos数据库阅读
139 smtp服务器
数据库安全性课程
网络安全知识讲座一
昌平区管理软件开发
平果手机连接服务器时出现问题
北京通州软件开发单位
qt数据库获取字段名
海淀区网络技术信息采购
开封服务器机箱报价
网络公司有服务器吗
多cpu 多显卡服务器