首页 > 其他分享 >基于深度学习的交通信号灯检测系统(网页版+YOLOv8_v7_v6_v5代码+训练数据集)

基于深度学习的交通信号灯检测系统(网页版+YOLOv8_v7_v6_v5代码+训练数据集)

时间:2024-04-05 14:13:06浏览次数:21  
标签:训练 检测 模型 YOLOv8 信号灯 交通 v5 v7

摘要:本文深入研究了基于YOLOv8/v7/v6/v5的交通信号灯检测系统,核心采用YOLOv8并整合了YOLOv7、YOLOv6、YOLOv5算法,以进行性能指标对比。详细介绍了国内外的研究现状、数据集处理方法、算法原理、模型构建与训练过程,以及基于Streamlit的交互式Web应用界面设计。在Web界面中,用户可以上传图像、视频或直接通过实时摄像头进行交通信号灯的检测,支持上传不同版本的YOLO模型(YOLOv8/v7/v6/v5)进行推理预测。此外,该界面还设计得易于用户修改,以适应不同的需求和场景。本文还附带了完整的网页设计方案、深度学习模型的代码和训练数据集的下载链接,为读者提供了一套全面的解决方案。

目录

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


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

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


1. 网页功能与效果

开启摄像头实时检测

        本系统提供了开启摄像头实时检测功能,用户可以直接通过网页界面激活本地摄像头,实现对交通信号灯的实时监测与识别。该功能适用于动态监控交通状况,为驾驶辅助系统提供实时数据支持。

选择图片检测

        系统支持用户上传本地图片进行交通信号灯检测。用户可以选择任意含有交通信号灯的图片文件,系统将自动识别并标记出图片中的所有交通信号灯,便于用户对静态图像进行分析。

选择视频文件检测

        此外,系统还提供了选择视频文件检测功能,用户可以上传本地视频文件进行批量检测。系统会逐帧分析视频内容,识别并标记每一帧中的交通信号灯,适合于对历史视频资料的分析。

选择不同训练好的模型文件

        为了增强系统的灵活性和适应性,本系统允许用户选择不同训练好的模型文件。用户可以根据自己的需求,选择不同版本的YOLO模型(如YOLOv8、v7、v6、v5)进行检测,满足不同精度和速度的需求。

        在系统的界面设计中,我们还整合了一系列高级功能,以提升用户体验和检测效率。系统支持检测画面和原始画面的同时或单独显示,用户可以通过切换视图模式,对比原始图像与检测结果。此外,系统提供了可点击下拉框单独标记特定目标并显示结果的功能,用户可以针对特定的交通信号灯进行标记和分析。检测结果会实时在页面上的表格中显示,包括检测到的交通信号灯数量、位置等信息。

        为了增加检测的灵活性,系统还允许用户动态调整检测算法的置信度阈值和IOU阈值,以适应不同场景下的检测需求。通过调整这些参数,用户可以在减少误检和漏检之间进行权衡。此外,系统提供了一个便捷的功能,允许用户点击按钮将检测的表格结果输出到CSV文件,方便数据的后续处理和分析。

        最后,为了让用户能够保存检测结果,本系统支持将标记过的图片、视频、摄像头画面结果导出为AVI图像文件,便于用户保留或分享检测结果。这些高级功能的整合,使得本系统不仅能够满足专业用户的复杂需求,也极大地提升了普通用户的使用便利性。


2. 绪论

2.1 研究背景及意义

        在当今社会,随着城市化进程的加速,道路交通系统的安全性和效率成为了公共安全管理中的重点问题。交通信号灯作为调节交通流、保障行人和车辆安全的重要设施,其状态的准确识别对于智能交通系统的发展至关重要。因此,交通信号灯检测技术,尤其是在复杂交通环境下的高精度检测,成为了智能交通领域研究的热点之一。

        交通信号灯检测不仅可以提高自动驾驶车辆的安全性和可靠性,降低交通事故发生率,还能为交通管理提供实时数据支持,优化交通信号控制,缓解城市交通拥堵。此外,随着城市智能化水平的提高,交通信号灯检测还能与其他智能交通设施相结合,为城市交通管理提供更加全面、高效的解决方案。

        在全球范围内,交通信号灯检测技术的研究始终是计算机视觉和机器学习领域的热门话题。早期的研究主要依赖于传统的图像处理技术,如边缘检测、颜色分割等方法。然而,这些方法在复杂的环境条件下,如不同的光照条件、遮挡、不同类型的交通信号灯等情况下,往往难以达到满意的性能。

        近年来,随着深度学习技术的快速发展,尤其是卷积神经网络(CNN)在图像识别和目标检测领域取得的突破性进展,基于深度学习的交通信号灯检测方法逐渐成为研究的主流。特别是YOLO(You Only Look Once)系列算法,以其快速高效的特点,在实时交通信号灯检测方面显示出巨大的潜力。从YOLOv1到最新的YOLOv8,每一次更新都在检测精度、速度和模型鲁棒性上取得了显著的进步。

        此外,随着大规模交通相关数据集的建立和更新,如COCO、PASCAL VOC以及各种专门针对交通信号灯的数据集,为算法的训练和评估提供了丰富的资源。同时,新的网络结构、损失函数、优化方法等技术的提出,也为解决交通信号灯检测中的各种挑战性问题提供了可能。

        综上所述,交通信号灯检测技术的研究不仅具有重要的实际应用价值,也是推动计算机视觉、机器学习等领域发展的重要力量。通过不断优化检测算法,提高模型的准确度和实时性,我们可以期待在不久的将来,智能交通系统将更加智能化、高效化,为城市交通管理和自动驾驶技术的发展提供强大的技术支持。

