首页 > 其他分享 >基于深度学习的手写数字和符号识别系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

基于深度学习的手写数字和符号识别系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

时间:2024-04-05 17:12:13浏览次数:39  
标签:数字 训练 符号 模型 YOLOv8 v5 v7 手写 识别

摘要:在本篇博客中,我们深入研究了基于YOLOv8/v7/v6/v5的手写数字和符号识别系统。本系统的核心采用了YOLOv8技术,并整合了YOLOv7YOLOv6YOLOv5算法来进行性能指标的对比分析。我们详细地回顾了国内外在手写数字和符号识别领域的研究现状,并对使用到的数据集处理方法算法原理模型构建与训练代码进行了全面的介绍。特别地,我们还设计了一个基于Streamlit的交互式Web应用界面,该界面不仅支持通过图像、视频以及实时摄像头进行手写数字和符号的识别,还允许用户上传不同的训练模型(YOLOv8/v7/v6/v5)来进行推理预测,界面的设计保证了修改的便捷性。
本系统特别适合需要进行快速、高效识别手写数字和符号的应用场景,无论是在线教育、自动化表单处理还是智能交互系统都能展现出其强大的实用性。通过本文提供的完整网页设计深度学习模型代码以及训练数据集的下载链接,读者可以轻松地复现我们的成果,进一步探索和优化手写数字及符号识别的各种可能性。

@

目录

➷点击跳转至文末所有涉及的完整代码文件下载页☇


完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频https://www.bilibili.com/video/BV1Nx421D7EY/
YOLOv8/v7/v6/v5项目合集下载https://mbd.pub/o/bread/mbd-ZZ2YmJtr
YOLOv8和v5项目完整资源下载https://mbd.pub/o/bread/mbd-ZZ2Ykpdt
YOLOv7项目完整资源下载https://mbd.pub/o/bread/mbd-ZZ2Yl5ls
YOLOv6项目完整资源下载https://mbd.pub/o/bread/mbd-ZZ2Yl55r

        若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:


1. 网页功能与效果

        (1)开启摄像头实时检测:本系统提供了一键开启摄像头的实时检测功能,允许用户通过简单点击即可激活摄像头,并实时展示手写数字和符号的检测结果。这项功能特别适合需要快速识别手写内容的场景,如会议记录、教学互动等。

        (2)选择图片检测:用户可以轻松选择本地存储的图片文件进行检测。系统能够快速读取图片,并展示出检测到的手写数字和符号,包括它们的位置、类别和置信度信息。这对于处理静态文档和手写笔记尤其有用。

        (3)选择视频文件检测:除了静态图片,本系统还支持选择并上传视频文件进行连续检测。通过这项功能,用户可以分析视频中的手写内容,系统会在视频播放过程中实时标注和识别手写数字和符号。

        (4)选择不同训练好的模型文件:为了满足不同用户的需求,我们的系统提供了切换不同预训练模型文件的功能。用户可以根据自己的具体需求,选择最适合手写数字和符号识别场景的模型,以获得最佳的检测效果。

        在我们的系统中,开启摄像头实时检测功能允许用户直接通过网页界面访问摄像头,实时显示和识别画面中的手写数字和符号,提供即时反馈。而选择图片检测选择视频文件检测功能则让用户能够上传本地的图片或视频文件,系统将自动分析并展示识别结果,无论是静态图像还是动态视频均能精确识别。

        为了满足不同场景下的需求,系统还设计了选择不同训练好的模型文件功能,用户可以根据自己的需要选择不同版本的YOLO模型进行识别,从而在准确度和处理速度之间找到最佳平衡。在效果展示方面,系统支持检测画面和原始画面的同时或单独显示,增强了用户体验,使用户能够直观地比较检测结果与原始画面之间的差异。通过可点击下拉框单独标记特定目标并显示结果的设计,用户可以专注于感兴趣的手写数字和符号类型,提高了识别的针对性和效率。同时,所有检测结果都会保存在页面表格显示,并且用户还可以动态调整检测算法的置信度阈值和IOU阈值,这些灵活的配置选项大大提升了系统的实用性和准确性。

        最后,为了便于用户将检测结果用于进一步分析或存档,系统提供了功能强大的结果导出选项。用户可以将检测结果的表格输出到csv文件,或将标记后的检测结果导出为avi图像文件,这些导出功能的加入极大地增强了系统的应用价值。综上所述,基于YOLOv8/v7/v6/v5的手写数字和符号识别系统通过其全面的功能和卓越的用户体验,不仅能够满足专业领域内的高标准需求,也为广大用户提供了一种便捷、高效的手写数字和符号识别工具。


2. 绪论

2.1 研究背景及意义

        在数字化时代,手写数字和符号识别技术在自动表单处理、智能交互系统、教育技术等领域扮演着日益重要的角色。随着深度学习技术的飞速发展,尤其是目标检测算法的不断进步,我们已经能够实现相当高的识别精度和速度,极大地推动了手写识别技术的应用范围和效率。YOLO(You Only Look Once)系列算法,从YOLOv1到最新的YOLOv8,以其卓越的检测速度和准确率,在众多领域中都有广泛应用。然而,手写数字和符号的多样性、复杂性以及实时处理的需求,仍然提出了一系列挑战,需要不断地算法创新和技术进步来解决。

        近年来,研究者们通过深入研究深度学习模型,尤其是在YOLO算法上的改进,已经取得了显著的进展。例如,通过引入更加复杂的网络结构、改进的训练策略以及更有效的数据增强技术,研究者们成功提升了模型在各种手写数字和符号识别任务上的性能。此外,随着大规模和多样化的数据集的构建,模型训练的广度和深度得到了进一步的加强,从而能够更好地应对现实世界数据的复杂性和多样性。

        尽管取得了一系列进展,手写数字和符号识别领域仍面临着一些亟待解决的问题,如如何进一步提升识别精度和速度,如何有效地处理极端变化的手写样式,以及如何提高模型对于不同语言和符号系统的适应性。为了解决这些问题,本博客提出了一系列基于最新YOLO算法(包括YOLOv5至YOLOv8)的改进方案,包括但不限于利用更先进的网络架构、优化的损失函数、以及创新的注意力机制等技术。

        在这一背景下,本博客的目的是探讨基于YOLOv8/v7/v6/v5的手写数字和符号识别系统的研究背景及其意义。通过综合运用最新的深度学习算法、优化的数据集处理方法以及先进的技术手段,本研究旨在解决夜间手写数字和符号检测中遇到的一系列挑战,提高检测的准确性、效率和鲁棒性。我们的工作不仅关注算法本身的改进,也着眼于如何将这些技术应用到实际场景中,为相关领域的发展做出贡献。

