【机器学习实战入门】使用Python进行手写数字识别

在这里插入图片描述

什么是手写数字识别?

手写数字识别是计算机识别手写数字的能力。这对手工制造的设备来说是一个难题,因为手写数字并不完美,且人们书写数字的方式多种多样。手写数字识别旨在解决这一问题,通过使用数字的图像来识别该图像中的数字。
在这里插入图片描述

Python 深度学习项目的介绍

python 混合学习项目 - 手写数字识别

在本文中,我们将使用 MNIST 数据集实现一个手写数字识别应用程序。我们将使用一种特殊的深度神经网络,即卷积神经网络(Convolutional Neural Networks)。最终,我们将构建一个图形用户界面(GUI),您可以在其中手绘数字,并立即进行识别。

前提条件

这个有趣的 Python 项目要求您具备基本的 Python 编程知识、使用 Keras 库进行深度学习的知识以及使用 Tkinter 库构建 GUI 的能力。

使用以下命令安装此项目所需的所有库:

pip install numpy, tensorflow, keras, pillow

MNIST 数据集

这可能是机器学习和深度学习爱好者中最为流行的数据集之一。MNIST 数据集包含 60,000 张用于训练的手写数字图像(从零到九)和 10,000 张用于测试的图像。因此,MNIST 数据集有 10 个不同的类别。手写数字图像以 28×28 的矩阵形式表示,其中每个单元格包含一个灰度像素值。

下载项目完整源代码

链接: 【机器学习实战入门】有趣的Python项目:使用OpenCV进行性别和年龄检测-配套代码图片资料

构建 Python 深度学习项目进行手写数字识别

以下是实现手写数字识别项目的步骤:

  1. 导入库并加载数据集
    首先,我们将导入训练模型所需的所有模块。Keras 库已经包含了一些数据集,MNIST 就是其中之一。因此,我们可以轻松地导入数据集并开始使用它。mnist.load_data() 方法会返回给我们训练数据、其标签以及测试数据和其标签。
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K
# 数据集,分为训练集和测试集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
print(x_train.shape, y_train.shape)
  1. 预处理数据
    图像数据不能直接输入到模型中,因此我们需要执行一些操作以处理数据,使其准备好用于我们的神经网络。训练数据的维度为 (60000,28,28)。卷积神经网络(CNN)模型需要一个额外的维度,因此我们将矩阵重新调整为 (60000,28,28,1) 形状。
x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)
input_shape = (28, 28, 1)
# 将类别向量转换为二进制类别矩阵
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'training samples')
print(x_test.shape[0], 'test samples')
  1. 创建模型
    现在我们将在 Python 数据科学项目中创建我们的卷积神经网络(CNN)模型。CNN 模型通常包括卷积层和池化层,它更适合处理以网格结构表示的数据,这也是为什么 CNN 在图像分类任务中表现出色的原因。Dropout 层用于停用一些神经元,在训练过程中可以减少模型的过拟合。然后我们使用 Adadelta 优化器编译模型。
batch_size = 128
num_classes = 10
epochs = 10
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),activation='relu',input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))
model.compile(loss=keras.losses.categorical_crossentropy,optimizer=keras.optimizers.Adadelta(),metrics=['accuracy'])
  1. 训练模型
    Keras 的 model.fit() 函数将开始训练模型。它需要训练数据、验证数据、训练轮数和批次大小作为参数。

模型训练需要一些时间。训练完成后,我们将权重和模型定义保存在 ‘mnist.h5’ 文件中。

hist = model.fit(x_train, y_train,batch_size=batch_size,epochs=epochs,verbose=1,validation_data=(x_test, y_test))
print("The model has successfully trained")
model.save('mnist.h5')
print("Saving the model as mnist.h5")
  1. 评估模型
    我们的数据集中有 10,000 张图像,这些图像将用于评估我们的模型表现如何。测试数据未参与数据的训练过程,因此对模型来说是新的数据。由于 MNIST 数据集非常平衡,我们模型的准确率可以达到约 99%。
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
  1. 创建 GUI 以预测数字
    为了构建 GUI,我们创建了一个新的文件,其中构建了一个交互窗口,用于在画布上绘制数字,并通过一个按钮识别数字。Tkinter 库包含在 Python 标准库中。我们创建了一个 predict_digit() 函数,该函数以图像作为输入,使用训练好的模型来预测数字。