2.2 国内外研究现状

        在交通信号灯检测领域的研究进展中,多种算法的发展和改进不断推动着这一领域的前沿。从Faster R-CNN的提出,它通过引入区域提议网络(RPN)大幅提高了目标检测的效率和精度,为后续算法提供了新的思路[1]。到YOLO系列的不断迭代,尤其是YOLOv4的出现,它通过引入多尺度训练、路径聚合网络(PAN)和自适应锚点等技术,大大提高了实时目标检测的性能[2]

image

        随后,Transformer在图像领域的应用开启了新的可能性,ViT通过直接在图像块序列上应用Transformer,展现了在大规模数据集上训练时的惊人效果[3]。此外,DETR利用Transformer来预测目标的集合,消除了对NMS等后处理步骤的需求,简化了目标检测流程[4]

        在这一背景下,YOLO系列继续发展,YOLOv5以其轻量化和高效性,在实际应用中获得了广泛应用,尽管其并非官方版本,但它的实用性和灵活性使其成为研究和应用的热点[5]。与此同时,针对特定领域的改进版本如Glod-YOLO,也展示了在特定任务上通过细致调整和优化能够取得显著性能提升的潜力。

        这些算法的发展不仅为交通信号灯检测提供了多样化的技术选择,也推动了智能交通系统的发展。未来,随着算法的不断优化和新技术的涌现,交通信号灯检测的准确性、实时性和鲁棒性将得到进一步的提升,更好地服务于智能交通和自动驾驶领域。

2.3 要解决的问题及其方案

2.3.1 要解决的问题

        在构建基于YOLOv8/v7/v6/v5的交通信号灯检测系统时,我们面临的核心挑战包括提高检测的准确性与速度、确保系统在不同光照和天气条件下的稳定性与泛化能力、设计直观高效的用户交互界面,以及处理和存储大量检测数据的能力。以下是针对这些挑战的具体解决方案:

  1. 提高检测的准确性与速度
             使用最新的YOLO版本(如YOLOv8),配合高效的PyTorch框架,可以显著提升交通信号灯检测的准确率和处理速度。YOLOv8等模型通过引入更深更复杂的网络结构、改进的特征提取机制和优化的锚点设置,有效提高了模型对交通信号灯在不同尺度、姿态和遮挡情况下的识别能力。此外,利用高性能计算资源(如GPU加速),可以进一步提高模型的推理速度,实现实时检测。

  2. 环境适应性和模型泛化能力
            针对交通信号灯检测在不同环境条件下的稳定性问题,本系统通过在多种光照、天气和背景条件下的数据集进行训练,增强模型的泛化能力。同时,引入数据增强技术如随机裁剪、旋转、颜色抖动等,进一步提高模型对复杂环境的适应性。

  3. 用户交互界面的直观性和功能性
             基于streamlit的Web应用界面,为用户提供了直观且功能丰富的操作平台。用户可以轻松上传图片、视频或通过摄像头进行实时交通信号灯检测。界面支持切换不同的YOLO模型版本,以适应不同的检测需求。此外,通过CSS美化界面,提高用户的交互体验。Pycharm作为开发IDE,确保了代码的高效编写和项目的便捷管理。

  4. 数据处理能力和存储效率
            鉴于交通信号灯检测系统需要处理和存储大量图像和视频数据,系统设计了高效的数据处理流程,并采用压缩技术减少存储空间的占用。同时,利用现代数据库技术(如NoSQL数据库),提高了数据查询和检索的效率。

  5. 系统的可扩展性和维护性
            系统采用模块化设计,易于扩展和维护。随着深度学习技术的进步和新版本YOLO模型的发布,系统可以灵活地集成新的功能和模型,以提高检测性能。同时,系统的文档齐全,便于开发者进行定期的维护和更新。

        通过上述解决方案,本系统不仅能够高效准确地完成交通信号灯的检测任务,还具备良好的用户体验和强大的数据处理能力,为智能交通管理和自动驾驶等应用提供了可靠的技术支持。

