摘要:在本篇博客中,我们深入探讨了基于YOLOv8/v7/v6/v5的交通信号标志检测系统,其核心采用最新的YOLOv8算法,并整合了YOLOv7、YOLOv6、YOLOv5的先进技术,以便进行综合性能的比较分析。我们详细回顾了当前国内外在此领域的研究现状,对数据集的处理方式、算法的核心原理、模型的构建及训练过程进行了系统性的介绍,并展示了如何将这一系统应用于基于Streamlit框架的交互式Web应用界面设计中。在Web应用界面中,用户可以轻松地上传图像、视频,甚至直接通过实时摄像头进行交通标志的检测,这大大增强了系统的实用性和灵活性。此外,系统支持用户上传不同版本的训练好的YOLO模型(包括YOLOv8、v7、v6、v5),以进行推理预测,界面的友好设计还允许用户根据需要进行快速修改和调整。为了方便读者更好地理解和应用本系统,我们在博客中提供了完整的网页设计细节、深度学习模型的代码实现,以及用于训练的数据集的下载链接,以期为广大研究人员和技术爱好者提供一套完整的解决方案,促进交通标志检测技术的发展和应用。
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频 :https://www.bilibili.com/video/BV1vx421U72g/
YOLOv8/v7/v6/v5项目合集下载:https://mbd.pub/o/bread/mbd-ZZ2akptu
YOLOv8和v5项目完整资源下载:https://mbd.pub/o/bread/mbd-ZZ2Zm5lq
YOLOv7项目完整资源下载:https://mbd.pub/o/bread/mbd-ZZ2Zm5xu
YOLOv6项目完整资源下载:https://mbd.pub/o/bread/mbd-ZZ2akpdv
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
1. 网页功能与效果
开启摄像头实时检测
本系统支持通过Web界面直接开启摄像头进行实时交通标志检测。用户只需点击界面上的相应按钮,即可激活摄像头,并实时显示捕获的视频流。系统将自动在视频流中检测交通标志,并在检测到的标志周围实时绘制边框,标注信息。
选择图片检测
用户可以通过上传图片文件来进行交通标志的检测。系统提供了一个简单的上传界面,用户选择图片文件后,系统会自动进行检测并展示结果,包括在图片上直观地标出检测到的交通标志和相应的标签。
选择视频文件检测
除了图片检测,系统还支持用户上传视频文件进行交通标志的检测。用户选择视频文件后,系统将逐帧分析视频内容,实时标注出每一帧中检测到的交通标志,用户可以通过播放标注后的视频直观看到检测结果。
选择不同训练好的模型文件
系统提供了多个预训练好的模型文件供用户选择,包括不同版本的YOLO模型。用户可以根据自己的需求选择最适合的模型进行检测,以达到最佳的检测效果和性能平衡。
对于其他功能,系统还提供了更多高级特性以增强用户体验和检测效果:
- 检测画面和原始画面同时或单独显示:用户可以选择同时查看原始画面和检测画面,或者只查看其中之一,以便更清晰地对比和分析检测结果。
- 特定目标标记与结果展示:通过下拉框,用户可以选择只标记特定的交通标志。系统将根据用户的选择,仅显示选中目标的检测结果。
- 检测结果的动态展示与保存:检测结果将在页面的表格中动态显示,包括检测到的目标类型、置信度等信息。用户可以通过点击按钮将这些结果导出到csv文件中,便于进一步的分析和记录。
- 检测参数的动态调整:用户可以根据需要动态调整检测算法的置信度阈值和IOU阈值,以优化检测的准确性和减少误检。
- 检测结果的导出:对于通过摄像头、图片或视频文件进行的检测,用户可以将标记后的画面导出为avi格式的图像文件,方便保存和分享。
通过这些功能,本系统提供了一个全面、灵活且高效的交通标志检测平台,满足了不同用户在不同场景下的需求。
2. 绪论
2.1 研究背景及意义
在当今社会,随着汽车数量的急剧增加,道路交通安全成为了全球关注的热点问题之一。交通标志作为道路交通系统中的重要组成部分,承担着指示、警告、禁止等多种功能,对于引导交通流、预防交通事故、提高道路使用效率具有不可或缺的作用。因此,准确、高效地检测和识别交通标志,对于智能交通系统(ITS)、自动驾驶辅助系统(ADAS)以及自动驾驶技术的发展至关重要。
随着人工智能技术的飞速发展,尤其是深度学习技术在图像处理领域的广泛应用,使得交通标志的自动检测与识别成为可能。近年来,基于深度学习的目标检测算法,如卷积神经网络(CNN),在交通标志检测领域取得了显著的进展。YOLO(You Only Look Once)系列算法作为目标检测领域的佼佼者,以其快速、准确的特性受到广泛关注。从YOLOv1到最新的YOLOv8,每一代的更新都在检测速度、准确性以及模型泛化能力上有所提升,为交通标志的实时检测提供了强有力的技术支持。
然而,尽管已有研究取得了一定的成果,但仍面临着一些挑战和问题。例如,交通标志在不同的光照、天气条件下的检测稳定性;复杂背景下的小尺寸交通标志检测准确性;交通标志的多样性和地区差异性带来的识别难题等。此外,现有的交通标志检测系统往往需要在高性能计算设备上运行,这对于嵌入式系统和实时应用构成了限制。
为了解决这些问题,本博客将深入探讨基于YOLOv8/v7/v6/v5的交通标志检测系统,通过引入最新的算法改进、优化模型结构、扩充和更新数据集、采用更有效的训练策略等方法,旨在提高交通标志检测的准确性、鲁棒性和实时性。我们的目标是开发出一套高效、轻量级、易于部署的交通标志检测系统,为智能交通、自动驾驶辅助系统乃至完全自动驾驶技术的实现提供技术支持。
通过本博客的介绍,我们希望为交通标志检测技术的研究者和开发者提供一份详尽的参考资料,分享最新的研究成果和技术进展,共同推动智能交通系统的发展,为提高道路交通安全和效率做出贡献。
2.2 国内外研究现状
在交通标志检测领域,深度学习算法的飞速发展不断推动着检测技术的进步。其中,YOLO系列作为最受欢迎的算法之一,其最新版本YOLOv8通过改进网络结构和优化训练策略,显著提升了检测的速度和准确性。YOLOv8采用了更深更宽的网络架构,引入了类似Transformer的自注意力机制,增强了模型对复杂场景的处理能力。此外,通过采用自适应锚点匹配和更复杂的损失函数,YOLOv8在多个标准数据集上均展现出了优异的性能[1]。
除了YOLO系列,还有一些基于Transformer的目标检测模型近年来受到了广泛关注。例如,Vision Transformer(ViT)将图像分割成一系列小块(Patch),并将其视为序列输入到Transformer中,利用自注意力机制处理全局信息,展现出了与CNN相媲美的性能[2]。基于ViT的进一步研究,如Swin Transformer,通过引入可变形的窗口策略,有效地处理了图像中的多尺度特征,对于包括交通标志检测在内的多种视觉任务表现出了更高的准确率和效率[3]。
在目标检测算法的创新方面,DEtection TRansformer(DETR)提出了一种全新的目标检测范式。DETR摒弃了传统目标检测算法中的锚点和NMS(非极大值抑制),直接利用Transformer的编码器-解码器结构输出检测结果,简化了检测流程的同时保持了高效率和准确性[4]。这种端到端的目标检测方法为后续研究提供了新的视角,尤其在处理交通标志这类小目标检测任务时,展现出了独特的优势。
另一方面,随着自动驾驶和智能交通系统需求的不断增长,对交通标志检测算法的实时性和轻量化提出了更高要求。一些研究通过网络剪枝、量化和知识蒸馏等技术对深度模型进行压缩和加速,以适应边缘设备的计算能力限制。例如,一种改进的轻量级YOLO模型通过精简网络结构和引入高效的特征融合机制,大幅减少了模型参数量和计算复杂度,使得在边缘设备上的实时交通标志检测成为可能[5]。
总之,交通标志检测技术正处于快速发展之中,各种基于深度学习的先进算法不断涌现,它们在网络架构、优化策略和应用实践等方面的创新,为解决交通标志检测中的各种挑战提供了有效的手段。未来的研究将进一步探索算法的优化,以实现更高的检测精度、速度和鲁棒性,满足实际应用中对实时性和准确性的双重需求。
2.3 要解决的问题及其方案
2.3.1 要解决的问题
针对基于YOLOv8/v7/v6/v5的交通标志检测系统所面临的挑战,我们设计了一套综合解决方案,旨在实现高效准确的交通标志检测及优化用户交互体验。以下是我们拟采取的主要方法:
-
深度学习模型的选择和优化:
- 模型架构:我们选择基于YOLOv8为主模型,结合YOLOv7、v6、v5,根据不同需求进行模型选择。YOLOv8在保持高检测速度的同时,其精确度和泛化能力也有显著提升,适用于实时的交通标志检测任务。
- 数据增强:为了提高模型在多变环境下的泛化能力,我们将采用各种数据增强技术,包括但不限于随机裁剪、旋转、色彩调整等,以模拟不同光照和天气条件下的真实场景。
- 迁移学习:通过在大规模通用数据集上预训练的YOLO模型作为基础,利用特定的交通标志数据集进行微调,以提高模型的识别精度和速度。
-
技术框架和开发工具:
- PyTorch框架:选用PyTorch作为主要的深度学习框架,凭借其灵活性和强大的GPU加速能力,适合进行高效的模型训练和推理。
- Streamlit Web界面:利用Streamlit构建交互式Web应用,提供简洁直观的用户界面,支持图像、视频及实时摄像头数据的上传和检测。
- CSS美化:通过CSS对Web界面进行美化和样式定制,提升用户体验。
-
功能实现和系统设计:
- 多输入源支持:系统支持多种数据输入源,包括图像文件、视频流和实时摄像头输入,以满足不同用户场景的需求。
- 模型切换功能:用户可根据需求选择不同版本的YOLO模型进行检测,增强了系统的适用性和灵活性。
- 交互式数据展示:检测结果以直观的方式展示,包括标注检测到的交通标志和显示检测概率,提供实时反馈。
-
数据处理和存储策略:
- 高效数据处理:采用PyTorch的高效数据加载和预处理机制,确保系统能够快速响应用户的检测请求。
- 智能数据存储:设计合理的数据存储方案,对用户的检测历史进行管理,便于后续的查询和分析。
-
性能优化和系统测试:
- 性能调优:通过深入分析模型和系统性能,识别并解决瓶颈问题,采取如模型剪枝、量化等措施进行优化,确保系统的高效运行。
- 全面测试:进行全面系统测试,确保各项功能正常运行,满足稳定性和可靠性要求。
通过实施上述方法,我们期望打造一个既准确又高效的交通标志检测系统,为用户提供高质量的服务,同时具备良好的用户体验和强大的数据处理能力。
2.3.2 解决方案
针对基于YOLOv8/v7/v6/v5的交通标志检测系统所面临的挑战,我们设计了一套综合解决方案,旨在实现高效准确的交通标志检测及优化用户交互体验。以下是我们拟采取的主要方法:
-
深度学习模型的选择和优化:
- 模型架构:我们选择基于YOLOv8为主模型,结合YOLOv7、v6、v5,根据不同需求进行模型选择。YOLOv8在保持高检测速度的同时,其精确度和泛化能力也有显著提升,适用于实时的交通标志检测任务。
- 数据增强:为了提高模型在多变环境下的泛化能力,我们将采用各种数据增强技术,包括但不限于随机裁剪、旋转、色彩调整等,以模拟不同光照和天气条件下的真实场景。
- 迁移学习:通过在大规模通用数据集上预训练的YOLO模型作为基础,利用特定的交通标志数据集进行微调,以提高模型的识别精度和速度。
-
技术框架和开发工具:
- PyTorch框架:选用PyTorch作为主要的深度学习框架,凭借其灵活性和强大的GPU加速能力,适合进行高效的模型训练和推理。
- Streamlit Web界面:利用Streamlit构建交互式Web应用,提供简洁直观的用户界面,支持图像、视频及实时摄像头数据的上传和检测。
- CSS美化:通过CSS对Web界面进行美化和样式定制,提升用户体验。
-
功能实现和系统设计:
- 多输入源支持:系统支持多种数据输入源,包括图像文件、视频流和实时摄像头输入,以满足不同用户场景的需求。
- 模型切换功能:用户可根据需求选择不同版本的YOLO模型进行检测,增强了系统的适用性和灵活性。
- 交互式数据展示:检测结果以直观的方式展示,包括标注检测到的交通标志和显示检测概率,提供实时反馈。
-
数据处理和存储策略:
- 高效数据处理:采用PyTorch的高效数据加载和预处理机制,确保系统能够快速响应用户的检测请求。
- 智能数据存储:设计合理的数据存储方案,对用户的检测历史进行管理,便于后续的查询和分析。
-
性能优化和系统测试:
- 性能调优:通过深入分析模型和系统性能,识别并解决瓶颈问题,采取如模型剪枝、量化等措施进行优化,确保系统的高效运行。
- 全面测试:进行全面系统测试,确保各项功能正常运行,满足稳定性和可靠性要求。
通过实施上述方法,我们期望打造一个既准确又高效的交通标志检测系统,为用户提供高质量的服务,同时具备良好的用户体验和强大的数据处理能力。
2.4 博文贡献与组织结构
本文系统地介绍了基于YOLOv8/v7/v6/v5的交通标志检测系统的设计与实现,并详细讨论了各个组成部分的技术细节。本文的主要贡献如下:
-
文献综述:提供了一篇全面的文献综述,涵盖了交通标志检测领域的最新进展,包括不仅限于YOLO系列的各种深度学习算法。这为读者理解当前研究的前沿趋势和技术挑战提供了宝贵的信息。
-
数据集处理:详细描述了数据集的处理方法,包括数据收集、预处理、增强等步骤。这一部分对于实现高效准确的交通标志检测模型至关重要,也为希望在此领域开展研究的学者提供了实用的指导。
-
算法选择与优化:深入探讨了YOLOv8及其前几代版本(YOLOv7/v6/v5)在交通标志检测任务中的应用,并针对不同版本的特点和性能进行了详细的比较分析。此外,还讨论了模型的优化策略,以提高检测的准确性和实时性。
-
美观友好的Web界面设计:基于Streamlit框架,设计了一个美观、直观且用户友好的Web应用界面,使用户能够轻松上传图像、视频进行交通标志的实时检测,并能够无缝切换不同的模型版本。
-
实验结果与分析:展示了使用YOLOv7/v6/v5等算法在不同数据集上的实验结果,并进行了深入的性能比较和分析。这为读者提供了模型选择和性能评估的重要参考。
-
资源共享:提供了完整的数据集和代码资源包的下载链接,包括预处理、模型训练和预测的完整代码,为研究人员和开发者复现和改进系统提供了便利。
后续章节的组织结构如下:
- 绪论:介绍交通标志检测的研究背景、意义及本文的主要研究内容和创新点。
- 算法原理:详细讨论YOLOv8/v7/v6/v5等深度学习模型的基本原理、结构特点及其在交通标志检测任务中的应用。
- 数据集处理:描述数据集的收集、预处理、增强等步骤,以及如何准备适合训练深度学习模型的数据集。
- 代码介绍:提供模型预测与训练的详细代码介绍,包括模型构建、训练过程和预测实现等。
- 实验结果与分析:展示不同算法在交通标志检测任务上的实验结果,并进行性能对比和分析。
- 系统设计与实现:介绍基于Streamlit的Web应用界面的设计与实现,包括界面布局、功能实现和用户交互等。
- 结论与未来工作:总结本文的主要成果,并讨论未来可能的研究方向和改进空间。
3. 数据集处理
在探讨基于深度学习的交通标志检测系统时,数据集的质量、多样性和代表性是实现高准确性检测的关键。本系统所依赖的数据集共计7444张图片,经过精心准备与组织,被划分为6516张训练图片、632张验证图片以及296张测试图片。这一分布确保了模型在训练过程中能接触到大量的样本,在验证过程中能调整参数以避免过拟合,并最终在测试集上评估模型的泛化能力。
Chinese_name = {'40 Limit': "限速40", '50 Limit': "限速50", '60 Limit': "限速60", '70 Limit': "限速70",
'80 Limit': "限速80", 'Give way': "注意让行", 'No Entry': "禁止驶入", 'Parking': "泊车",
'Pedestrian': "行人", 'Roundabout': "环形交叉", 'stop': "停车"
}
数据集涵盖了从“限速40”到“停车”的11个交通标志类别,每个类别都被赋予了准确的中文标签,不仅涉及速度限制标志,还包括警告、禁令以及指示类别的标志。这样的分类确保了模型能够在实际应用中准确识别和理解不同类型的标志,为驾驶辅助系统提供了可靠的信息。
数据集的多样性体现在不同的交通场景、光照条件和天气状态。通过这些场景的广泛覆盖,模型能够适应各种环境,提高其鲁棒性。不同的图像质量,如模糊、遮挡以及不同尺寸的标志,也为训练过程增添了挑战,这迫使模型学习如何在不理想的情况下仍保持准确检测。
对数据集的进一步分析揭示了类别分布的不平衡性。以“泊车”和“行人”为例,它们的样本量远超其他类别,这种不平衡可能会使模型偏向于这些类别。为此,我们可能需要在训练过程中实施特定策略,如对罕见类别进行过采样或在损失函数中进行调整,以确保模型对所有类别都具有良好的识别能力。
从数据集的目标位置分布图中,我们观察到大多数交通标志位于图像的中心区域。这一信息对于设置检测模型中的先验框极为有用,它可以帮助模型更加精确地预测交通标志的位置。目标尺寸分布图则表明,大多数交通标志在图像中占比较小,这对模型在捕捉小尺寸目标上的能力提出了要求。
在预处理和增强方面,数据集中的图像经过了归一化和大小调整,确保了输入模型的一致性。数据增强策略,如随机裁剪、旋转和色彩调整等,被用来提高模型对实际环境变化的适应能力,这些增强不仅提高了模型的泛化性,也为处理现实世界的复杂性打下了坚实的基础。
综上所述,这一精心准备的数据集为交通标志的准确检测提供了坚实的基础,通过广泛而复杂的样本展示,为模型的训练、验证和测试提供了理想的平台。在后续章节中,我们将进一步介绍如何利用这些数据来训练一个鲁棒的交通标志检测模型,并分析该模型在实际应用中的表现。
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的多堆叠结构。具体的实现方式是第一次卷积的通道数扩充为原来的两倍,然后将卷积结果在通道上对半分割,这样可以减少一次卷积的次数,加快网络的速度。
- 检测头部分,YOLOv8采用无锚分体式检测头,与基于锚框的方法相比,有助于提高准确性和更高效的检测过程。Head部分较YOLOv5而言有两大改进。首先,换成了目前主流的解耦头结构,将分类和检测头分离,用于缓解分类和定位任务之间存在的冲突;其次,参考YOLOX,从Anchor-Based换成了Anchor Free,面对长宽不规则的目标比较有优势。
- 损失函数计算部分,YOLOv8的Loss计算包括两个部分:分类分支和回归分支。分类分支依然采用BCE Loss,回归分支需要和分布式聚焦损失函数(Distribution Focal Loss, DFL)中提出的积分形式表示法绑定,因此使用了DFL,同时还使用了(Complete Inter section over Union, CIoU)Loss。
4.2 模型构建
在本章节中,我们将深入介绍构建识别模型的代码流程和结构。本系统的模型构建过程利用了Python编程语言的高级功能,结合了计算机视觉库OpenCV和机器学习库PyTorch,通过精心设计的类和方法实现了一个高效且准确的目标识别模型。
接下来我将详细讲解该代码的每个部分的功能。
导入必要的库
代码的开头部分涉及到导入了处理图像所需的库以及实现深度学习模型的关键库。
import cv2 # OpenCV库,用于图像处理任务
import torch # PyTorch库,用于构建深度学习模型
from QtFusion.models import Detector, HeatmapGenerator # 自定义模块,定义了检测器的抽象类
from datasets.label_name import Chinese_name # 自定义模块,包含交通标志的中文名称映射
from ultralytics import YOLO # Ultralytics提供的YOLO实现
from ultralytics.utils.torch_utils import select_device # 选择运行模型的设备
初始化参数和设备选择
我们为模型的运行定义了初始参数,并根据GPU可用性设置了设备。
device = "cuda:0" if torch.cuda.is_available() else "cpu" # 根据GPU可用性选择设备
ini_params = {
'device': device, # 设置使用的设备
'conf': 0.25, # 置信度阈值
'iou': 0.5, # 非极大值抑制的IOU阈值
'classes': None, # 默认不过滤任何类别
'verbose': False # 是否输出详细信息
}
类的定义与方法实现
YOLOv8v5Detector
类负责加载模型、预处理图像、执行预测和后处理。类中定义的方法包括模型加载、图像预处理、预测执行和结果的后处理。
class YOLOv8v5Detector(Detector):
def __init__(self, params=None):
super().__init__(params)
self.model = None # 初始化模型为None
self.img = None # 初始化图像为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) # 加载YOLO模型
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()))) # 模型预热
# 省略其他方法...
load_model
方法用于加载训练好的YOLO模型并将其部署到指定的设备上。此外,类别名称会根据提供的中文映射进行转换。代码中还包含了预处理、预测和后处理函数,但在此处未展示。
预测和后处理
predict
方法将图像传递给加载的模型进行预测,而postprocess
方法则负责将YOLO模型的输出转换成易于理解和进一步处理的格式。
整体而言,这段代码提供了一个从加载模型到获取预测结果的完整流程。每个函数都经过精心设计,以确保整个预测过程的高效性和准确性。
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)均随着训练的进行显著下降,这表明模型在学习过程中逐渐改善了对目标框位置的预测准确性。类别损失(train/cls_loss 和 val/cls_loss)同样表现出了下降的趋势,尤其是在训练早期,下降幅度更为显著,这表示模型在区分不同交通标志类别的能力得到了加强。
定向特征损失(train/dfI_loss 和 val/dfI_loss)的下降则反映了模型对目标的定向特征学习的改进。由于交通标志检测不仅仅是识别形状,还包括理解标志的朝向,这一指标的下降尤为重要。
在性能指标方面,我们看到训练集的精确度(metrics/precision)和召回率(metrics/recall)保持在较高水平,随着训练的进行逐渐趋于稳定。这表明模型在准确识别交通标志和最小化漏检方面取得了良好的效果。同时,模型的平均精确度(metrics/mAP50)也显示出了上升的趋势,这意味着在IoU阈值为0.5的条件下,模型的性能得到了整体的提升。
而在更为严格的评价标准下,即在多个IoU阈值(从0.5到0.95)下的平均精确度(metrics/mAP50-95),我们同样观察到了性能的逐步提升。这项指标的提高表明,模型在各种严格条件下都能保持较高的检测精度,这对于实际应用来说至关重要,因为它意味着模型可以在不同的交通环境中稳定工作。
这些指标整体显示出训练过程是成功的,模型在各个方面都表现出了进步,这为后续的实际应用打下了坚实的基础。然而,值得注意的是,尽管训练损失和验证损失都呈下降趋势,但验证损失在下降到一定程度后趋于平稳,这可能意味着模型在某个点之后开始过拟合训练数据。因此,我们可能需要进一步调整模型参数,或者应用技术如早停、正则化以及继续数据增强等来防止过拟合。
此外,模型的训练过程中准确度高而召回率略低的现象,提示我们可能需要调整损失函数的权重,或者在训练时引入更多正负样本平衡的策略,以进一步提高模型的召回率。精确度高意味着模型在做出预测时较为“谨慎”,大部分预测是正确的,但召回率较低则意味着模型错过了一些正样本,即有一些交通标志没有被检测到。
最后,mAP50和mAP50-95的差距表明,在不同IoU阈值下,模型的性能有所差异。尽管在IoU为0.5时模型表现优秀,但当阈值提高时,模型的性能有所下降。这可能是由于模型对于边界框的定位不够精确,或是在某些边界情况下识别效果不佳。
综合来看,通过不断调优和改进模型,我们有理由相信这一目标检测模型将在实际应用中展现出良好的性能。接下来的工作中,我们将继续深入研究和解决上述分析中提到的问题,以便不断提高模型在复杂交通环境中的准确性和可靠性。
5.2 混淆矩阵
混淆矩阵是评估分类模型性能的关键工具,尤其是在目标检测任务中,它可以详细显示模型在各个类别上的识别能力。通过对混淆矩阵的分析,我们可以对模型在识别不同交通标志上的准确性和潜在的误识别问题有一个直观的认识。
观察上述混淆矩阵,我们可以注意到大多数交通标志的预测结果呈现在对角线上,这表示模型能够正确地将这些类别的标志识别出来。特别是某些类别,如“限速20公里”、“限速30公里”、“停止”和“直行”等,具有较高的正确识别数,说明模型在这些类别上的性能表现良好。然而,我们也可以看到一些非对角线元素有明显的颜色深度,这表明了模型在这些类别上产生了误识别。
例如,“右侧变窄”这一标志被误识别为“限速50英里”,这可能是由于这两种标志在视觉上有相似性,或者训练样本不足以使模型区分这两个细微的差别。此外,“请注意”标志被误识别为“注意儿童”也是一个值得关注的问题,可能是因为这两个类别的标志在文字和颜色上有一定的相似度。
准确率和召回率是评价模型性能的两个关键指标,它们反映了模型对正类别的预测能力。在混淆矩阵中,我们可以通过观察对角线元素与对应行和列的其他元素的关系来分析这两个指标。一个类别的高准确率意味着该类别的标志很少被误识别为其他类别,而高召回率则表示该类别的标志被模型正确识别的机会很大。从混淆矩阵中,我们可以看出大部分类别的模型都表现出较高的准确率和召回率,这对于实际应用中交通标志的识别是非常有利的。
总之,通过混淆矩阵的分析,我们可以识别出模型在某些类别上可能需要进一步训练的需求,或者需要更多的训练样本来改进模型的准确性。为了进一步提升模型性能,可以考虑在这些易混淆类别上采取数据增强、类别重采样或模型结构调整等策略。同时,这一分析结果为我们提供了有价值的信息,有助于我们了解模型在实际应用中可能面临的挑战和限制,以便进行针对性的优化。
5.3 YOLOv8/v7/v6/v5对比实验
(1)实验设计:
本实验旨在评估和比较YOLOv5、YOLOv6、YOLOv7和YOLOv8几种模型在目标检测任务上的性能。为了实现这一目标,博主分别使用使用相同的数据集训练和测试了这四个模型,从而可以进行直接的性能比较。本文将比较分析四种模型,旨在揭示每种模型的优缺点,探讨它们在工业环境中实际应用的场景选择。
| 模型 | 图像大小 (像素) | mAPval 50-95 | CPU ONNX 速度 (毫秒) | A100 TensorRT 速度 (毫秒) | 参数数量 (百万) | FLOPs (十亿) |
模型 | 图像大小 (像素) | 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.991 | 0.993 | 0.991 |
F1-Score | 0.98 | 0.97 | 0.97 | 0.98 |
(3)实验结果分析:
在本次实验中,我们旨在通过相同的数据集上的布手势目标检测任务,对比分析YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n这四个模型的性能。实验设计考虑了不同模型在mAP(50-95)、CPU和GPU上的推理速度、参数数量和FLOPs等关键性能指标。这些指标对于评估模型在实际应用中的效能至关重要。
在本次实验中,我们旨在通过相同的数据集上的布手势目标检测任务,对比分析YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n这四个模型的性能。实验设计考虑了不同模型在mAP(50-95)、CPU和GPU上的推理速度、参数数量和FLOPs等关键性能指标。这些指标对于评估模型在实际应用中的效能至关重要。
首先,mAP(50-95)作为一项综合评价指标,能够衡量模型在不同IoU阈值下的检测准确性。在这一指标上,YOLOv6n和YOLOv7-tiny展现出最佳性能,mAP接近37.5,而YOLOv5nu的性能稍显不足,mAP为34.3。这表明YOLOv6n和YOLOv7-tiny在目标检测的精确性和可靠性方面具有较大的优势,尤其是在布手势这种需求细致判断的任务中。
从模型效率角度来看,推理速度是另一个重要的评价维度。在CPU上的ONNX推理速度反映了模型在不具备高性能计算资源的设备上的运行效率。YOLOv5nu在这一指标上表现较好,仅需73.6毫秒,而YOLOv8n则稍慢些,需要80.4毫秒。然而,在A100 TensorRT平台上,YOLOv8n以0.99毫秒的速度略胜一筹,这一结果显示了YOLOv8n在高性能计算平台上潜在的更高效能。
参数数量和FLOPs直接关联到模型的复杂度和计算负荷。YOLOv5nu拥有最少的参数数量,仅有2.6百万个,而YOLOv7-tiny的参数数量达到6.01百万。参数较少的模型通常更容易部署在内存受限的设备上,但同时可能会牺牲一些性能。FLOPs的增加通常意味着更多的计算量,但也可能代表更强的特征提取能力,这在YOLOv6n和YOLOv7-tiny较高的mAP值中得到体现。
结合实验任务和模型架构分析,YOLOv6n和YOLOv7-tiny之所以能在mAP上取得优异表现,可能是因为它们采用了更先进的特征提取网络和更复杂的目标分类和定位机制,从而更好地捕获了手势的细节特征。YOLOv5nu虽然在推理速度上有优势,但在mAP上的表现不如其他几个模型,可能是因为其网络结构相对简单,特征提取能力有限。YOLOv8n则在各项指标上都展现出较为均衡的性能,体现了它作为最新版本在设计上的综合优化。
通过这些分析,我们可以得出结论,选择哪一种YOLO模型需要根据实际应用的需求进行权衡。如果是在资源有限的设备上,可能更倾向于选择参数少、推理速度快的模型,如YOLOv5nu;而在追求检测准确性的场合,则应考虑使用YOLOv6n或YOLOv7-tiny。YOLOv8n的均衡特性使其成为在不同应用场景都表现良好的候选模型。通过这一系列的实验和分析,我们为
6. 系统设计与实现
6.1 系统架构概览
在我们的博客中,接下来我们深入探讨架构设计。本系统采用了模块化设计思想,旨在通过清晰定义的组件和接口来提升系统的可维护性和扩展性。下面是系统架构的关键组成部分:
-
检测系统类(Detection_UI)
检测系统类是整个识别系统的核心,它负责协调各个组件的交互。这个类通过集成不同的模块,提供了一个用户友好的界面,用于上传图像或视频,选择模型参数,并展示识别结果。它利用了streamlit
框架来搭建可交互的Web界面,方便用户操作。 -
YOLOv8/v5模型检测器(YOLOv8v5Detector)
YOLOv8v5Detector类扮演了模型检测器的角色,封装了YOLO模型的加载、预处理、预测以及后处理等操作。这个类是我们系统的AI引擎,通过加载预训练的YOLO模型权重来识别图像或视频中的目标。利用这个模块,我们可以轻松地将最新的YOLO模型版本集成到我们的系统中,以便利用其强大的检测能力。 -
日志和结果处理
系统中集成了ResultLogger和LogTable两个类,用于处理和记录识别结果。ResultLogger提供了一个框架来记录每次检测的关键信息,如识别到的目标类别、置信度、位置等。LogTable则负责将这些信息以表格的形式展示和保存,便于用户查看和分析识别结果。 -
工具类和辅助方法
为了提高代码的复用性和减少冗余,系统设计了一系列工具类和辅助方法。例如,abs_path和drawRectBox分别用于处理文件路径的获取和在图像上绘制识别框。此外,get_camera_names、save_uploaded_file等方法则为系统提供了摄像头管理和文件处理的功能。 -
UI布局和样式
通过使用def_css_hitml方法,我们为系统定义了一套统一的CSS样式,保证了用户界面的美观性和一致性。同时,setup_sidebar和setupMainWindow方法则分别负责侧边栏和主窗口的布局设置,使得整个系统界面直观易用。
6.2 系统流程
在探讨基于YOLOv8/v7/v6/v5的目标识别系统的流程时,我们可以从代码中抽象出一系列关键步骤,这些步骤集成了从图像获取、模型预测到结果展示的整个流程。以下是系统的主要流程步骤,它们体现了系统如何协调不同的组件以实现目标识别的功能。
-
初始化系统设置:系统启动时,
SystemController
负责初始化所有需要的模块和参数。 -
模型和数据准备:在初始化过程中,系统会根据选择的模型类型(例如YOLOv8/v5),加载对应的模型权重。同时,系统还会处理输入数据,这可能包括从摄像头捕获的实时图像、上传的图片文件或视频文件。
-
侧边栏配置:用户可以通过侧边栏进行一系列配置,包括选择模型文件、设置置信度阈值、IOU阈值、选择输入源(摄像头或文件)等。这些配置将直接影响检测结果的准确性和效率。
-
运行检测:用户点击“开始运行”按钮后,根据输入源的不同,系统会调用
process_camera_or_file
方法。这个方法负责处理来自摄像头的实时流或处理上传的图片和视频文件。对于实时摄像头输入,系统会不断从摄像头捕获帧,对每一帧调用frame_process
方法进行预处理、模型预测、后处理,并将结果显示在页面上。对于上传的图片文件,系统将读取图片文件,同样通过frame_process
方法进行处理,并将检测结果展示出来。对于上传的视频文件,系统会按帧读取视频内容,每一帧都经过frame_process
方法处理,检测结果随视频播放展示。 -
显示检测结果:无论是实时视频流、图片还是视频文件,处理后的图像以及检测到的对象信息(如类别、置信度等)都会通过Streamlit的组件在用户界面上展示。同时,系统提供了过滤功能,允许用户专注于特定类型的检测结果。
-
日志记录与导出:系统会将检测结果记录到日志中,并允许用户导出结果为CSV格式的文件,方便后续分析和报告。
-
用户界面交互:用户还可以通过侧边栏和其他界面元素,如进度条、按钮等,与系统进行实时交云,调整设置或重新运行检测。
这一系列流程确保了目标识别系统能够在各种环境下准确快速地识别目标。
代码下载链接
如果您希望获取博客中提及的完整资源包,包含测试图片、视频、Python文件(*.py)、网页配置文件、训练数据集、代码及界面设计等,可访问博主在面包多平台的上传内容。相关的博客和视频资料提供了所有必要文件的下载链接,以便一键运行。完整资源的预览如下图所示:
资源包中涵盖了你需要的训练测试数据集、训练测试代码、UI界面代码等完整资源,完整项目文件的下载链接可在下面的视频简介中找到➷➷➷
演示与介绍视频 :https://www.bilibili.com/video/BV1vx421U72g/
YOLOv8/v7/v6/v5项目合集下载:https://mbd.pub/o/bread/mbd-ZZ2akptu
YOLOv8和v5项目完整资源下载:https://mbd.pub/o/bread/mbd-ZZ2Zm5lq
YOLOv7项目完整资源下载:https://mbd.pub/o/bread/mbd-ZZ2Zm5xu
YOLOv6项目完整资源下载:https://mbd.pub/o/bread/mbd-ZZ2akpdv
完整安装运行教程:
这个项目的运行需要用到Anaconda和Pycharm两个软件,下载到资源代码后,您可以按照以下链接提供的详细安装教程操作即可运行成功,如仍有运行问题可私信博主解决:
- Pycharm和Anaconda的安装教程:https://deepcode.blog.csdn.net/article/details/136639378;
软件安装好后需要为本项目新建Python环境、安装依赖库,并在Pycharm中设置环境,这几步采用下面的教程可选在线安装(pip install直接在线下载包)或离线依赖包(博主提供的离线包直接装)安装两种方式之一:
- Python环境配置教程:https://deepcode.blog.csdn.net/article/details/136639396(2,3方法可选一种);
- 离线依赖包的安装指南: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)技术,进一步提升模型的性能和计算效率。
-
多场景适应性:研究模型在不同天气和光照条件下的适应性,通过领域自适应技术提升模型在各种环境条件下的泛化能力。
-
用户交互体验:对系统的用户界面和交互设计进行进一步优化,使其更加友好和智能,以满足不同用户群体的需求。
-
实际应用拓展:探索该交通信号检测系统在智能交通管理、自动驾驶辅助系统等更多实际应用场景中的潜力和价值。
随着深度学习技术的持续发展和应用领域的不断扩大,我们有理由相信,基于YOLO系列模型的交通信号检测技术将在未来在智慧城市建设、交通安全管理、自动驾驶系统等多个领域发挥更加关键的作用。
Redmon J, Farhadi A. Yolov3: An incremental improvement[J]. arXiv preprint arXiv:1804.02767, 2018 ↩︎
Bochkovskiy A, Wang C Y, Liao H Y M. Yolov4: Optimal speed and accuracy of object detection[J]. arXiv preprint arXiv:2004.10934, 2020. ↩︎
Carion N, Massa F, Synnaeve G, et al. End-to-end object detection with transformers[C]//European conference on computer vision. Cham: Springer International Publishing, 2020: 213-229. ↩︎
Wang C Y, Liao H Y M, Wu Y H, et al. CSPNet: A new backbone that can enhance learning capability of CNN[C]//Proceedings of the IEEE/CVF conference on computer vision and pattern recognition workshops. 2020: 390-391. ↩︎
Zhu Z, Liang D, Zhang S, et al. Traffic-sign detection and classification in the wild[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 2110-2118. ↩︎