2.2 国内外研究现状

        目前,手写数字和符号识别领域正经历着前所未有的技术革新,特别是深度学习和目标检测算法的飞速发展,极大地推动了这一领域的研究进展。在最新的研究中,不仅仅是传统的YOLO系列算法得到了显著的改进,其他算法也展现出了巨大的潜力和优势。接下来,我们将深入探讨这一研究领域的最新进展,特别关注于YOLO算法及其他相关深度学习算法在手写数字和符号识别任务上的应用和改进。

        首先,YOLOv8作为YOLO系列中的最新研究成果,延续了YOLO系列高速、高精度的特点,并在网络结构、训练策略以及数据处理方法上进行了全面的优化和改进[1]。其次,YOLOv7通过引入更加高效的特征提取网络和注意力机制,显著提高了模型对于小对象和复杂背景下手写符号的识别能力[2]。此外,YOLOv6的研究则专注于优化模型的速度与精度平衡,通过创新的模型压缩和加速技术,使得在边缘设备上的部署成为可能[3]

        除了YOLO系列,其他深度学习算法也在手写数字和符号识别领域取得了突破。例如,Transformer模型因其在处理序列数据上的卓越性能,被逐渐应用于图像识别领域。研究表明,通过将Transformer与卷积神经网络(CNN)相结合,可以有效提升模型对手写内容的理解和识别能力[4]。此外,基于Capsule网络的研究也展示了其在处理图像中空间层次关系上的优势,对提高手写数字和符号识别的精确度具有重要意义[5]

        在其他算法方面,RetinaNet通过引入Focal Loss解决了类别不平衡问题,使得模型在检测到手写数字和符号时能够减少背景的干扰。Faster R-CNN作为一个两阶段的检测框架,通过区域建议网络(RPN)精确地定位到手写数字和符号,展现了良好的精度。DETR则引入了端到端的目标检测机制,通过全局视角减少了对NMS等后处理步骤的依赖,这对于包含大量紧密排列手写字符的场景尤为有用。MMDetection作为一个开放源代码的检测工具箱,汇集了上述众多算法,提供了在手写数字和符号识别任务上的快速试验与应用平台。

        这些最新的研究成果不仅提升了手写数字和符号识别的性能,也为解决该领域面临的一系列挑战提供了新的思路和方案。例如,如何处理手写体的多样性和变化、如何在极低资源消耗下保持高识别准确率、以及如何有效利用不断增长的数据集进行模型训练等问题,都在最新的研究中得到了关注和探索。

2.3 要解决的问题及其方案

2.3.1 要解决的问题

        在开发基于YOLOv8/v7/v6/v5的手写数字和符号识别系统时,我们面临了一系列具体的挑战和问题,同时也设计了相应的解决方案来应对这些问题。以下是系统开发过程中的主要关注点及其解决策略:

  1. 手写数字和符号识别的准确性和速度

        手写数字和符号因其多样性和复杂性,对识别系统提出了高准确度识别与快速处理的挑战。手写样式的差异性大,包括不同的书写习惯、笔迹粗细、倾斜角度等,都需要模型能够准确捕捉和识别。同时,为了实现实时处理,系统需要具备高效的推理能力。

  1. 模型的泛化能力与环境适应性

        手写识别模型需要适应各种背景、光照条件和噪声干扰的情况,保持高准确率。模型的泛化能力对于处理真实世界中的手写数字和符号至关重要,这要求模型能在多样化的数据集上进行训练并优化。

  1. 用户交互界面的直观性和功能性

        基于Streamlit的网页设计需要直观易用,支持图片、视频、实时摄像头的检测功能,并允许用户轻松切换不同的模型文件。界面的美化和交互性对于提升用户体验有重要意义。

  1. 数据处理能力和存储效率

        系统需处理大量的图像和视频数据,这就要求具备高效的数据处理能力。同时,考虑到存储效率和数据安全性,我们需要设计高效的数据存储解决方案,并实施适当的数据保护措施。

  1. 系统的可扩展性和维护性

        未来可能需要扩展系统以支持更多的功能或集成新的检测模型。因此,系统的架构设计需考虑到可扩展性和维护性,确保能够轻松地添加新功能或更新模型。

2.3.2 解决方案

        针对手写数字和符号识别系统的设计与实现,我们提出了一系列解决方案,旨在应对准确性、速度、环境适应性、用户交互以及数据处理等方面的挑战。这些解决方案结合了当前最先进的深度学习技术和用户友好的网页设计,确保了系统既高效又实用。

  1. 深度学习模型的选择和优化: 选择YOLOv8/v7/v6/v5系列作为我们的核心深度学习模型。这些模型在速度和准确度之间提供了出色的平衡,特别是它们对于实时处理和高准确度识别任务的能力,非常适合手写数字和符号的识别。为了提高模型的泛化能力,我们将采用多种数据增强技术,如随机裁剪、缩放、旋转和色彩调整等。这些技术可以模拟各种实际场景下的手写数字和符号,增强模型的适应性。同时,利用在大规模通用数据集上预训练的模型作为起点,通过迁移学习对特定的手写数字和符号数据集进行微调。这将帮助我们加快训练速度并提高模型的识别性能。

  2. 技术框架和开发工具: 我们选择PyTorch作为深度学习的主要框架,并利用Streamlit来设计一个美观、直观且功能丰富的网页界面。这使得用户可以轻松地上传图片、视频或通过实时摄像头进行手写数字和符号识别,同时也能够便捷地切换不同的模型文件以适应不同的识别需求。PyCharm作为我们的开发IDE,为我们的代码编写、调试和版本控制提供了极大的便利。

  3. 功能实现和系统设计: 我们的系统支持多种输入源,并实现了动态模型切换功能,这不仅提高了系统的灵活性和适用范围,也优化了用户体验。为了保护用户信息,我们还开发动态模型切换功能,允许用户根据不同的需求选择不同的预训练模型。这增加了系统的灵活性和适用范围,使其能够适应不同用户的特定需求。

  4. 数据处理和存储策略: 利用PyTorch的高效数据加载和预处理机制,确保数据处理流程的实时性和高效性。同时,采用高效的数据存储方案,对识别结果和历史数据进行智能组织和索引,便于后续的查询和分析。

        通过实施上述解决方案,我们成功开发出了一个既准确又高效的手写数字和符号识别系统。该系统不仅能满足不同用户在多变环境下的应用需求,还提供了友好的用户体验和强大的数据处理能力,展现了深度学习技术在实际应用中的巨大潜力。