2.3.2 解决方案

        针对基于YOLOv8/v7/v6/v5的交通信号灯检测系统的实现,我们采取以下策略来应对系统开发过程中的各项挑战:

  1. 深度学习模型的选择和优化

    • 模型架构:选用YOLOv8作为核心检测模型,凭借其出色的检测速度和精度平衡,适应实时交通信号灯检测需求。根据实际应用场景的差异,也可选用YOLOv7、v6或v5等其他版本进行对比测试,以找到最佳的模型方案。
    • 数据增强:为了增强模型在多变环境下的泛化能力,将采用多种数据增强技术,如随机裁剪、旋转、亮度调整等,以模拟各种光照和天气条件下的交通信号灯图像。
    • 迁移学习:利用预训练的YOLO模型作为基础,通过在特定的交通信号灯数据集上进行微调,加速模型训练过程并提升检测性能。
  2. 技术框架和开发工具的选择

    • PyTorch框架:选择PyTorch作为深度学习框架,以其灵活性和强大的GPU加速支持,便于高效开发和模型训练。
    • Streamlit Web界面:采用Streamlit构建用户交互界面,提供图片、视频和实时摄像头的交通信号灯检测功能。Streamlit的简洁高效使得快速开发交互式Web应用成为可能。
    • CSS美化:使用CSS对Streamlit界面进行个性化美化,提高用户体验。
    • PyCharm IDE:使用PyCharm进行系统开发,凭借其强大的代码编辑、调试和项目管理功能,保障开发效率和代码质量。
  3. 功能实现和系统设计

    • 多模型支持:设计系统以支持不同版本的YOLO模型文件动态切换,提供更高的灵活性和适用范围。
    • 多输入源兼容:确保系统能够处理来自图片、视频文件和实时摄像头的输入,适应各种检测场景。
    • 用户交互设计:开发简洁直观的用户界面,实现模型选择、文件上传、实时检测等功能,确保用户操作便捷。
  4. 数据处理和存储策略

    • 高效数据处理:利用PyTorch的DataLoader和预处理功能,实现高效的图像数据加载和处理,保证系统的实时响应能力。
    • 智能数据存储:设计合理的数据存储方案,对检测结果进行有效管理,便于后续的数据访问和分析。
  5. 性能优化和系统测试

    • 性能调优:定期对系统进行性能评估,通过模型剪枝、量化等技术优化模型大小和速度,确保满足实时检测需求。
    • 全面测试:执行全面的系统测试,包括功能测试、性能测试和用户体验测试,确保系统的稳定性和可靠性。

        通过实施上述方法,本系统旨在提供一个高效、准确且用户友好的交通信号灯检测解决方案,满足智能交通系统在不同场景下的应用需求,同时具备良

2.4 博文贡献与组织结构

        本文详细探讨了基于YOLOv8/v7/v6/v5的交通信号灯检测系统的设计与实现,旨在为智能交通系统提供准确、高效的交通信号灯识别解决方案。文章的主要贡献可归纳为以下几点:

  1. 综合文献回顾:本文对交通信号灯检测领域的相关文献进行了全面综述,不仅回顾了传统图像处理方法,还深入分析了基于深度学习的最新算法,为研究者提供了丰富的参考资料。

  2. 数据集处理技术:详细介绍了交通信号灯检测所用数据集的预处理、增强等技术,旨在提高模型训练的效率和检测的准确度,同时也为处理类似数据集提供了方法指导。

  3. 算法选择与优化:本文不仅对比了YOLO系列中的v8、v7、v6、v5等不同版本的性能,还深入探讨了算法的选择与优化策略,为实现高效准确的交通信号灯检测提供了技术指导。

  4. Streamlit网页设计:利用Streamlit设计了美观且用户友好的网页界面,使得交通信号灯检测更加便捷,提升了用户体验,为交通信号灯检测的应用提供了新的交互方式。

  5. 性能对比分析:通过对YOLOv7、v6、v5等算法在同一数据集上的检测效果进行对比分析,为选择最适合交通信号灯检测任务的模型提供了依据。

  6. 资源共享:文章提供了完整的数据集和代码资源包下载链接,便于读者复现实验结果,促进了技术的开源共享和交流。

        文章的后续章节安排如下:

  • 绪论:介绍研究背景、研究意义及主要研究内容和贡献。
  • 算法原理:详细阐述YOLOv8/v7/v6/v5等算法的设计原理和核心技术。
  • 数据集处理:描述数据集的选取、预处理和增强等关键步骤。
  • 代码介绍:提供模型预测与训练的详细代码实现,包括环境配置、参数设置等。
  • 实验结果与分析:展示各个模型在交通信号灯检测任务上的性能表现,并进行深入分析。
  • 系统设计与实现:详细介绍基于Streamlit的交互式网页设计和系统整体架构。
  • 结论与未来工作:总结本文的主要发现和贡献,并展望未来研究的方向和可能的改进空间。

        通过这一系列的章节安排,本文旨在为读者提供一个系统的了解和深入分析基于YOLO系列模型的交通信号灯检测系统的设计与实现。


