news 2026/3/8 0:32:46

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

作者头像

张小明

前端开发工程师

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

博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅

点击查看作者主页,了解更多项目!

🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅

1、毕业设计:2025年计算机专业毕业设计选题汇总(建议收藏)✅

2、最全计算机专业毕业设计选题大全(建议收藏)✅

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、项目获取

(绿色聊天软件)yuanmazhiwu 或 biyesheji0005

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

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

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

AI如何用CASE WHEN简化SQL开发?

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 请生成一个完整的SQL查询示例,使用CASE WHEN语句实现多条件分类逻辑。要求包含:1. 根据用户年龄分段(18岁以下、18-35岁、35岁以上)…

作者头像 李华
网站建设 2026/3/5 14:16:05

1小时搭建Github下载加速代理服务

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个Github加速代理的快速部署方案,包含:1.云服务器配置脚本 2.Nginx反向代理配置 3.自动更新镜像源列表 4.使用量监控 5.多用户支持。提供Docker部署方…

作者头像 李华
网站建设 2026/3/5 17:12:34

AI如何解决NumPy版本兼容性问题?

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个Python工具,能够自动检测当前环境中安装的NumPy版本与模块所需的NumPy版本是否兼容。当检测到不兼容时(例如模块需要NumPy 1.x但当前环境是NumPy 2…

作者头像 李华
网站建设 2026/3/5 23:35:09

传统解谜vsAI辅助:‘寿春之战‘解题效率对比

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个对比演示应用,展示人工解谜和AI解谜太虚幻境寿春之战的过程差异。左侧展示传统解谜步骤(手动输入),右侧展示AI实时解析&…

作者头像 李华
网站建设 2026/3/6 3:55:45

AI如何提升NMAP扫描效率与智能化分析

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个基于AI的NMAP增强工具,能够自动分析扫描结果,识别潜在漏洞,并提供修复建议。工具应支持自定义扫描策略,自动生成报告&#…

作者头像 李华