2.4 博文贡献与组织结构

        本文全面介绍了一个基于YOLOv8/v7/v6/v5的手写数字和符号识别系统,涵盖了从任务相关文献综述、数据集处理方法,到深度学习算法的选择与优化,以及基于Streamlit的交互式网页界面设计。本系统不仅在理论上进行了深入探讨,而且在实践中实现了高效准确的手写字符识别,具有以下主要贡献:

  1. 综合性文献综述:我们提供了一项关于手写数字和符号识别领域的广泛文献回顾,特别是针对YOLO系列算法在此任务上的应用和发展,以及其他相关深度学习技术的进展。这为读者提供了丰富的背景知识和技术参考。

  2. 数据集处理:详细介绍了手写数字和符号数据集的预处理、增强和优化策略,这对于提高模型的泛化能力和识别性能至关重要。我们的方法可以作为未来相关研究的数据处理参考。

  3. 算法选择与优化:深入探讨了为什么选择YOLOv8/v7/v6/v5作为核心算法,并介绍了对这些模型进行定制和优化的具体措施,如何通过调整模型架构和训练策略来满足手写数字和符号识别的特定需求。

  4. 网页设计与实现:基于Streamlit设计了美观且用户友好的交互式网页界面,使得用户能够轻松地上传图像、切换模型并获取识别结果。这部分的工作展示了如何将复杂的深度学习模型与终端用户的交互相结合。

  5. 算法效果对比:通过实验比较了YOLOv7、v6、v5在手写数字和符号识别任务上的性能,为选择合适的模型提供了直观的依据,并为未来的算法改进提供了方向。

  6. 资源共享:提供了完整的数据集和代码资源包,包括预处理脚本、训练和推理代码,以及预训练模型。这使得读者能够轻松复现我们的工作,促进了知识的共享和传播。

        后续章节的组织结构如下: 绪论:介绍研究背景、目的和本文的主要贡献;算法原理:详细介绍YOLOv8/v7/v6/v5等算法的工作原理及其在手写数字和符号识别中的应用;数据集处理:讨论使用的数据集及其预处理、增强方法。代码介绍:提供模型训练和预测的详细代码说明,包括环境搭建、参数配置和执行步骤。实验结果与分析:展示不同模型在手写数字和符号识别任务上的实验结果,并进行比较分析。系统设计与实现:介绍基于Streamlit的手写数字和符号识别系统的设计与实现细节。结论与未来工作:总结本文的研究成果,并讨论未来的研究方向和潜在的改进空间。


3. 数据集处理

        在探索深度学习模型在手写数字和符号识别任务上的应用时,选择和构建一个优质的数据集是至关重要的。我们的数据集包含了7,128张精心标注的图像,其中包括4,869张训练图像,1,636张验证图像以及623张测试图像。这样的划分保证了训练过程的多样性和模型评估的严谨性。博主使用的类别如下:

Chinese_name = {
    "0": "0",  # 数字 0
    "1": "1",  # 数字 1
    "2": "2",  # 数字 2
    "3": "3",  # 数字 3
    "4": "4",  # 数字 4
    "5": "5",  # 数字 5
    "6": "6",  # 数字 6
    "7": "7",  # 数字 7
    "8": "8",  # 数字 8
    "9": "9",  # 数字 9
    "div": "除",  # 除法运算符
    "eqv": "等于",  # 等于运算符
    "minus": "减",  # 减法运算符
    "mult": "乘",  # 乘法运算符
    "plus": "加"  # 加法运算符
}

        数据集中不仅包括了传统的手写数字,还涵盖了多种基本的数学符号,如加号、减号、乘号和除号,为识别任务带来了更高的复杂度。通过对这些图像的分析,我们注意到数据集在各个类别之间分布相对均衡,这避免了模型在训练过程中对某一类别过度拟合的可能性,同时也提高了模型对少数类别的识别能力。

        在预处理和增强阶段,我们采用了一系列技术来提升数据集的质量和模型的性能。包括归一化图像大小以适应模型输入,调整对比度来增加图像的清晰度,以及实施随机裁剪、旋转、缩放和颜色调整等增强技术,以模拟真实世界中的多变条件。这些技术的应用使模型在训练时能够接触到更加多样化的数据,从而具备更强的泛化能力。

        在深入分析数据集分布的基础上,我们可以发现,大多数手写数字和符号的中心位置倾向于出现在图像的中央区域,这反映了人们在书写时的自然习惯。此外,目标的宽高比大多集中在正方形附近,但也有一些例外,这些差异增加了模型训练时对不同形状的适应性。这样的分布特征使得我们在设计目标检测模型时,可以精细地调整锚框的大小和比例,以便更好地预测各种形状的手写数字和符号。

        此外,对边界框位置的密集分析表明,虽然手写内容倾向于在图像中央,但也有一定程度的分散性。这种信息对于优化模型以捕捉不规则放置的手写数字和符号是十分宝贵的。我们的数据集和这些分析提供了一个坚实的基础,用于开发和评估我们的手写数字和符号识别系统,确保其在真实世界的应用中具有高准确性和鲁棒性。

        最后,我们提供了完整的数据集和代码资源包供研究人员和开发者下载和使用,从而可以轻松地复现我们的研究成果,并在此基础上进一步探索和改进手写数字及符号识别技术。通过共享这些资源,我们希望能够促进学术界和产业界在该领域的研究和应用,推动手写识别技术的进步。


4. 原理与代码介绍

