news 2026/7/30 4:37:19

深度学习:python手写数字识别系统 CNN算法 卷积神经网络 OpenCV和Keras模型 计算机视觉 毕业设计(建议收藏)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深度学习:python手写数字识别系统 CNN算法 卷积神经网络 OpenCV和Keras模型 计算机视觉 毕业设计(建议收藏)

博主介绍:✌全网粉丝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、源码获取方式

🍅由于篇幅限制,获取完整文章或源码、代做项目的,查看【用户名】、【专栏名称】就可以找到我啦🍅

感兴趣的可以先收藏起来,点赞、关注不迷路,下方查看👇🏻获取联系方式👇🏻

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/30 1:07:37

9 个降AI率工具推荐,专科生高效避坑指南

9 个降AI率工具推荐,专科生高效避坑指南 AI降重工具:专科生高效避坑的必备利器 随着人工智能技术的快速发展,越来越多的学术写作开始依赖AI生成内容。然而,AI生成的论文在查重系统中往往容易被识别出高AIGC率,导致论…

作者头像 李华
网站建设 2026/7/26 17:24:42

如何快速掌握波特律动串口助手:新手完整教程

如何快速掌握波特律动串口助手:新手完整教程 【免费下载链接】SerialAssistant A serial port assistant that can be used directly in the browser. 项目地址: https://gitcode.com/gh_mirrors/se/SerialAssistant 波特律动串口助手是一款基于浏览器的串口…

作者头像 李华
网站建设 2026/7/29 11:08:49

终极指南:如何在ComfyUI中部署BiRefNet实现专业级背景移除

终极指南:如何在ComfyUI中部署BiRefNet实现专业级背景移除 【免费下载链接】ComfyUI-BiRefNet-ZHO Better version for BiRefNet in ComfyUI | Both img & video 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-BiRefNet-ZHO 想要在ComfyUI工作流…

作者头像 李华
网站建设 2026/7/30 7:35:35

5个让你爱上TTS-Vue的真实使用场景:告别机器音的时代来了!

5个让你爱上TTS-Vue的真实使用场景:告别机器音的时代来了! 【免费下载链接】tts-vue 🎤 微软语音合成工具,使用 Electron Vue ElementPlus Vite 构建。 项目地址: https://gitcode.com/gh_mirrors/tt/tts-vue 还在为那些…

作者头像 李华
网站建设 2026/7/30 3:47:09

openpilot车道检测终极指南:从暴雨到逆光的全天候解决方案

openpilot车道检测终极指南:从暴雨到逆光的全天候解决方案 【免费下载链接】openpilot openpilot 是一个开源的驾驶辅助系统。openpilot 为 250 多种支持的汽车品牌和型号执行自动车道居中和自适应巡航控制功能。 项目地址: https://gitcode.com/GitHub_Trending/…

作者头像 李华
网站建设 2026/7/30 14:44:16

GetBox-PyMOL-Plugin:分子对接盒子计算神器

还在为分子对接盒子的设置而烦恼吗?GetBox-PyMOL-Plugin正是你需要的解决方案!这款专为PyMOL设计的插件能够智能计算对接盒子参数,支持LeDock、AutoDock和AutoDock Vina等主流对接软件,让药物研发工作事半功倍。 【免费下载链接】…

作者头像 李华