基于深度学习CNN算法的手写汉字识别系统01--带数据集-pyqt5UI界面-全套源码

各位同学大家好,本次给大家分享的项目为:

基于深度学习算法的手写汉字识别系统01

项目文件获取地址:

百度网盘链接:https://pan.baidu.com/s/113O8cGN3hfpkKkik6WQfhQ?pwd=ij5e 
提取码: ij5e

一、项目摘要

本研究设计并实现了一个基于深度学习的手写汉字识别系统,旨在通过优化模型结构和训练策略,提高对手写汉字的识别精度。系统采用了MobileNet卷积神经网络结构,并使用PyTorch框架进行模型搭建和训练。实验数据来自中科院手写汉字数据集,包含200类汉字,总计59699张图像。数据预处理过程中,使用图像裁剪、翻转和归一化等操作,以提升模型的泛化能力。训练过程中,设定Epoch数为60,采用AdamW优化器和交叉熵损失函数,并以验证集损失值最低点作为模型参数的最佳选择标准。实验结果显示,该模型在验证集上的最高准确率达到了96%,平均准确率为98%,证明了系统的有效性。此外,本文利用PyQt5库开发了用户交互界面,实现了手写汉字图像的选择与识别功能,提升了系统的实用性。整体而言,本系统展示了基于深度学习的手写汉字识别技术在实际应用中的潜力与优势。

二、项目运行效果

运行效果视频:
https://www.bilibili.com/video/BV15TUpYEEwL

运行效果截图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、项目文件介绍

在这里插入图片描述在这里插入图片描述

四、项目环境配置

1、项目环境库

python=3.8 pytorch pyqt5 opencv matplotlib 等

2、环境配置视频教程

1)anaconda下载安装教程
2)pycharm下载安装教程
3)项目环境库安装步骤教程

五、项目系统架构

在这里插入图片描述

整个系统由数据上传模块、模型加载模块、图像处理模块、识别模块和用户界面模块五个主要部分组成,各模块功能如下

  • 数据上传模块:负责接收用户输入的手写汉字图像。
  • 模型加载模块:在系统启动时加载MobileNet模型及其预训练的最佳权重,以确保系统在初始化后可以直接调用模型进行识别。
  • 图像处理模块:负责对用户输入的手写汉字图像进行预处理,包括图像的缩放、归一化等操作,以符合模型的输入要求(224×224大小,标准化参数)。
  • 识别模块:将处理后的图像输入模型,获取模型预测的汉字类别,并将结果返回给界面模块进行显示。
  • 用户界面模块:基于PyQt5库设计的交互界面,允许用户选择汉字图像并查看识别结果。**

六、项目构建流程

1、数据集

数据集文件夹:all_data

在这里插入图片描述

概述:

本研究使用了中国科学院提供的手写汉字数据集,选取其中200类汉字,总计59699张图像,具有较高的类别丰富度和样本数量,适合对汉字识别系统进行有效训练和评估。
在这里插入图片描述

为了增强数据的多样性并提升模型的鲁棒性,数据预处理过程包括对图像的裁剪、翻转和归一化处理。这些操作不仅能够增加样本的多样性,还能减少因图像尺寸和方向变化对模型带来的识别干扰。/

数据集格式及命令统一代码:to_rgb.py
(对数据集中的图像统一成rgb格式并进行统一规范命名)

在这里插入图片描述

2、算法网络Mobilenet

概述:
MobileNet的核心是深度可分离卷积操作,它将传统的卷积操作分解为两个步骤:深度卷积和逐点卷积。这一分解方式可以极大减少卷积操作的参数量和计算量。

  • 深度卷积(Depthwise Convolution):对输入的每一个通道独立地进行卷积操作,这一操作仅对空间信息进行提取,并不改变通道数量。

  • 逐点卷积(Pointwise Convolution):使用1×1的卷积核对深度卷积的输出进行通道整合,将不同通道的信息融合在一起,以生成更具代表性的特征。
    在这里插入图片描述
    这种卷积方式相比传统卷积操作减少了大量的计算开销,使得MobileNet在保持较高精度的同时显著降低了运算需求,适合在实时性要求较高的场景中应用。

算法代码为:models文件夹下的mobilenet.py

在这里插入图片描述

"""mobilenet in pytorch



[1] Andrew G. Howard, Menglong Zhu, Bo Chen, Dmitry Kalenichenko, Weijun Wang, Tobias Weyand, Marco Andreetto, Hartwig Adam

    MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
    https://arxiv.org/abs/1704.04861
"""

import torch
import torch.nn as nn


class DepthSeperabelConv2d(nn.Module):

    def __init__(self, input_channels, output_channels, kernel_size, **kwargs):
        super().__init__()
        self.depthwise = nn.Sequential(
            nn.Conv2d(
                input_channels,
                input_channels,
                kernel_size,
                groups=input_channels,
                **kwargs),
            nn.BatchNorm2d(input_channels),
            nn.ReLU(inplace=True)
        )

        self.pointwise = nn.Sequential(
            nn.Conv2d(input_channels, output_channels, 1),
            nn.BatchNorm2d(output_channels),
            nn.ReLU(inplace=True)
        )

    def forward(self, x):
        x = self.depthwise(x)
        x = self.pointwise(x)

        return x


class BasicConv2d(nn.Module):

    def __init__(self, input_channels, output_channels, kernel_size, **kwargs):

        super().__init__()
        self.conv = nn.Conv2d(
            input_channels, output_channels, kernel_size, **kwargs)
        self.bn = nn.BatchNorm2d(output_channels)
        self.relu = nn.ReLU(inplace=True)

    def forward(self, x):
        x = self.conv(x)
        x = self.bn(x)
        x = self.relu(x)

        return x


class MobileNet(nn.Module):

    """
    Args:
        width multipler: The role of the width multiplier α is to thin
                         a network uniformly at each layer. For a given
                         layer and width multiplier α, the number of
                         input channels M becomes αM and the number of
                         output channels N becomes αN.
    """

    def __init__(self, width_multiplier=1, class_num=100):
       super().__init__()

       alpha = width_multiplier
       self.stem = nn.Sequential(
           BasicConv2d(3, int(32 * alpha), 3, padding=1, bias=False),
           DepthSeperabelConv2d(
               int(32 * alpha),
               int(64 * alpha),
               3,
               padding=1,
               bias=False
           )
       )

       #downsample
       self.conv1 = nn.Sequential(
           DepthSeperabelConv2d(
               int(64 * alpha),
               int(128 * alpha),
               3,
               stride=2,
               padding=1,
               bias=False
           ),
           DepthSeperabelConv2d(
               int(128 *
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值