4.1 YOLOv8算法原理

        YOLOv8是目前YOLO系列中最新的一阶段目标检测算法,相较于其他主流目标检测算法,速度更快,精度更高,性能更好,在众多任务上取得了SOTA的成绩。YOLOv8目前一共有5个版本,包括:YOLOv8n、YOLOv8s、YOLOv8m、YOLOv8l、YOLOv8x,考虑到计算速度、实时性、精度,本文选择了YOLOv8s作为Baseline,在此基础上改进和创新满足小目标检测的任务。相较于YOLOv5,YOLOv8主要有两大改进,首先检测头部分换成了当前主流的解耦头,同时从Anchor-Based变为Anchor-Free。其次抛弃了以往IOU匹配或者单边比例的匹配方式,而是使用了Task-AlignedAssigner正负样本匹配方式,并引入了DFLloss。在数据增强部分借鉴了YOLOX的思想,在最后10个epoch关闭Mosiac数据增强,有效提升精度。

        YOLOv8在目标检测技术领域的主要特点和改进主要集中在以下几个方面:

  • 骨干网络和Neck部分跨阶段局部网络(Cross Stage Partial Network, CSP)模块的预处理从三次卷积换成了两次卷积,借鉴了YOLOv7 ELAN模块多堆叠的设计思想,将YOLOv5的C3结构换成了梯度流更丰富的C2f结构,并对不同尺度模型调整了不同的通道数,使网络能够学习到更多的特征,并且具有更强的鲁棒性。CSP模块的预处理从三次卷积换成了两次卷积,并且借鉴了YOLOv7的多堆叠结构。具体的实现方式是第一次卷积的通道数扩充为原来的两倍,然后将卷积结果在通道上对半分割,这样可以减少一次卷积的次数,加快网络的速度。[1:1]
  • 检测头部分,YOLOv8采用无锚分体式检测头,与基于锚框的方法相比,有助于提高准确性和更高效的检测过程。Head部分较YOLOv5而言有两大改进。首先,换成了目前主流的解耦头结构,将分类和检测头分离,用于缓解分类和定位任务之间存在的冲突;其次,参考YOLOX,从Anchor-Based换成了Anchor Free,面对长宽不规则的目标比较有优势。[1:2]
  • 损失函数计算部分,YOLOv8的Loss计算包括两个部分:分类分支和回归分支。分类分支依然采用BCE Loss,回归分支需要和分布式聚焦损失函数(Distribution Focal Loss, DFL)中提出的积分形式表示法绑定,因此使用了DFL,同时还使用了(Complete Inter section over Union, CIoU)Loss。[1:3]

4.2 模型构建

        在本章节中,我们将深入介绍构建手写数字和符号识别模型的代码流程和结构。本系统的模型构建过程利用了Python编程语言的高级功能,结合了计算机视觉库OpenCV和机器学习库PyTorch,通过精心设计的类和方法实现了一个高效且准确的手写数字和符号识别模型。

        首先,我们利用OpenCV,这是一个强大的计算机视觉库,它为我们处理图像和视频提供了必要的工具。OpenCV在模型训练和评估中的作用不可或缺,尤其是在进行图像的预处理和增强时。随后,我们将模型的核心建立在PyTorch框架之上。PyTorch是目前深度学习研究和实践中最受欢迎的框架之一,因其出色的灵活性和强大的功能被广泛使用。在代码中,我们通过select_device函数选择最合适的硬件设备来运行我们的模型,这保证了无论在GPU还是CPU上,模型都能以最佳状态运行。

import cv2
import torch
from QtFusion.models import Detector
from datasets.label_name import Chinese_name
from ultralytics import YOLO
from ultralytics.utils.torch_utils import select_device

        在代码中,我们设定了使用GPU或CPU作为模型运算的设备,这一选择取决于PyTorch能否检测到可用的GPU。在初始化(init)过程中,我们为模型设置了默认参数,并准备了类别名称列表。这些名称是用于在预测时标注出各个检测到的物体的类别。我们使用Chinese_name字典将类别ID映射为对应的中文名称,使得模型的输出更易于理解。

device = "cuda:0" if torch.cuda.is_available() else "cpu"
ini_params = {
    'device': device,
    'conf': 0.25,
    'iou': 0.5,
    'classes': None,
    'verbose': False
}

        通过count_classes函数,我们可以统计每个类别的出现次数,为评估模型在不同类别上的性能提供了便利。这在实际应用中尤为重要,因为它帮助我们了解模型对于数据集中的各个类别是否存在偏差。

def count_classes(det_info, class_names):
    count_dict = {name: 0 for name in class_names}
    for info in det_info:
        class_name = info['class_name']
        if class_name in count_dict:
            count_dict[class_name] += 1
    count_list = [count_dict[name] for name in class_names]
    return count_list

        我们定义的YOLOv8v5Detector类,承担了模型加载、图像预处理、预测和后处理的任务。这个类继承自一个抽象的Detector基类,体现了面向对象编程的一个优点——代码复用。通过继承,我们能够将通用的逻辑(如加载模型、预处理图像等)放在基类中,而将特定的逻辑(如调用YOLO模型进行预测)在子类中实现。在load_model方法中,模型从给定的路径加载。加载后,我们对模型进行预热,即在选择的设备上运行一个前向传播,以确保模型运行时的性能。在preprocess方法中,我们将图像转换为模型预期的格式,虽然这里的代码保持原始图像不变,但这提供了进行如归一化、缩放或裁剪等预处理步骤的可能性。