然后我们创建了 App 类,该类负责构建我们应用程序的 GUI。我们创建了一个画布,可以在其中通过捕捉鼠标事件来绘制,通过一个按钮触发 predict_digit() 函数并显示结果。

以下是 gui_digit_recognizer.py 文件的完整代码:

from keras.models import load_model
from tkinter import *
import tkinter as tk
import win32gui
from PIL import ImageGrab, Image
import numpy as np
model = load_model('mnist.h5')
def predict_digit(img):
    # 将图像调整为 28x28 像素
    img = img.resize((28,28))
    # 将 RGB 转换为灰度
    img = img.convert('L')
    img = np.array(img)
    # 重新调整形状以支持模型输入并归一化
    img = img.reshape(1,28,28,1)
    img = img/255.0
    # 预测类别
    res = model.predict([img])[0]
    return np.argmax(res), max(res)
class App(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.x = self.y = 0
        # 创建元素
        self.canvas = tk.Canvas(self, width=300, height=300, bg = "white", cursor="cross")
        self.label = tk.Label(self, text="Thinking..", font=("Helvetica", 48))
        self.classify_btn = tk.Button(self, text = "Recognise", command =         self.classify_handwriting) 
        self.button_clear = tk.Button(self, text = "Clear", command = self.clear_all)
        # 网格结构
        self.canvas.grid(row=0, column=0, pady=2, sticky=W, )
        self.label.grid(row=0, column=1,pady=2, padx=2)
        self.classify_btn.grid(row=1, column=1, pady=2, padx=2)
        self.button_clear.grid(row=1, column=0, pady=2)
        # self.canvas.bind("<Motion>", self.start_pos)
        self.canvas.bind("<B1-Motion>", self.draw_lines)
    def clear_all(self):
        self.canvas.delete("all")
    def classify_handwriting(self):
        HWND = self.canvas.winfo_id() # 获取画布的句柄
        rect = win32gui.GetWindowRect(HWND) # 获取画布的坐标
        im = ImageGrab.grab(rect)
        digit, acc = predict_digit(im)
        self.label.configure(text= str(digit)+', '+ str(int(acc*100))+'%')
    def draw_lines(self, event):
        self.x = event.x
        self.y = event.y
        r=8
        self.canvas.create_oval(self.x-r, self.y-r, self.x + r, self.y + r, fill='black')
app = App()
mainloop()

界面截图:

在这里插入图片描述

  • python 机器学习项目输出数字 2
    在这里插入图片描述

  • python 机器学习项目输出数字 5

在这里插入图片描述

  • python 项目输出数字 6

总结

在本文中,我们成功构建了一个 Python 深度学习项目,实现了手写数字识别应用。我们构建并训练了一个卷积神经网络模型,该模型在图像分类任务中非常有效。随后,我们构建了一个图形用户界面(GUI),可以在其中绘制数字,然后分类数字并显示结果。

参考资料

资料名称链接
Keras 官方文档https://keras.io/
TensorFlow 深度学习教程https://tensorflow.google.cn/
MNIST 数据集官网http://yann.lecun.com/exdb/mnist/
Python Tkinter 教程https://docs.python.org/3/library/tkinter.html
手写数字识别综述https://zhuanlan.zhihu.com/p/35863468
深度学习入门https://www.deeplearning-book.org/
Convolutional Neural Networks (CNN) 简介https://www.cnblogs.com/zyg123/p/8561567.html
Python 图像处理库 Pillow 介绍https://pillow.readthedocs.io/en/stable/
手写数字识别系统实现http://www.cs.ubc.ca/~_written/yangzhang981/courses/532/2016/Handwriting-Recognition.pdf
深度学习框架 Keras 指南https://www.programcreek.com/python/example/54362/keras.models.Sequential
手写数字识别数据预处理https://www.datacamp.com/community/tutorials/mnist-python
Windows GUI 编程教程https://msdn.microsoft.com/zh-cn/library/windows/desktop/ms632586.aspx
手写数字识别实际应用https://ieeexplore.ieee.org/document/8235104
卷积神经网络改进技巧https://towardsdatascience.com/a-keras-pipeline-for-image-classification-4a28f728750a
手写数字识别性能分析https://arxiv.org/abs/1707.09725
MNIST 数据集使用指南https://www.kaggle.com/c/digit-recognizer/data

希望这些资料对您有所帮助!

参考资料:https://data-flair.training/blogs/python-deep-learning-project-handwritten-digit-recognition/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/955401.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

技术晋升读书笔记—华为研发

读完《华为研发》第三版&#xff0c;我深感震撼&#xff0c;书中的内容不仅详实地记录了华为公司的成长历程&#xff0c;还揭示了华为成功背后的管理理念和创新思路。这本书通过真实的案例和数据&#xff0c;展示了华为如何从一个小企业发展成全球通信行业的领导者。 一、关键人…

SQL server数据库导出excel操作

1、选择需要查询的数据库&#xff1a;鼠标右键—>任务—>导出数据 2、 选择数据源和服务器&#xff0c;使用sql server身份验证 &#xff08;数据源就是指需要从哪里导出到excel表格&#xff0c;这里就选择你需要导出的数据库&#xff09; 3、下一步选择要导出的excel表…

javaEE初阶————多线程初阶(2)

今天给大家带来第二期啦&#xff0c;保证给大家讲懂嗷&#xff1b; 1&#xff0c;线程状态 NEW安排了工作还未开始行动RUNNABLE可工作的&#xff0c;或者即将工作&#xff0c;正在工作BLOCKED排队等待WAITING排队等待其他事TIMED_WAITING排队等待其他事TERMINATED工作完成了 …

用LLM做测试驱动开发:有趣又高效的尝试

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

你需要什么样的资源隔离?丨TiDB 资源隔离最佳实践

导读 资源隔离是数据库性能优化的重要环节&#xff0c; TiDB 在当前版本已经实现了从数据级隔离到流控隔离的全面升级 &#xff0c;无论是多系统共享集群、复杂负载隔离&#xff0c;还是小型系统整合和 SQL 精细化控制&#xff0c;TiDB 都提供了灵活且高效的解决方案。 本文以…

1 行命令引发的 Go 应用崩溃

一、前言 不久前&#xff0c;阿里云 ARMS 团队、编译器团队、MSE 团队携手合作&#xff0c;共同发布并开源了 Go 语言的编译时自动插桩技术。该技术以其零侵入的特性&#xff0c;为 Go 应用提供了与 Java 监控能力相媲美的解决方案。开发者只需将 go build 替换为新编译命令 o…

Python毕业设计选题:基于django+vue的宠物服务管理系统

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 宠物商品管理 医疗服务管理 美容服务管理 系统…

Java连接TDengine和MySQL双数据源

git文件地址&#xff1a;项目首页 - SpringBoot连接TDengine和MySQL双数据源:SpringBoot连接TDengine和MySQL双数据源 - GitCode 1、yml配置 spring:datasource:druid:mysql:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/testusername: roo…

三十一、事件过滤处理分析

三十一、事件过滤处理分析eventFilter 实现以下功能 bool QObject::eventFilter(QObject *watched, QEvent *event)&#xff1a; 如果已将此对象安装为所监视对象的事件过滤器&#xff0c;则过滤事件。 在你重新实现这个函数时&#xff0c;如果你想过滤掉事件&#xff0c;即停…

C++ QT中Q_Q和Q_D是什么?怎么使用?本质是什么?C++仿写

1.QT中Q_Q和Q_D是什么&#xff1f; Q_Q可以得到外部可以访问的类指针Q_D可以得到内部封装&#xff0c;外部不可达的类指针 2. 怎么使用&#xff1f; 上代码 APrivate.h #pragma once #include <QtCore>class A;class APrivate {Q_DECLARE_PUBLIC(A) public:APrivate(…

三种文本相似计算方法:规则、向量与大模型裁判

文本相似计算 项目背景 目前有众多工作需要评估字符串之间的相似(相关)程度&#xff1a;  比如&#xff0c;RAG 智能问答系统文本召回阶段需要计算用户文本与文本库内文本的相似分数&#xff0c;返回前TopK个候选文本。  在评估大模型生成的文本阶段&#xff0c;也需要评估…

高效实现 Markdown 转 PDF 的跨平台指南20250117

高效实现 Markdown 转 PDF 的跨平台指南 引言 Markdown 文件以其轻量化和灵活性受到开发者和技术写作者的青睐&#xff0c;但如何将其转换为易于分享和打印的 PDF 格式&#xff0c;是一个常见需求。本文整合了 macOS、Windows 和 Linux 三大平台的转换方法&#xff0c;并探讨…

浅谈云计算21 | Docker容器技术

Docker容器技术 一、 容器技术特性1.1 轻量级特性1.2 隔离性特性 二、容器镜像2.1 容器镜像概述2.1.1 定义与构成2.1.2 分层结构 2.2 联合文件系统2.3 容器镜像的构建与管理2.3.1 容器镜像的构建2.3.2 **构建镜像流程**2.3.3 **应用场景**2.3.4 镜像仓库的应用 2.4 容器镜像的优…

LabVIEW实现油浸式变压器自主监测与实时报告

油浸式变压器广泛应用于电力系统中&#xff0c;尤其是在电力传输和分配领域。为了确保变压器的安全、稳定运行&#xff0c;及时监测其工作状态至关重要。传统的变压器监测方法通常依赖人工巡检和定期检查&#xff0c;但这不能及时发现潜在的故障隐患&#xff0c;且效率较低。随…

【2025最新】国内中文版 ChatGPT镜像网站整理合集,GPT最新模型4o1,4o,4o-mini分类区别,镜像站是什么

1.快速导航 原生中转型镜像站点 立即Chat支持GPT4、4o以及o1,canvs等&#xff0c;同步官网功能 AIChat.com 支持最新4O 2.两者对比 官网立即Chat访问难度需要魔法直接访问支付手段国际支付国内支付封禁策略检测节点&#xff0c;随时封禁不会封禁价格每月140元订阅费用每年70元…

SpringBoot:RestTemplate与IllegalArgumentException

问题描述 在SpringBoot应用中&#xff0c;有时会遇到使用RestTemplate调用第三方服务的场景。例如&#xff1a;在进行地名数据采集时&#xff0c;为了拿到地名对应的经纬度位置&#xff0c;通常会有地理编码的步骤&#xff0c;此时就可能涉及到调用第三方接口服务实现此需求。 …

【日志篇】(7.6) ❀ 01. 在macOS下刷新FortiAnalyzer固件 ❀ FortiAnalyzer 日志分析

【简介】FortiAnalyzer 是 Fortinet Security Fabric 安全架构的基础&#xff0c;提供集中日志记录和分析&#xff0c;以及端到端可见性。因此&#xff0c;分析师可以更有效地管理安全状态&#xff0c;将安全流程自动化&#xff0c;并快速响应威胁。具有分析和自动化功能的集成…

HTML中如何保留字符串的空白符和换行符号的效果

有个字符串 储值门店{{thing3.DATA}}\n储值卡号{{character_string1.DATA}}\n储值金额{{amount4.DATA}}\n当前余额{{amount5.DATA}}\n储值时间{{time2.DATA}} &#xff0c; HTML中想要保留 \n的换行效果的有下面3种方法&#xff1a; 1、style 中 设置 white-space: pre-lin…

【腾讯云】AI驱动TDSQL-C Serveress 数据库技术实战营-如何是从0到1体验电商可视化分析小助手得统计功能,一句话就能输出目标统计图

欢迎来到《小5讲堂》 这是《腾讯云》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景效果图流程图创建数据库 基本信息数据库配置设置密码控制台开…

基于预共享密钥的IPsec实验

一、实验目的 &#xff08;1&#xff09;了解IPsec的原理和协议运行机制&#xff1b; &#xff08;2&#xff09;掌握IPsec身份认证的预共享密钥的配置&#xff1b; &#xff08;3&#xff09;掌握用Wireshark工具抓包分析IPsec数据包格式和协议流程。 二、实验设备与环境 &…