博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅点击查看作者主页,了解更多项目!
🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅
1、毕业设计:2026年计算机专业毕业设计选题汇总(建议收藏)✅
2、大数据毕业设计:2026年选题大全 深度学习 python语言 JAVA语言 hadoop和spark(建议收藏)✅
🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅
1、项目介绍
技术栈:
python语言、Keras模型、CNN算法 、PyQt5图形界面、OpenCV
手写数字识别系统
创建启动程序CallWindows.py ,用于启动图形界面程序PaintBoard.py
用PyQt5制作的数字识别桌面软件,可实现:
(1)能够读取和存储图像,对图像进行去噪和对比度增强;
(2)对图像中的不同数字进行分割;
(3)识别出图像中数字的真实值;
(4)设计软件界面。
python手写数字识别系统 深度学习 PyQt5图形界面+Keras+OpenCV手写数字识别
2、项目界面
(1)手写数字识别检测
(2)橡皮擦功能
(3)上传图片检测识别
(4)手写数字识别检测
(5)界面效果
3、项目说明
这是一个使用Keras框架训练模型的代码,用于识别MNIST手写数字数据集中的数字图像。
首先,通过导入MNIST数据集并使用matplotlib库显示其中一个图像来加载数据。
MNIST 数据集是一个常用的手写数字识别数据集,包含了 60,000 张训练图像和 10,000 张测试图像。
程序首先使用 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。
这个程序的目的是构建一个可以在 MNIST 数据集上进行手写数字识别的模型。
程序使用卷积神经网络构建模型,并在训练过程中,使用 model.fit 函数对模型进行训练。
该函数接收训练数据和标签以及训练的轮数(这里为 5 轮)、批量大小(这里为 64)和验证数据的比例(这里为 10%)作为参数。
训练过程中,模型会在训练数据上进行训练,并在验证数据上进行评估,以验证模型的性能是否有所提高。
在训练结束后,使用 model.evaluate 函数对模型在测试数据上的性能进行评估。该函数返回损失值和准确率,并打印。
最后,使用 model.save 函数将训练好的模型保存为文件 my_mnist_model.h5,以便在后续使用时直接调用。
4、核心代码
fromPyQt5.QtWidgetsimportQWidgetfromPyQt5.QtimportQPixmap,QPainter,QPoint,QPaintEvent,QMouseEvent,QPen,\ QColor,QSizefromPyQt5.QtCoreimportQtimportos os.environ['TF_CPP_MIN_LOG_LEVEL']='2'#!/usr/bin/env python3# -*- coding: utf-8 -*-fromkeras.datasetsimportmnistimportmatplotlib.pyplotaspltfromkerasimportmodelsfromkerasimportlayersfromkeras.utils.np_utilsimportto_categoricalimportos os.environ['TF_CPP_MIN_LOG_LEVEL']='2'# 定义模型defmodel_conv():model=models.Sequential()model.add(layers.Conv2D(32,(3,3),activation='relu',input_shape=(28,28,1)))model.add(layers.MaxPooling2D((2,2)))model.add(layers.Conv2D(64,(3,3),activation='relu'))model.add(layers.MaxPooling2D((2,2)))model.add(layers.Conv2D(64,(3,3),activation='relu'))model.add(layers.Flatten())model.add(layers.Dense(64,activation='relu'))model.add(layers.Dense(10,activation='softmax'))model.compile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['acc'])returnmodel# 导入MNIST数据集(train_data,train_labels),(test_data,test_labels)=mnist.load_data()print('train_shape {} {}'.format(train_data.shape,train_labels.shape))print('test_shape {} {}'.format(test_data.shape,test_labels.shape))plt.imshow(train_data[0])plt.title('number {}'.format(train_labels[0]))plt.show()# 数据预处理x_train=train_data.reshape((60000,28,28,1))x_train=x_train.astype('float32')/255x_test=test_data.reshape((10000,28,28,1))x_test=x_test.astype('float32')/255y_train=to_categorical(train_labels)y_test=to_categorical(test_labels)print(x_train.shape,y_train.shape)# 定义模型model=model_conv()print(model.summary())# 开始训练his=model.fit(x_train,y_train,epochs=5,batch_size=64,validation_split=0.1)# 计算准确度loss,acc=model.evaluate(x_test,y_test)print('loss {}, acc {}'.format(loss,acc))# 保存模型model.save("my_mnist_model.h5")classSketchpad(QWidget):def__init__(self,Parent=None):super().__init__(Parent)self.__InitData()# 先初始化数据,再初始化界面self.__InitView()def__InitData(self):# 私有变量size,画板初始大小为480,460self.__size=QSize(611,461)# 新建QPixmap作为画板,尺寸为__size# 私有变量__board就是画板实体,大小就是__sizeself.__board=QPixmap(self.__size)self.__board.fill(Qt.white)# 用白色填充画板self.__IsEmpty=True# 默认为空画板self.EraserMode=False# 默认为禁用橡皮擦模式self.__lastPos=QPoint(0,0)# 上一次鼠标位置self.__currentPos=QPoint(0,0)# 当前的鼠标位置self.__painter=QPainter()# 新建绘图工具:画笔self.__thickness=10# 默认画笔粗细为10pxself.__penColor=QColor("black")# 设置默认画笔颜色为黑色self.__colorList=QColor.colorNames()# 获取颜色列表def__InitView(self):# 设置界面的尺寸为__sizeself.setFixedSize(self.__size)defClear(self):# 清空画板self.__board.fill(Qt.white)self.update()self.__IsEmpty=TruedefChangePenColor(self,color="black"):# 改变画笔颜色self.__penColor=QColor(color)defChangePenThickness(self,thickness=10):# 改变画笔粗细self.__thickness=thicknessdefIsEmpty(self):# 返回画板是否为空returnself.__IsEmptydefGetContentAsQImage(self):# 获取画板内容(返回QImage)image=self.__board.toImage()returnimagedefpaintEvent(self,paintEvent):# 绘图事件# 绘图时必须使用QPainter的实例,此处为__painter# 绘图在begin()函数与end()函数间进行# begin(param)的参数要指定绘图设备,即把图画在哪里# drawPixmap用于绘制QPixmap类型的对象self.__painter.begin(self)# 0,0为绘图的左上角起点的坐标,__board即要绘制的图self.__painter.drawPixmap(0,0,self.__board)self.__painter.end()defmousePressEvent(self,mouseEvent):# 鼠标按下时,获取鼠标的当前位置保存为上一次位置self.__currentPos=mouseEvent.pos()self.__lastPos=self.__currentPosdefmouseMoveEvent(self,mouseEvent):# 鼠标移动时,更新当前位置,并在上一个位置和当前位置间画线self.__currentPos=mouseEvent.pos()self.__painter.begin(self.__board)ifself.EraserMode==False:# 非橡皮擦模式self.__painter.setPen(QPen(self.__penColor,self.__thickness))# 设置画笔颜色,粗细else:# 橡皮擦模式下画笔为纯白色,粗细为10self.__painter.setPen(QPen(Qt.white,20))# 画线self.__painter.drawLine(self.__lastPos,self.__currentPos)self.__painter.end()self.__lastPos=self.__currentPos self.update()# 更新显示defmouseReleaseEvent(self,mouseEvent):self.__IsEmpty=False# 画板不再为空5、源码获取方式
🍅由于篇幅限制,获取完整文章或源码、代做项目的,查看【用户名】、【专栏名称】就可以找到我啦🍅
感兴趣的可以先收藏起来,点赞、关注不迷路,下方查看👇🏻获取联系方式👇🏻