class YOLOv8v5Detector(Detector):
    def __init__(self, params=None):
        super().__init__(params)
        self.model = None
        self.img = None
        self.names = list(Chinese_name.values())
        self.params = params if params else ini_params
	def load_model(self, model_path):
	    self.device = select_device(self.params['device'])
	    self.model = YOLO(model_path)
	    names_dict = self.model.names
	    self.names = [Chinese_name[v] if v in Chinese_name else v for v in names_dict.values()]
	    self.model(torch.zeros(1, 3, *[self.imgsz] * 2).to(self.device).type_as(next(self.model.model.parameters())))
	def preprocess(self, img):
	    self.img = img
	    return img
	
	def predict(self, img):
	    results = self.model(img, **ini_params)
	    return results
	
	def postprocess(self, pred):
	    results = []
	    for res in pred[0].boxes:
	        for box in res:
	            class_id = int(box.cls.cpu())
	            bbox = box.xyxy.cpu().squeeze().tolist()
	            bbox = [int(coord) for coord in bbox]
	            result = {
	                "class_name": self.names[class_id],
	                "bbox": bbox,
	                "score": box.conf.cpu().squeeze().item(),
	                "class_id": class_id,
	            }
	            results.append(result)
	    return results
	    
    def set_param(self, params):
        self.params.update(params)

        predict方法是模型预测的核心,它将预处理后的图像作为输入,调用YOLO模型进行物体检测,并返回检测结果。在postprocess方法中,我们对模型的输出进行解析和格式化,将其转换为包含类别名称、边界框坐标、置信度分数以及类别ID的字典列表。这样的输出格式便于后续的分析和可视化。通过调用set_param方法,用户可以根据需要动态调整模型参数,如置信度阈值和IOU阈值,进一步优化模型的性能。

        整体而言,这段代码通过精心设计的类结构和方法,实现了一个完整的手写数字和符号识别流程,从图像输入到预测输出,每一个环节都经过了优化和定制,以确保模型能够在实际应用中达到最佳的识别效果。

4.3 训练代码

        在深入探究构建深度学习模型的代码时,理解每一行代码的目的及其在整个训练流程中的作用至关重要。本博客将详细分析用于手写数字和符号识别的YOLO模型的训练过程。以下表格详细介绍了YOLOv8模型训练中使用的一些重要超参数及其设置:

