深度学习实战 | 卷积神经网络LeNet手写数字识别(带手写板GUI界面)

本文主要是介绍深度学习实战 | 卷积神经网络LeNet手写数字识别(带手写板GUI界面),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引言

在深度学习领域,卷积神经网络(Convolutional Neural Network, CNN)是一种广泛应用于图像识别任务的神经网络结构。LeNet是一种经典的CNN结构,被广泛应用于基础的图像分类任务。本文将介绍如何使用LeNet卷积神经网络实现手写数字识别,并使用Pytorch实现LeNet手写数字识别,使用PyQt5实现手写板GUI界面,使用户能够通过手写板输入数字并进行识别。

请添加图片描述

完整代码下载:Python手写数字识别带手写板GUI界面 Pytorch代码 含训练模型 (付费资源,如果你觉得这篇博客对你有帮助,欢迎购买支持~)

1. LeNet卷积神经网络

LeNet是由Yann LeCun等人于1998年提出的卷积神经网络结构,主要用于手写字符识别。在本文中,我们将使用LeNet结构构建一个用于手写数字识别的神经网络模型。以下是LeNet的基本结构:

请添加图片描述

Layer 1: Convolutional Layer- Input: 28x28x1 (灰度图像)- Filter: 5x5, Stride: 1, Depth: 6- Activation: Sigmoid- Output: 28x28x6Layer 2: Average Pooling Layer- Input: 28x28x6- Pooling: 2x2, Stride: 2- Output: 14x14x6Layer 3: Convolutional Layer- Input: 14x14x6- Filter: 5x5, Stride: 1, Depth: 16- Activation: Sigmoid- Output: 10x10x16Layer 4: Average Pooling Layer- Input: 10x10x16- Pooling: 2x2, Stride: 2- Output: 5x5x16Layer 5: Fully Connected Layer- Input: 5x5x16- Output: 120- Activation: SigmoidLayer 6: Fully Connected Layer- Input: 120- Output: 84- Activation: SigmoidLayer 7: Output Layer- Input: 84- Output: 10 (对应0-9的数字)- Activation: Softmax

2. 手写数字识别实现

使用深度学习框架(例如Pytorch)构建LeNet模型:

import torch
import torch.nn as nn
import torch.nn.functional as Fclass LeNet(nn.Module):def __init__(self):super(LeNet, self).__init__()self.conv1 = nn.Conv2d(1, 6, kernel_size=5)self.pool1 = nn.AvgPool2d(kernel_size=2, stride=2)self.conv2 = nn.Conv2d(6, 16, kernel_size=5)self.pool2 = nn.AvgPool2d(kernel_size=2, stride=2)self.fc1 = nn.Linear(16 * 5 * 5, 120)self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 10)def forward(self, x):x = F.sigmoid(self.conv1(x))x = self.pool1(x)x = F.sigmoid(self.conv2(x))x = self.pool2(x)x = x.view(-1, 16 * 5 * 5)x = F.sigmoid(self.fc1(x))x = F.sigmoid(self.fc2(x))x = self.fc3(x)return F.log_softmax(x, dim=1)

并使用手写数字数据集MNIST进行训练。确保正确实现数据预处理和模型训练过程:

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.autograd import Variable
from net import Netif __name__ == "__main__":# 设置训练参数batch_size = 64epochs = 140device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")# 数据集transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,), (0.5,))])trainset = datasets.MNIST('~/.pytorch/MNIST_data/', download=True, train=True, transform=transform)trainloader = torch.utils.data.DataLoader(trainset, batch_size=batch_size, shuffle=True)# 输出提示信息print("batch_size:", batch_size)print("data_batches:", len(trainloader))print("epochs:", epochs)# 神经网络net = Net().to(device)net.load_state_dict(torch.load('model.pth'))# 损失函数和优化器criterion = nn.NLLLoss()optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)# 训练网络for epoch in range(epochs):running_loss = 0.0for i, data in enumerate(trainloader, 0):inputs, labels = datainputs, labels = Variable(inputs).to(device), Variable(labels).to(device)# 反向传播优化参数optimizer.zero_grad()outputs = net(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()if i % 938 == 937:    # 每轮输出损失值print('[epoch: %d, batches: %d] loss: %.5f' %(epoch + 1, i + 1, running_loss / 2000))running_loss = 0.0torch.save(net.state_dict(), './model.pth')  # 每轮保存模型参数print('Finished Training')