3. 数据集处理

        在本研究中,我们精心准备了一个广泛的交通信号灯数据集,旨在支持和验证我们的交通信号灯检测系统。该数据集共包含20,841张图像,其中训练集占据了绝大部分,包括18,207张图像,验证集包含1,755张图像,而测试集则由879张图像组成。这样的分配确保了在模型训练期间有足够的样本来学习,并且在模型评估期间有充足的样本来验证模型的泛化能力。

Chinese_name = {'green': "绿灯", 'red': "红灯", "yellow": "黄灯"}

        每张图像都经过了系统的预处理,包括自动定位像素数据和剥离EXIF方向信息,以及调整大小至统一的640x640像素。统一的图像尺寸有助于深度学习模型处理和学习,同时剥离方向信息确保了图像的一致性,无论它们在拍摄时的设备方向如何。为了模拟现实世界条件,对图像进行了随机高斯模糊处理,模拟不同的视觉干扰,提高模型的鲁棒性。每个边界框还经历了随机旋转和椒盐噪声处理,这些增强了数据的多样性,并且有助于模型学习识别各种条件下的交通信号灯。

        从我们的数据集分布分析图中,可以观察到一些关键信息。首先,数据集中的交通信号灯主要被标记为“绿灯”和“红灯”,数量远多于“黄灯”。这一分布可能反映了真实世界交通信号灯状态的出现频率,其中绿灯和红灯是最常见的信号,而黄灯则相对较少。此外,通过对边界框位置的分布图(通常称为热力图)进行分析,我们注意到大多数交通信号灯出现在图像中部的特定区域。这有助于确定模型可能需要特别关注的图像区域,进而可以在这些区域采用更细致的特征提取策略。

        边界框大小的分布揭示了交通信号灯在图像中的尺寸多样性。从图中可见,宽度和高度分布较为集中,表明大多数交通信号灯具有相对一致的比例。这对于训练深度学习模型来说是一个积极信号,因为模型可以学习到一致的特征,从而更好地识别出不同尺寸的信号灯。尽管如此,我们也注意到边界框宽高比的分布存在一定程度的分散,这表明在实际场景中,信号灯的视觉呈现可能因距离和角度的不同而有所变化。这样的多样性要求我们的检测系统不仅要能够识别标准的交通信号灯图像,还要能够处理不同尺寸和角度的变化,确保系统的鲁棒性和准确性。

        综合来看,我们的数据集通过精心设计的预处理和增强技术,成功地模拟了各种实际驾驶环境下交通信号灯的可能变化,这些工作为训练一个高效准确的交通信号灯检测模型奠定了坚实基础。这不仅为开发更先进的交通监测和辅助系统提供了必要的数据支持,也为交通安全研究和智能交通管理系统的实现提供了宝贵的资源。

4. 原理与代码介绍

4.1 YOLOv8算法原理

        YOLOv8(You Only Look Once version 8)是一种最新的、用于目标检测、图像分类和实例分割任务的先进YOLO模型。YOLOv8与前代产品相比,专注于提高准确性和效率。

        YOLOv8算法提供了一个全新的SOTA模型,可用于计算机视觉领域的目标检测、图像分类、实例分割和目标跟踪等任务。YOLOv8的主要结构包括主干特征提取网络(Backbone)、特征强化提取网络(Neck)以及检测头(Head)三个部分。其网络结构图如下图所示。

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

4.2 模型构建

        在我们的交通信号灯检测系统中,YOLOv8v5Model.py文件承载了构建和操作模型的核心逻辑。这个脚本精巧地封装了加载预训练模型、执行预测、处理图像等关键步骤,以便对交通信号灯进行准确快速的检测。首先,脚本引入了各种必需的库,其中OpenCV库处理图像和视频数据,PyTorch库提供深度学习模型的实现,而从QtFusion.models导入的Detector类为我们的模型提供了抽象基类。ultralytics库的YOLO类负责加载和使用YOLO模型进行目标检测,而torch_utils提供的select_device函数则用于智能选择运行模型的设备。

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),置信度阈值、IOU阈值,以及是否进行类别过滤。这些参数可以根据实际需求进行调整。这些参数的设定直接关系到模型的性能和预测结果的准确度。IOU阈值用于非最大抑制(NMS)过程,帮助减少重叠的预测框,而置信度阈值则确定了预测必须达到多少置信度才被视为有效。

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类封装了模型的行为,包括模型加载、图像预处理、预测和后处理。模型加载功能选择适当的设备并加载预训练的YOLO模型,以确保可以立即进行目标检测。预处理功能在当前实现中直接返回传入的图像,但为未来可能的图像转换留出了空间。预测功能是模型的核心,它接受输入图像并使用YOLO模型产生检测结果。这个过程将图像中潜在的每个目标封装为一系列预测结果,其中包括类别、边界框和置信度分数。后处理函数进一步解析YOLO模型的原始输出,将其转换成一种更加结构化和可读性强的格式。这个步骤至关重要,因为它使最终用户能够轻松理解和使用模型的预测结果。

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)

        最后,提供了一个设置参数的方法,允许用户在运行时根据需求调整模型的置信度和IOU阈值。这意味着用户可以动态调整模型的行为,以获得更好的检测效果,例如,在精确度更重要的情况下提高置信度阈值,或者在召回率更重要时降低它。

        通过这些方法,我们可以实现从加载模型到获取检测结果的完整流程。最终,这些代码片段的整合不仅提高了检测效率,而且通过优化后的参数设置和预处理策略,进一步提升了检测的准确率。这些都是交通信号灯检测系统的技术核心,它们背后的详细代码实现和逻辑,都是为了应对识别的特定挑战而精心设计的。

4.3 训练代码

        在本篇博客中,我们将探讨如何使用YOLOv8模型来训练一个交通信号灯识别系统。这一过程不仅涉及到深度学习模型的加载和初始化,还包括数据集的准备以及训练参数的配置。以下表格详细介绍了YOLOv8模型训练中使用的一些重要超参数及其设置:

超参数 说明
epochs 模型在所有训练数据上迭代的次数 120
batch 每一次迭代中用于梯度更新的图像数量 16
imgsz 输入图像的尺寸(像素),通常是一个正方形 640x640
optimizer 用于优化模型的算法 auto
lr0 初始学习率,训练开始时的更新步长 0.01
lrf 学习率的最终值,用于学习率退火策略 0.01
momentum 动量优化中的动量参数,有助于加速SGD在相关方向上的前进并抑制震荡 0.937
weight_decay 权重衰减,用于避免过拟合的正则化策略 0.0005
iou 交并比阈值,用于非极大值抑制(NMS),去除多余的边界框 0.7
conf 置信度阈值,用于判定预测框是否包含对象 null
amp 自动混合精度训练,用于加速训练并减少内存使用 true
rect 是否使用矩形训练,用于不同形状的图像 false
cache 是否将数据缓存到RAM,加速

        环境设置与模型加载:首先需要导入必要的库,以便在训练过程中使用它们的功能。

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

        这些库提供了文件路径操作、深度学习功能和模型加载的能力。特别是ultralytics库中的YOLO类,这是我们训练YOLO模型的核心工具。

        接下来,我们根据当前系统是否支持CUDA(即NVIDIA GPU加速)来设置设备变量。这一步对于加速训练过程至关重要。

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

        数据集准备:我们首先设置了工作线程和批量大小,这些参数会影响数据加载的速度和内存使用。这里,workers指定了用于数据加载的工作线程数量,batch则设置了每个批次的图像数量。

workers = 1  # 工作进程数
batch = 8  # 每批处理的图像数量

        为了正确地加载和处理训练数据,我们需要指定数据集配置文件的路径:

data_name = "MaskDataset"
data_path = abs_path(f'datasets/{data_name}/{data_name}.yaml', path_type='current')  # 数据集的yaml的绝对路径
unix_style_path = data_path.replace(os.sep, '/')

        这段代码构建了数据集配置文件的路径,并使用abs_path函数转换为绝对路径,以避免路径相关的错误。
        紧接着,我们对数据集配置文件进行了一系列的读取和修改操作,以确保它指向正确的数据目录:

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模型,并设置了任务类型为detect,准备开始训练。在这里,我们传递了所有必要的参数,包括图像大小imgsz,训练轮数epochs和训练任务的名称。此训练任务将执行120个时期的训练,这是一个在实践中通常需要根据实际情况调整的参数。

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  # 指定训练任务的名称
)

        通过上述过程,我们成功地配置并启动了交通信号灯识别模型的训练任务。YOLOv8作为一个强大的目标检测框架,为我们的训练任务提供了良好的支持,使得训练过程既高效又方便。在训练完成后,我们将得到一个针对交通信号灯识别任务优化过的模型,它将能够准确识别和分析图像中的交通信号灯,为后续的应用提供强大的技术支撑。


5. 实验结果与分析

5.1 训练曲线

        YOLOv8在训练过程中的损失函数图表为我们提供了模型学习过程中的直观反馈。从损失函数图像中,我们可以观察到模型在训练过程中的表现与进步。

        首先,我们看到训练集上的边界框损失(train/box_loss)、分类损失(train/cls_loss)和方向损失(train/dfl_loss)随着训练周期的增加而稳定下降。这表明模型在逐步学习到如何准确地定位对象、分类对象以及预测对象的方向。这种损失的持续减少是模型正在学习并改进其预测的一个积极信号。特别是在训练早期阶段,损失函数下降得非常快,这通常是因为模型在这一阶段从较大的权重更新中受益,这些更新可以迅速减少预测错误。

        在验证集上的损失函数(val/box_lossval/cls_lossval/dfl_loss)同样显示了下降的趋势,但是下降的速度和幅度略小于训练集。这是预期内的现象,因为验证集上的数据模型在训练过程中未曾见过,模型在验证集上的表现能够给我们提供是否发生过拟合的重要信息。在本例中,验证集损失的稳定下降说明模型在训练集上学到的特征是有普遍性的,可以泛化到未见过的数据上。

        在评价指标方面,模型的精确度(metrics/precision(B))和召回率(metrics/recall(B))在训练过程中逐渐提升,并在一定周期后趋于稳定,显示出模型在

        正确分类正样本(即交通信号灯)方面越来越精确,同时能够检出更多的真正样本。精确度的提升指向了较少的假阳性率,即较低的将背景或其他对象错误标记为交通信号灯的情况。而召回率的提高则说明模型遗漏真正的交通信号灯的情况变少。这两个指标的改善说明了模型在区分和检测交通信号灯方面的能力正在增强。

        另外,平均精度均值(mAP)是评估目标检测模型常用的指标,我们观察到mAP的两个变体:[email protected]metrics/mAP50(B))和[email protected]metrics/mAP50-95(B))。[email protected]较为宽松,它计算的是在0.5的交并比阈值下模型的平均精度,而[email protected]则考虑了从0.5到0.95不等的更严格的交并比阈值,这更贴近实际应用中的评价标准。我们看到,在训练过程中,这两个指标均有所提升,尤其是[email protected],其提升较为显著,这表明模型在较为宽松的条件下表现良好。而[email protected]虽然提升较慢,但稳定上升的趋势显示了模型在各种阈值条件下都在逐步改进。

        总体来看,从损失和性能指标的变化中可以看出,YOLOv8模型在训练过程中表现出了良好的学习效果和稳健的泛化能力。随着训练的进行,模型的边界框定位变得更加准确,分类能力增强,且对对象方向的预测也越来越准确。精确度和召回率的稳步提高表明模型在保持高检出率的同时,减少了错误标记的情况,这对于实时交通信号灯检测系统来说尤为重要。此外,mAP的逐步提高显示了模型对各种不同难度检测任务的适应性和准确性。

        这些性能指标的提升,直接反映了训练过程中超参数设置的合理性。例如,初始学习率、学习率调整策略、优化器选择等对模型收敛速度和最终性能都有显著影响。在实际应用中,这些参数的调整需要根据具体任务和数据集特性来定制,以获得最优的检测性能。

        因此,YOLOv8模型训练的损失和性能图表不仅为我们提供了训练进度的直观展示,而且为进一步的模型优化和调整提供了有价值的参考。通过细致分析这些图表,我们可以针对性地调整训练策略,如增加数据增强、调整超参数等,以进一步提高模型性能,满足实际部署中对准确性和实时性的双重要求。

5.2 混淆矩阵

        混淆矩阵是评估分类模型性能的重要工具,它不仅能够显示模型的正确和错误分类,还能提供错误分类的具体类型。从提供的混淆矩阵图像中,我们可以得到一些关键的分析结果。

image

        首先,模型在识别“绿灯”(green)和“红灯”(red)上表现出了很高的准确率,这从矩阵的对角线元素可以明显看出。具体来说,绿灯被准确识别了1039次,而红灯则被准确识别了1269次,这表明模型在这两个类别上的表现是相当准确的。这一结果对于交通信号灯检测系统来说至关重要,因为它意味着系统能够可靠地识别交通中最常见的信号状态。

        对于“黄灯”(yellow)类别,混淆矩阵显示,模型正确识别了161次,虽然数量较少,但考虑到数据集中黄灯样本的分布可能本身就较少,这一识别结果仍然是合理的。不过,存在两次将绿灯误识别为黄灯,以及两次将红灯误识别为黄灯的情况,可能是由于黄灯在颜色和亮度上与绿灯和红灯比较相似,这也提示我们在未来的模型训练中可以加强对黄灯的识别能力,或在数据采集上增加黄灯的样本比例。

        在非交通信号灯背景类别的识别上,我们可以看到,模型较少地将背景误分类为交通信号灯,即背景被正确识别的次数分别为38次为绿灯背景、46次为红灯背景和7次为黄灯背景,显示模型在大多数情况下能够有效区分交通信号灯与背景。然而,也存在一些误分类,例如将交通信号灯误判为背景的情况。这可能表明在特定情境下,模型对于信号灯的特征提取不够鲁棒,或者背景中存在与信号灯相似的颜色和形状特征。

        混淆矩阵中的非对角线元素揭示了模型识别过程中的混淆情况。在此,误识别的数目相对较低,这表明模型的总体性能是良好的。尽管如此,这些误识别的存在仍提示我们需要进一步优化模型。可以考虑引入更多具有挑战性的样本,对模型进行更细致的调整,或者使用更先进的特征提取技术来改善模型对于不同交通信号灯状态的识别能力。

        结合以上分析,我们可以得出结论,该模型在交通信号灯检测任务上总体上表现良好,尤其是在识别绿灯和红灯方面。

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.975 0.975 0.969 0.975
F1-Score 0.95 0.95 0.95 0.94

(3)实验结果分析        在我们的实验中,通过在相同条件下比较YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n四个模型,我们旨在揭示这些模型在交通信号灯检测任务上的性能差异。实验的设计确保了所有模型都在公平的基础上进行评估,以期得到具有说服力的比较结果。

       从实验结果中可以看出,YOLOv5nu、YOLOv6n和YOLOv8n在mAP指标上都达到了0.975的高分,而YOLOv7-tiny略低,为0.969。同样,在F1-Score上,YOLOv5nu、YOLOv6n表现稳定,均为0.95,而YOLOv8n略低一些,为0.94。mAP衡量了模型在不同IoU阈值下的检测精确度,而F1-Score则更偏重于检测的精确性和召回率的平衡。这些模型的高mAP得分表明它们在交通信号灯检测任务上能够准确地定位和分类对象。

       YOLOv5nu和YOLOv6n的高F1-Score说明了这两个模型在保持高召回率的同时,也很少产生误检。这种平衡对于实际应用非常重要,尤其是在交通监控领埤,一个过低的召回率可能导致无法检测到重要的信号灯状态变化,而过多的误检则会降低系统的可靠性。YOLOv7-tiny虽然在mAP上略低,但其F1-Score与其他两个模型相同,这意味着它在精确度和召回率上表现仍然很好。YOLOv8n尽管在mAP上表现出色,但F1-Score略低可能表明它在减少误检(即提高精确度)与检测出更多真实目标(即提高召回率)之间的平衡上略逊一筹。

       这种性能差异可能与各个版本的YOLO模型在架构设计上的不同有关。例如,YOLOv7-tiny可能是由于其网络结构相对更简单(如“tiny”所暗示的),导致其在识别上不如其他版本精细,反映在略低的mAP值上。而YOLOv8n的F1-Score较低可能是因为它在尝试降低误检的过程中牺牲了一些召回率,或者是因为它在某些特定情况下的泛化能力稍逊。这些微妙的性能差异体现了不同模型间权衡和优化的结果。

       值得注意的是,所有模型在mAP指标上都有相似和较高的得分,这可能指出对于此类任务,当前的YOLO架构已相对成熟,主要的性能提升可能来自于训练过程中的数据预处理和增强、训练策略的调整以及后处理步骤(如NMS的使用)的优化。而在选择模型部署到实际应用时,除了考虑准确性,还应考虑模型的速度、计算效率和资源占用等因素。

       综上所述,各版本YOLO模型在交通信号灯检测任务上都表现出色,且在不同的性能指标上有着各自的优势和劣势。这些细微的差别揭示了不同模型架构和训练策略之间的权衡,为我们选择和定制目标检测模型提供了实用的见解。在未来的研究中,我们可以进一步探索如何通过调整模型架构或训练策略来提高特定性能指标,以及如何在实际应用中根据需求选择最适合的模型。


6. 系统设计与实现

6.1 系统架构概览

        系统架构主要包括以下几个关键组件:模型管理数据处理UI交互日志记录。每个组件都承担着系统运行中的特定职责,共同确保了系统的高效和稳定运行。

(一)模型管理

在模型管理部分,我们使用了YOLOv8v5Detector类来负责目标检测模型的加载、配置和预测。这个类封装了对YOLOv8/v7/v6/v5系列模型的操作,包括模型的加载(load_model)、参数设置(set_param)以及执行预测(predict)等。我们通过model_type属性支持不同版本的YOLO模型选择,以适应不同的性能和精度需求。

(二)数据处理

数据处理是系统的核心部分,负责对输入的图像数据进行预处理、调用模型进行预测以及后处理预测结果。这一功能主要通过frame_process方法实现。首先,通过调整图像尺寸(cv2.resize)和进行必要的图像预处理(model.preprocess)准备好模型输入数据。然后,使用模型进行预测并获取结果。最后,通过model.postprocess对预测结果进行后处理,包括绘制检测框(drawRectBox)和生成检测信息。

(三) UI交互

UI交互组件通过streamlit库构建,负责与用户的直接交互。在Detection_UI类中,我们设计了侧边栏配置(setup_sidebar)、页面布局设置(setup_page)和主窗口运行逻辑(setupMainWindow)等方法。用户可以通过侧边栏选择模型类型、调整检测参数、选择输入源等,系统根据这些配置实时更新主窗口显示的内容。

(四)日志记录

日志记录功能由LogTableResultLogger两个类共同完成。LogTable类负责管理检测过程中生成的所有日志数据,包括检测结果的保存、日志数据的持久化(save_to_csv)以及日志视图的更新(update_table)。ResultLogger则用于将每次检测的结果整合(concat_results),方便在UI中显示和日志文件中记录。

        通过上述设计,我们的系统能够有效地处理交通信号灯图像中的目标检测任务,为用户提供直观、实用的检测工具。我们将继续优化系统架构,引入更先进的技术,以提高检测的准确性和系统的可用性。

6.2 系统流程

        针对基于YOLOv8/v7/v6/v5的交通信号灯检测系统,下面我们将深入探讨系统的具体工作流程,并结合代码中的类和方法进行详细说明:

  1. 系统初始化(__init__

    • 在这一步,系统将完成基础设置,包括初始化类别标签、设置页面标题、应用CSS样式、配置模型参数(如置信度阈值、IOU阈值)以及加载默认的或自定义的模型权重等。
  2. 用户配置

    • 用户通过侧边栏(setup_sidebar方法中实现)进行配置,可以选择模型类型、调整检测参数(如置信度conf_threshold和IOU阈值iou_threshold),并选择输入源(上传的文件或摄像头)。
  3. 文件上传与摄像头选择

    • 用户选择上传文件(图片或视频)或选择摄像头作为输入源。系统通过uploaded_fileselected_camera变量处理用户的选择。
  4. 图像处理与目标检测(frame_process

    • 对于每个输入图像,首先使用cv2.resize调整图像尺寸,然后model.preprocess对图像进行预处理,以适配YOLOv8v5Detector模型的输入要求。
    • 调用YOLOv8v5Detectorpredict方法进行目标检测,然后对预测结果应用model.postprocess进行后处理,如绘制检测框(drawRectBox)并生成检测信息。
  5. 结果展示与日志记录

    • 系统在主界面上通过image_placeholderimage_placeholder_res展示处理后的图像。同时,检测信息如目标类别、置信度等通过LogTable类记录,并支持以CSV格式导出(save_to_csv)。
  6. 用户交互与反馈

    • 用户可以通过侧边栏进行进一步的操作,如更改检测参数或重新选择输入源。系统根据用户操作实时更新UI显示和检测结果。
  7. 结束与清理

    • 用户操作完成后,可以通过点击UI中的导出按钮(在setupMainWindow中处理)导出检测结果日志。系统也会在结束时自动进行资源释放和清理工作。

        本系统通过以上流程,有效地实现了对交通信号灯图像检测,从用户配置到结果展示的每一环节都设计得尽可能直观易用,确保了系统的实用性和有效性。


代码下载链接

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

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

演示与介绍视频https://www.bilibili.com/video/BV12p421C74y/
YOLOv8/v7/v6/v5项目合集下载https://mbd.pub/o/bread/mbd-ZZ2akpts
YOLOv8和v5项目完整资源下载https://mbd.pub/o/bread/mbd-ZZ2Zm5hw
YOLOv7项目完整资源下载https://mbd.pub/o/bread/mbd-ZZ2Zm5xq
YOLOv6项目完整资源下载https://mbd.pub/o/bread/mbd-ZZ2akpdr

完整安装运行教程:

        这个项目的运行需要用到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)技术,以进一步提升交通信号灯检测系统的性能和效率。
  • 多模态融合:考虑结合语音、文本等其他模态信息,采用多模态学习方法进行交通信号灯检测,以更全面地理解交通信号灯的状态和意图。
  • 跨域适应性:研究跨地区、跨时间段的交通信号灯检测,通过领域自适应技术提高交通信号灯检测系统在不同场景和条件下的泛化能力。
  • 用户交互体验:进一步优化系统的用户界面和交互设计,使其更加人性化、智能化,以满足更广泛用户的需求。
  • 实际应用拓展:探索交通信号灯检测在更多实际应用场景中的应用,如智能交通管理、城市规划、智慧交通等,以发挥其最大的社会和经济价值。

        总之,交通信号灯检测技术正处于快速发展之中,随着技术的不断进步和应用场景的不断拓展,我们相信在不久的将来,基于YOLOv8/v7/v6/v5的交通信号灯检测系统将在交通安全、智慧城市建设等领域发挥更加重要的作用。


  1. Ren S, He K, Girshick R, et al. Faster r-cnn: Towards real-time object detection with region proposal networks[J]. Advances in neural information processing systems, 2015, 28. ↩︎

  2. Bochkovskiy A, Wang C Y, Liao H Y M. Yolov4: Optimal speed and accuracy of object detection[J]. arXiv preprint arXiv:2004.10934, 2020. ↩︎

  3. Dosovitskiy A, Beyer L, Kolesnikov A, et al. An image is worth 16x16 words: Transformers for image recognition at scale[J]. arXiv preprint arXiv:2010.11929, 2020. ↩︎

  4. Carion, N., Massa, F., Synnaeve, G., Usunier, N., Kirillov, A., & Zagoruyko, S. (2020). End-to-End Object Detection with Transformers. European Conference on Computer Vision (ECCV). ↩︎

  5. Yadav P K, Thomasson J A, Searcy S W, et al. Computer Vision for Volunteer Cotton Detection in a Corn Field with UAS Remote Sensing Imagery and Spot Spray Applications[J]. arXiv preprint arXiv:2207.07334, 2022. ↩︎

标签:训练,检测,模型,YOLOv8,信号灯,交通,v5,v7
From: https://www.cnblogs.com/deeppython/p/18098592

相关文章