超参数 设置 说明
学习率(lr0 0.01 决定了模型权重调整的步长大小,在训练初期有助于快速收敛。
学习率衰减(lrf 0.01 控制训练过程中学习率的降低速度,有助于模型在训练后期细致调整。
动量(momentum 0.937 加速模型在正确方向上的学习,并减少震荡,加快收敛速度。
权重衰减(weight_decay 0.0005 防止过拟合,通过在损失函数中添加正则项减少模型复杂度。
热身训练周期(warmup_epochs 3.0 初始几个周期内以较低的学习率开始训练,逐渐增加到预定学习率。
批量大小(batch 16 每次迭代训练中输入模型的样本数,影响GPU内存使用和模型性能。
输入图像大小(imgsz 640 模型接受的输入图像的尺寸,影响模型的识别能力和计算负担。

        环境设置与模型加载:首先,我们需要导入用于构建和训练模型的必要库。这包括os和torch,后者是构建深度学习模型的主要工具,提供了GPU加速及自动微分等强大功能。yaml用于处理配置文件,这些文件通常包含有关训练数据、模型参数等重要信息。YOLO类来自ultralytics库,是针对YOLO模型训练和推理流程的一个封装。abs_path函数用于处理文件路径,确保无论在哪个工作环境中,代码都能正确地找到文件位置。

import os
import torch
import yaml
from ultralytics import YOLO  # 用于加载YOLO模型
from QtFusion.path import abs_path  # 用于获取文件的绝对路径

        接下来,我们定义了用于训练过程的关键变量。device变量确保模型能够利用GPU进行训练,如果GPU不可用,则回退到CPU。

device = "0" if torch.cuda.is_available() else "cpu"

        数据集准备:变量workers定义了在数据加载过程中用于加速读取的进程数。而batch设置了每个批次处理的图像数量,这直接影响内存消耗和训练速度。数据集的路径是通过data_path变量指定的,它使用abs_path函数从相对路径转换为绝对路径,并通过replace函数统一了路径格式。在实际训练过程中,这保证了模型能够正确地访问到数据集。

workers = 1  # 工作进程数
batch = 8  # 每批处理的图像数量
data_name = "NumberOps"
data_path = abs_path(f'datasets/{data_name}/{data_name}.yaml', path_type='current')  # 数据集的yaml的绝对路径
unix_style_path = data_path.replace(os.sep, '/')

        我们通过读取并更新数据集的YAML配置文件,来确保数据路径的准确性。这个步骤对于训练过程至关重要,因为所有的训练图像、标签和验证图像都依赖于这些路径的设置。

directory_path = os.path.dirname(unix_style_path)
with open(data_path, 'r') as file:
    data = yaml.load(file, Loader=yaml.FullLoader)

if 'path' in data:
    data['path'] = directory_path
    with open(data_path, 'w') as file:
        yaml.safe_dump(data, file, sort_keys=False)

        训练模型:最后,我们加载了预训练的YOLO模型,并调用其train方法开始训练流程。这里,我们指定了数据配置文件、训练设备、工作进程数、输入图像大小、训练轮数、批次大小和训练任务的名称。这些参数共同构成了训练环境的基础,并直接影响到训练效率和模型性能。

model = YOLO(abs_path('./weights/yolov5nu.pt', path_type='current'), task='detect')  # 加载预训练的YOLOv8模型
# model = YOLO('./weights/yolov5.yaml', task='detect').load('./weights/yolov5nu.pt')  # 加载预训练的YOLOv8模型
# Training.
results = model.train(  # 开始训练模型
    data=data_path,  # 指定训练数据的配置文件路径
    device=device,  # 自动选择进行训练
    workers=workers,  # 指定使用2个工作进程加载数据
    imgsz=640,  # 指定输入图像的大小为640x640
    epochs=120,  # 指定训练100个epoch
    batch=batch,  # 指定每个批次的大小为8
    name='train_v5_' + data_name  # 指定训练任务的名称
)
model = YOLO(abs_path('./weights/yolov8n.pt'), task='detect')  # 加载预训练的YOLOv8模型
results2 = model.train(  # 开始训练模型
    data=data_path,  # 指定训练数据的配置文件路径
    device=device,  # 自动选择进行训练
    workers=workers,  # 指定使用2个工作进程加载数据
    imgsz=640,  # 指定输入图像的大小为640x640
    epochs=120,  # 指定训练100个epoch
    batch=batch,  # 指定每个批次的大小为8
    name='train_v8_' + data_name  # 指定训练任务的名称
)

        此代码段揭示了如何使用YOLO模型的训练机制,其中包含了多个层面的设置。所有这些设置都被细致地调整和优化,以期在实际应用中获得最好的手写数字和符号识别效果。通过该训练流程,研究人员和实践者可以对YOLO模型进行训练和微调,进而在各种环境中实现准确的手写数字和符号识别。


5. 实验结果与分析

5.1 训练曲线

        在我们的手写数字和符号识别项目中,利用YOLOv8模型的训练是实现高准确度检测的关键环节。通过对模型训练过程中的损失函数和性能指标进行深入分析,我们能够洞察模型的学习效率以及潜在的优化方向。

        首先,观察到的训练和验证的边界框损失(train/box_loss,val/box_loss)随着训练的进行而稳步下降,显示了模型在定位手写数字和符号上的逐渐改进。特别是在训练过程中,边界框损失经历了显著的下降,从接近0.9下降至稳定在0.4左右,这表明模型在学习过程中越来越准确地预测目标的位置。在验证集上,边界框损失同样表现出下降趋势,并维持在一个相对较低的水平,这暗示模型对未见数据保持了良好的泛化能力。

        接下来,我们的分类损失(train/cls_loss,val/cls_loss)也随着训练轮次增加而持续减小,这意味着模型在区分不同手写数字和符号类别方面的性能得到了提升。类别损失从最初的高值逐步降低,最终稳定在较低的水平,这展现了模型的分类准确性随着训练的进行不断提高。

        此外,目标损失(train/obj_loss,val/obj_loss)表示模型预测目标存在与否的能力。我们看到在训练集和验证集上目标损失都呈下降趋势,说明模型越来越好地学会了如何识别图像中是否存在目标。

        在性能指标方面,精度(metrics/precision)在训练过程中保持在较高水平,而且回忆率(metrics/recall)也随之提高,说明模型不仅能正确识别手写内容,还能在多数情况下找到所有相关的目标。这是在手写数字和符号识别任务中尤为重要的,因为遗漏重要的字符会导致理解上的错误。

        最后,平均精度(metrics/mAP)和mAP50-95(metrics/mAP50-95)作为综合性能的度量,在整个训练周期中保持了稳定的上升,尤其是mAP50-95显示出模型在不同IOU阈值下都具有较高的检测精度,这对于实际应用来说是极为重要的。mAP的稳步上升证明了模型在识别准确性和鲁棒性方面的持续改进。
        通过对这些图像的详尽分析,我们可以得出结论,基于YOLOv8的手写数字和符号识别模型在训练过程中表现出色。损失函数的下降和性能指标的提高共同验证了模型的有效性和对于复杂手写数据的适应性。这些结果不仅证实了模型架构和训练策略的合理性,也为未来在更多手写数据集上的应用和进一步优化提供了坚实的基础。

5.2 混淆矩阵

        混淆矩阵是评估分类模型性能的重要工具,尤其在多类别识别任务中。上图显示了在我们的手写数字和符号识别任务中使用深度学习模型的性能结果。这个混淆矩阵已经被归一化,因此每个单元格的值表示在所有真实标签中的比例,为我们提供了预测标签与真实标签之间的精确对应关系。

        首先,可以明显看出,对于大多数类别,模型都能以极高的准确度进行正确预测。数字“1”、“4”、“5”、“7”、“8”、“9”及符号“div”和“equals”都显示出接近完美的准确率,这意味着模型能够非常准确地识别这些类别的大多数实例。这些高数值反映了模型的强大识别能力,特别是在不同的手写风格和符号形状之间进行区分时。

        对于其他一些类别,如数字“0”、“2”、“3”、“6”以及符号“minus”和“plus”,虽然也表现出高度的准确率,但出现了少量的误分类。例如,“0”有少许被误识别为“minus”,而“2”则有微小比例误判为“3”。这些误分类可能是由于手写风格中的相似性,比如某些“0”写得过于狭窄,从而与“-”符号相混淆。

        有趣的是,模型对“background”类别的误判率相对较高,这表明在没有目标的背景区域进行正确分类上,模型可能存在一定的挑战。这可能是因为模型在试图寻找并识别复杂背景中的手写数字或符号时,容易出现“看多了”的现象。
        在深入分析这些结果时,应考虑手写识别的特殊性。手写数字和符号因个体差异而有广泛的变化,这使得模型对于某些模糊或不规则形状的识别变得更具挑战性。此外,训练数据的质量、多样性和代表性也会对模型性能产生重要影响。如果训练数据中包含的变体不够多样,或者某些手写风格的示例数量不足,那么模型可能在这些较少见的情况下表现不佳。

        总结而言,混淆矩阵的分析表明我们的模型在手写数字和符号的识别任务上具有优秀的整体性能,尽管在某些特定情况下仍有改进的空间。未来的工作可以集中在进一步优化模型以更好地处理背景类别的识别,以及提高对于某些容易混淆类别的区分能力。此外,进一步丰富训练数据集,尤其是那些容易引起混淆的类别,将是提升模型性能的关键。

5.3 YOLOv8/v7/v6/v5对比实验

(1)实验设计
        本实验旨在评估和比较YOLOv5、YOLOv6、YOLOv7和YOLOv8几种模型在手写数字和符号目标检测任务上的性能。为了实现这一目标,博主分别使用使用相同的数据集训练和测试了这四个模型,从而可以进行直接的性能比较。该数据集包含手写数字和符号的图像。本文将比较分析四种模型,旨在揭示每种模型的优缺点,探讨它们在工业环境中实际应用的场景选择。

模型 图像大小 (像素) mAPval 50-95 CPU ONNX 速度 (毫秒) A100 TensorRT 速度 (毫秒) 参数数量 (百万) FLOPs (十亿)
YOLOv5nu 640 34.3 73.6 1.06 2.6 7.7
YOLOv8n 640 37.3 80.4 0.99 3.2 8.7
YOLOv6N 640 37.5 - - 4.7 11.4
YOLOv7-tiny 640 37.4 - - 6.01 13.1

(2)度量指标

  • F1-Score:F1-Score 作为衡量模型性能的重要指标,尤其在处理类别分布不均的数据集时显得尤为关键。它通过结合精确率与召回率,提供了一个单一的度量标准,能够全面评价模型的效能。精确率衡量的是模型在所有被标记为正例中真正属于正例的比例,而召回率则关注于模型能够识别出的真正正例占所有实际正例的比例。F1-Score通过两者的调和平均,确保了只有当精确率和召回率同时高时,模型的性能评估才会高,从而确保了模型对于正例的预测既准确又完整。
  • mAP(Mean Average Precision):在目标检测任务中,Mean Average Precision(mAP)是评估模型性能的重要标准。它不仅反映了模型对单个类别的识别精度,而且还考虑了所有类别的平均表现,因此提供了一个全局的性能度量。在计算mAP时,模型对于每个类别的预测被单独考虑,然后计算每个类别的平均精度(AP),最后这些AP值的平均数形成了mAP。
名称 YOLOv5nu YOLOv6n YOLOv7-tiny YOLOv8n
mAP 0.991 0.993 0.992 0.992
F1-Score 0.99 0.99 0.99 0.99

(3)实验结果分析

       在本次实验中,我们对比了YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n四个版本的YOLO模型在手写数字和符号识别任务上的性能。实验的目的是为了评估和理解这些不同版本的模型在处理复杂手写体识别任务时的效率和准确性。我们采用了F1-Score和mAP(mean Average Precision)作为度量指标,这两个指标共同反映了模型的精确度和召回率的平衡,是评估目标检测模型性能的标准方法。
       实验结果显示,四种模型在mAP上的得分极为接近,YOLOv6n以0.993的成绩略微领先,其余三个模型则均为0.992。同样,在F1-Score指标上,所有模型均得到了0.99的高分。这些数值结果表明,尽管这些模型在架构和优化策略上存在差异,它们在手写数字和符号识别任务上均表现出色,证明了YOLO算法在识别精度上的稳定性和鲁棒性。

       从模型间的细微差别来看,YOLOv6n在mAP上的轻微领先可能源于其在特征提取和锚框优化方面的细微改进。作为一个在YOLOv5基础上进一步迭代的版本,它可能通过更有效的特征融合和空间分辨率的保持,对于手写体中的细微差异更为敏感。然而,这种差异是微小的,表明所有模型都已经接近手写体识别任务的性能上限。

       YOLOv5nu、YOLOv7-tiny和YOLOv8n的表现几乎一致,这可能意味着对于我们的特定数据集和任务来说,它们的网络架构和能力已经足够应对手写体的多样性和复杂性。这些模型之间的轻微性能差异可能是由于不同的内部特征处理方式或是在处理数据集特定类别的小差别所造成的。例如,YOLOv7-tiny作为一个较轻量级的版本,其结构简化可能在处理更复杂或边缘情况的手写字符时略显不足。

        综上所述,我们的实验结果表明YOLO系列模型都是手写数字和符号识别的可靠选择。虽然在性能上有细微的差异,但总体上,这些差异在实际应用中可能影响不大。未来的工作可能会集中在进一步优化模型结构,或者开发更高级的训练策略来挖掘模型潜能,以及探索实现更高效的计算性能。此外,可能的改进方向还包括更细粒度的数据增强方法,以及专门针对手写体变体的优化策略,从而在这一领域推动YOLO模型性能的新极限。


6. 系统设计与实现

6.1 系统架构概览

        在我们的博客中,接下来我们深入探讨基于YOLOv8/v7/v6/v5的手写数字和符号识别系统的架构设计。本系统采用了模块化设计思想,旨在通过清晰定义的组件和接口来提升系统的可维护性和扩展性。下面是系统架构的关键组成部分:

  1. 检测系统类(Detection_UI)
    检测系统类是整个手写数字和符号识别系统的核心,它负责协调各个组件的交互。这个类通过集成不同的模块,提供了一个用户友好的界面,用于上传图像或视频,选择模型参数,并展示识别结果。它利用了streamlit框架来搭建可交互的Web界面,方便用户操作。

  2. YOLOv8/v5模型检测器(YOLOv8v5Detector)
    YOLOv8v5Detector类扮演了模型检测器的角色,封装了YOLO模型的加载、预处理、预测以及后处理等操作。这个类是我们系统的AI引擎,通过加载预训练的YOLO模型权重来识别图像或视频中的手写数字和符号。利用这个模块,我们可以轻松地将最新的YOLO模型版本集成到我们的系统中,以便利用其强大的检测能力。

  3. 日志和结果处理
    系统中集成了ResultLoggerLogTable两个类,用于处理和记录识别结果。ResultLogger提供了一个框架来记录每次检测的关键信息,如识别到的手写数字和符号类别、置信度、位置等。LogTable则负责将这些信息以表格的形式展示和保存,便于用户查看和分析识别结果。

  4. 工具类和辅助方法
    为了提高代码的复用性和减少冗余,系统设计了一系列工具类和辅助方法。例如,abs_pathdrawRectBox分别用于处理文件路径的获取和在图像上绘制识别框。此外,get_camera_namessave_uploaded_file等方法则为系统提供了摄像头管理和文件处理的功能。

  5. UI布局和样式
    通过使用def_css_hitml方法,我们为系统定义了一套统一的CSS样式,保证了用户界面的美观性和一致性。同时,setup_sidebarsetupMainWindow方法则分别负责侧边栏和主窗口的布局设置,使得整个系统界面直观易用。

6.2 系统流程

        在探讨基于YOLOv8/v7/v6/v5的手写数字和符号识别系统的流程时,我们可以从代码中抽象出一系列关键步骤,这些步骤集成了从图像获取、模型预测到结果展示的整个流程。以下是系统的主要流程步骤,它们体现了系统如何协调不同的组件以实现手写数字和符号识别的功能。

  1. 初始化系统设置:系统启动时,SystemController负责初始化所有需要的模块和参数。

  2. 模型和数据准备:在初始化过程中,系统会根据选择的模型类型(例如YOLOv8/v5),加载对应的模型权重。同时,系统还会处理输入数据,这可能包括从摄像头捕获的实时图像、上传的图片文件或视频文件。

  3. 侧边栏配置:用户可以通过侧边栏进行一系列配置,包括选择模型文件、设置置信度阈值、IOU阈值、选择输入源(摄像头或文件)等。这些配置将直接影响检测结果的准确性和效率。

  4. 运行检测:用户点击“开始运行”按钮后,根据输入源的不同,系统会调用process_camera_or_file方法。这个方法负责处理来自摄像头的实时流或处理上传的图片和视频文件。对于实时摄像头输入,系统会不断从摄像头捕获帧,对每一帧调用frame_process方法进行预处理、模型预测、后处理,并将结果显示在页面上。对于上传的图片文件,系统将读取图片文件,同样通过frame_process方法进行处理,并将检测结果展示出来。对于上传的视频文件,系统会按帧读取视频内容,每一帧都经过frame_process方法处理,检测结果随视频播放展示。

  5. 显示检测结果:无论是实时视频流、图片还是视频文件,处理后的图像以及检测到的对象信息(如类别、置信度等)都会通过Streamlit的组件在用户界面上展示。同时,系统提供了过滤功能,允许用户专注于特定类型的检测结果。

  6. 日志记录与导出:系统会将检测结果记录到日志中,并允许用户导出结果为CSV格式的文件,方便后续分析和报告。

  7. 用户界面交互:用户还可以通过侧边栏和其他界面元素,如进度条、按钮等,与系统进行实时交云,调整设置或重新运行检测。

        这一系列流程确保了手写数字和符号识别系统能够在各种夜间环境下准确快速地识别手写数字和符号,为降低事故发生率和提高夜间行走人员的安全提供了技术支持。


代码下载链接

         如果您希望获取博客中提及的完整资源包,包含测试图片、视频、Python文件(*.py)、网页配置文件、训练数据集、代码及界面设计等,可访问博主在面包多平台的上传内容。相关的博客和视频资料提供了所有必要文件的下载链接,以便一键运行。完整资源的预览如下图所示:

        资源包中涵盖了你需要的训练测试数据集、训练测试代码、UI界面代码等完整资源,完整项目文件的下载链接可在下面的视频简介中找到➷➷➷

演示与介绍视频https://www.bilibili.com/video/BV1Nx421D7EY/
YOLOv8/v7/v6/v5项目合集下载https://mbd.pub/o/bread/mbd-ZZ2YmJtr
YOLOv8和v5项目完整资源下载https://mbd.pub/o/bread/mbd-ZZ2Ykpdt
YOLOv7项目完整资源下载https://mbd.pub/o/bread/mbd-ZZ2Yl5ls
YOLOv6项目完整资源下载https://mbd.pub/o/bread/mbd-ZZ2Yl55r

完整安装运行教程:

        这个项目的运行需要用到Anaconda和Pycharm两个软件,下载到资源代码后,您可以按照以下链接提供的详细安装教程操作即可运行成功,如仍有运行问题可私信博主解决:

  1. Pycharm和Anaconda的安装教程https://deepcode.blog.csdn.net/article/details/136639378

        软件安装好后需要为本项目新建Python环境、安装依赖库,并在Pycharm中设置环境,这几步采用下面的教程可选在线安装(pip install直接在线下载包)或离线依赖包(博主提供的离线包直接装)安装两种方式之一:

  1. Python环境配置教程https://deepcode.blog.csdn.net/article/details/136639396(2,3方法可选一种);
  2. 离线依赖包的安装指南https://deepcode.blog.csdn.net/article/details/136650641(2,3方法可选一种);

        如使用离线包方式安装,请下载离线依赖库,下载地址:https://pan.baidu.com/s/1uHbU9YzSqN0YP_dTHBgpFw?pwd=mt8u (提取码:mt8u)。


7. 结论与未来工作

        本文通过深入研究并实践了基于YOLOv8/v7/v6/v5的深度学习模型在手写数字和符号识别领域的应用,成功开发了一个集成了这些先进算法的手写数字和符号识别系统。通过对多个版本的YOLO模型进行细致的比较和优化,本研究不仅提升了手写数字和符号识别的准确率和实时性,还通过Streamlit创建了一个直观、美观且易于使用的Web应用,使用户能够轻松地进行手写数字和符号识别,从而在实际应用中发挥重要作用。

        经过一系列实验验证,本文所提出的方法在手写数字和符号识别的准确性和处理速度上都达到了令人满意的水平。同时,我们还提供了完整的数据集处理流程、模型训练和预测的代码,以及基于Streamlit的系统设计和实现细节,为后续的研究者和开发者复现和参考提供了方便。尽管取得了一定的成果,但手写数字和符号识别作为一个复杂多变的任务,仍然面临着许多挑战和改进空间。在未来的工作中,我们计划从以下几个方向进行探索:

  • 模型优化:继续探索更深层次的网络结构和优化策略,如神经网络架构搜索(NAS)技术,以进一步提升模型的性能和效率。
  • 多模态融合:考虑结合语音、文本等其他模态信息,采用多模态学习方法进行手写数字和符号的更加全面识别。
  • 跨域适应性:研究跨文化、跨年龄组的手写样式识别,通过领域自适应技术提高模型在不同人群和环境中的泛化能力。
  • 用户交互体验:进一步优化系统的用户界面和交互设计,使其更加人性化、智能化,以满足更广泛用户的需求。
  • 实际应用拓展:探索手写数字和符号识别在更多实际应用场景中的应用,如在线教育、远程会议、智能客服等,以发挥其最大的社会和经济价值。

        总之,手写数字和符号识别技术正处于快速发展之中,随着技术的不断进步和应用场景的不断拓展,我们相信在不久的将来,基于深度学习的手写数字和符号识别将在人机交互、社会安全、医疗健康等领域发挥更加重要的作用。


  1. Wu X, Sahoo D, Hoi S C H. Recent advances in deep learning for object detection[J]. Neurocomputing, 2020, 396: 39-64. ↩︎ ↩︎ ↩︎ ↩︎

  2. Tian R. Oracle text positioning system based on improved YOLOv7-FC model[J]. Journal of Education, Humanities and Social Sciences, 2023, 19: 206-217. ↩︎

  3. Norkobil Saydirasulovich S, Abdusalomov A, Jamil M K, et al. A YOLOv6-based improved fire detection approach for smart city environments[J]. Sensors, 2023, 23(6): 3161. ↩︎

  4. Agrawal V, Jagtap J, Patil S, et al. Performance analysis of hybrid deep learning framework using a vision transformer and convolutional neural network for handwritten digit recognition[J]. MethodsX, 2024, 12: 102554. ↩︎

  5. Tan Y, Yao H. Deep capsule network handwritten digit recognition[J]. International Journal of Advanced Network, Monitoring and Controls, 2021, 5(4): 1-8. ↩︎

标签:数字,训练,符号,模型,YOLOv8,v5,v7,手写,识别
From: https://www.cnblogs.com/deeppython/p/18099083

相关文章