本篇文章小编给大家分享一下Python实现带GUI界面的手写数字识别代码,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
效果图
有点low,轻喷
点击选择图片会优先从当前目录查找
数据集
这部分我是对MNIST数据集进行处理保存
对应代码:
import tensorflow as tf import matplotlib.pyplot as plt import cv2 from PIL import Image import numpy as np from 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)
关于GUI设计
1)排版
#ui_openimage.py # -*- coding: utf-8 -*- # from PyQt5 import QtCore, QtGui, QtWidgets # from PyQt5.QtCore import Qt import sys,time from PyQt5 import QtGui, QtCore, QtWidgets from 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.py import random from PyQt5.QtWidgets import QFileDialog from PyQt5.QtGui import QPixmap from ui_openimage import Ui_Form import sys from PyQt5 import QtWidgets, QtGui from PyQt5.QtWidgets import QMainWindow, QTextEdit, QAction, QApplication import os,sys from PyQt5.QtCore import Qt import tensorflow from tensorflow.keras.models import load_model from tensorflow.keras.datasets import mnist from tensorflow.keras import models from tensorflow.keras import layers from tensorflow.keras.utils import to_categorical import tensorflow.keras.preprocessing.image as image import matplotlib.pyplot as plt import numpy as np import cv2 import warnings warnings.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.h5' 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_())
缺点
界面low
只能识别单个数字
其实可以将多数字图片进行裁剪分割,这就涉及到制作数据集了
太极熊猫2百度版 安卓版v1.7.1
下载黎明觉醒应用宝版 安卓版v1.111.1
下载暗影格斗3国际版 (Shadow Fight 3)最新版v1.40.3
下载王者战魂华为版 安卓版v3.6.1
下载放置魔法学院免广告版 v2.9.5
放置魔法学院内置Mod菜单是游戏的破解版本,在该版本中为玩家
万乘之国qq版本 安卓版v1.0.5
万乘之国qq版本是一款极具魅力的策略游戏,玩家们可以通过不同
动物餐厅国际服无限内购版 v12.9
动物餐厅国际服免广告版是游戏的破解版本,在该版本中为玩家去除
欧洲卡车司机 安卓版v3.2
欧洲卡车司机是款模拟经营游戏,这款游戏的画面还是蛮逼真的,给
疯狂大酒店 (Grand Hotel Mania)最新中文版v4.10.0.20
疯狂大酒店(Grand Hotel Mania)是一款好玩的