3. 手写板GUI界面开发

模型训练完成后,为了让用户通过手写板输入数字,我们将开发一个简单直观的GUI界面。使用GUI库(例如PyQt5),创建一个窗口,包含一个手写板区域,用户可以在上面写数字。添加一个识别按钮,点击后将手写板上的数字送入LeNet模型进行识别,并在界面上显示识别结果。

以下是PyQt5代码示例:

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sysimport torch
from utils import *
from net import Netclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.title = '手写数字识别'self.initUI()def initUI(self):self.setWindowTitle(self.title)self.setMinimumSize(500, 400)self.main_widget = QWidget()self.main_layout = QGridLayout()self.main_widget.setLayout(self.main_layout)self.setCentralWidget(self.main_widget)self.canvas = Canvas()self.canvas.setFixedSize(300,300)self.label = QLabel()self.label.setFixedSize(100,100)self.label.setText('识别结果')self.label.setStyleSheet("font-size:15px;color:red") self.clear_button = QPushButton('清除')self.clear_button.setFixedSize(100,50)self.clear_button.clicked.connect(self.canvas.clear)self.recognize_button = QPushButton('识别')self.recognize_button.setFixedSize(100,50)self.recognize_button.clicked.connect(self.recognize)self.main_layout.addWidget(self.canvas,0,0,3,1)self.main_layout.addWidget(self.label,0,1)self.main_layout.addWidget(self.clear_button,1,1)self.main_layout.addWidget(self.recognize_button,2,1)def recognize(self):self.canvas.recognize()self.label.setText('识别结果: ' + str(self.canvas.recognize()))class Canvas(QLabel):x0=-10; y0=-10; x1=-10; y1=-10def __init__(self):super(Canvas,self).__init__()self.pixmap = QPixmap(300, 300)self.pixmap.fill(Qt.white)self.Color=Qt.blueself.penwidth=10def paintEvent(self,event):painter=QPainter(self.pixmap)painter.setPen(QPen(self.Color,self.penwidth,Qt.SolidLine))painter.drawLine(self.x0,self.y0,self.x1,self.y1)Label_painter=QPainter(self)Label_painter.drawPixmap(2,2,self.pixmap)def mousePressEvent(self, event):self.x1=event.x()self.y1=event.y()def mouseMoveEvent(self, event):self.x0 = self.x1self.y0 = self.y1self.x1 = event.x()self.y1 = event.y()self.update()def clear(self):self.x0=-10; self.y0=-10; self.x1=-10; self.y1=-10self.pixmap.fill(Qt.white)self.update()def recognize(self):arr = pixmap2np(self.pixmap)arr = 255 - arr[:,:,2]arr = clip_image(arr)arr = resize_image(arr)arr = np.expand_dims(arr, axis=0)arr_batch = np.expand_dims(arr, axis=0)tensor = torch.FloatTensor(arr_batch)tensor = (tensor/255 - 0.5) * 2possibles = net(tensor).detach().numpy()result = np.argmax(possibles)return resultif __name__ == '__main__':net = Net()net.load_state_dict(torch.load('model.pth'))app = QApplication(sys.argv)win = MainWindow()win.show()sys.exit(app.exec_())

这个例子中,用户可以在手写板上写数字,点击识别按钮后,程序将手写板上的数字送入LeNet模型进行识别,并在界面上显示识别结果。

通过本文的实践,你可以学到如何使用LeNet卷积神经网络实现手写数字识别,以及如何结合GUI开发一个手写板界面,更直观地进行数字识别交互。希望这篇博客对有所帮助。

完整代码下载:Python手写数字识别带手写板GUI界面 Pytorch代码 含训练模型 (付费资源,如果你觉得这篇博客对你有帮助,欢迎购买支持~)

这篇关于深度学习实战 | 卷积神经网络LeNet手写数字识别(带手写板GUI界面)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/677880

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

从去中心化到智能化:Web3如何与AI共同塑造数字生态

在数字时代的演进中,Web3和人工智能(AI)正成为塑造未来互联网的两大核心力量。Web3的去中心化理念与AI的智能化技术,正相互交织,共同推动数字生态的变革。本文将探讨Web3与AI的融合如何改变数字世界,并展望这一新兴组合如何重塑我们的在线体验。 Web3的去中心化愿景 Web3代表了互联网的第三代发展,它基于去中心化的区块链技术,旨在创建一个开放、透明且用户主导的数字生态。不同于传统

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount