基于深度学习的交通信号标志识别系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

摘要:本文深入研究了基于YOLOv8/v7/v6/v5等深度学习模型的交通信号灯检测系统,核心采用YOLOv8并整合了YOLOv7YOLOv6YOLOv5算法,进行性能指标对比。详述了国内外研究现状、数据集处理、算法原理、模型构建与训练代码,以及基于Streamlit的交互式Web应用界面设计。在Web网页中,用户可以支持图像、视频和实时摄像头进行交通信号灯检测,可上传不同训练模型(YOLOv8/v7/v6/v5)进行推理预测,界面可方便修改。本文附带了完整的网页设计、深度学习模型代码和训练数据集的下载链接,为交通信号灯检测系统的研究与应用提供了有力支持。

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

网页版-基于深度学习的交通信号标志识别系统(YOLOv8/v7/v6/v5+实现代码+训练数据集)


1. 网页功能与效果

        (1)开启摄像头实时检测:系统允许用户通过网页界面轻松开启计算机摄像头,实现实时交通信号灯的检测。用户可以直观地在网页上看到摄像头捕获的实时画面及检测结果,为实时监控提供便利。
在这里插入图片描述

        (2)选择图片检测:本系统支持用户上传本地图片文件进行交通信号灯检测。用户可以通过简单的点击操作选择图片,系统将自动处理并展示检测结果,方便用户针对静态图像进行快速检测。
在这里插入图片描述

        (3)选择视频文件检测:除了静态图片,系统还提供了对视频文件的检测功能。用户可以上传本地存储的视频文件,系统将逐帧分析视频内容,展示包含检测结果的视频流,帮助用户分析和理解交通信号灯在动态场景中的表现。

在这里插入图片描述

        (4)选择不同训练好的模型文件:为了满足不同用户的需求,系统设计了模型选择功能。用户可以根据自己的需求,从多个预训练好的模型文件中选择最适合的一个进行检测,以获得最佳的检测效果。
在这里插入图片描述
        在系统的界面设计上,我们提供了丰富的交互功能,以提高用户体验和检测效率。检测画面和原始画面可以根据用户的需求,同时或单独显示。用户可以通过可点击下拉框选择是否只标记特定的目标,并在界面上直观地显示检测结果。所有的检测结果会实时保存并在页面的表格中显示,便于用户查看和分析。

        为了提高检测的准确性和灵活性,用户可以动态调整检测算法的置信度阈值和IOU阈值,以滤除不确定的检测结果,确保结果的可靠性。此外,为了方便用户保存和分析检测数据,系统提供了一个功能,允许用户通过点击按钮,将检测的表格结果输出到csv文件。

        针对需要保存检测结果的场景,我们还考虑到了用户的实际需求,允许将标记过的图片、视频以及摄像头的实时画面结果导出为avi图像文件,便于后续的查看、分析或分享。这一系列的功能设计,旨在为用户提供一个全面、高效、便捷的交通信号灯检测平台,满足不同场景下的检测需求。


2. 绪论

2.1 研究背景及意义

        在当今社会,随着城市化进程的加速和车辆保有量的急剧增加,交通管理和安全已经成为了城市发展中不可忽视的重要问题。尤其在繁忙的城市交通中,交通信号灯作为调控交通流、确保行车及行人安全的关键设施,其重要性不言而喻。然而,由于人为的监控存在局限性,如视线盲区、注意力不集中等问题,传统的交通监控手段难以满足日益增长的城市交通管理需求。因此,自动化的交通信号灯检测技术应运而生,它不仅可以提高交通管理效率,减少交通事故的发生,还可以为自动驾驶汽车的发展提供重要的技术支撑。

        在国内外,关于交通信号灯检测的研究已经取得了一定的进展。众多研究者利用计算机视觉和深度学习技术,开发出了一系列的交通信号灯检测算法。在这些算法中,基于YOLO(You Only Look Once)系列的目标检测算法因其高效性和准确性而备受关注。YOLO算法将目标检测任务视为一个单一的回归问题,直接从图像像素到目标类别概率和边界框坐标的映射,大大加快了检测速度,满足了实时处理的需求。自从YOLO算法的首次提出以来,其后续版本YOLOv2、YOLOv3直至最新的YOLOv8,都在不断地对算法架构进行优化,提高了检测的准确度和速度,尤其是在处理复杂交通场景下的小目标检测方面表现突出。

        然而,尽管YOLO系列算法在交通信号灯检测方面取得了显著的成果,但仍然面临着一些挑战,如在极端光照条件下的检测稳定性、遮挡情况下的检测准确性、以及不同国家和地区交通信号灯标准的多样性等。针对这些问题,一些研究提出了改进方案,如引入注意力机制以提高模型对关键特征的敏感度,使用数据增强和迁移学习技术来增强模型的泛化能力,以及开发适用于特定地区标准的定制化模型等。

        本博客旨在深入探讨交通信号灯检测的技术背景及其在智能交通系统中的重要意义,回顾并分析国内外在该领域的研究现状和进展,特别是YOLO系列及其他最新类型目标检测算法的改进和应用。我们将详细讨论这些算法面临的主要挑战和提出的解决方案,并着重介绍我们在提高交通信号灯检测性能方面的主要贡献,包括算法优化、数据集更新和性能改进等方面。通过这些研究,我们期望为智能交通系统的发展提供有力的技术支持,为实现更加安全、高效的城市交通管理贡献力量。

2.2 国内外研究现状

        在近年来的计算机视觉领域,目标检测技术尤其是交通信号灯检测方面的研究取得了显著进展。特别是随着深度学习技术的不断发展,一系列基于深度神经网络的算法被提出,并在交通信号灯检测任务中展现出了优异的性能。
在这里插入图片描述
        YOLO系列作为目标检测领域的重要算法之一,从YOLOv5到最新的YOLOv8,不断地在速度和准确度上进行优化。YOLOv5以其轻量级和高效性在实时应用场景中得到了广泛的应用。随后,YOLOv6、YOLOv7和YOLOv8通过引入更先进的特征融合机制、注意力机制和更精细的边界框预测方法,进一步提升了检测的准确性和鲁棒性12

        除了YOLO系列,Transformer-based的目标检测算法如DETR和ViT通过自注意力机制有效捕获全局信息,展现出在复杂场景下的优越检测性能3。Glod-YOLO作为YOLO的一个改进版本,通过集成全局上下文信息和局部细节信息,有效提升了小目标检测能力,特别是在交通场景中的应用表现出色4

        在数据集方面,随着技术的发展,高质量的交通信号灯数据集如TT100K和BDD100K为算法的发展和评估提供了重要的支撑。这些数据集的构建不仅丰富了研究内容,还推动了交通信号灯检测技术的快速发展5

        尽管取得了显著的进展,交通信号灯检测在实际应用中仍面临多样化的挑战,如在不同光照条件下的稳定性、多样化的信号灯形状和颜色的识别等问题。未来的研究将需要更加关注算法的泛化能力、实时性和鲁棒性的提升,以适应更加复杂多变的真实世界应用场景。

2.3 要解决的问题及其方案

2.3.1 要解决的问题

        在本项目中,我们面临的挑战和解决方案围绕构建一个基于YOLOv8/v7/v6/v5的深度学习模型,用于交通信号灯检测,并通过Streamlit实现的交互式网页界面进行展示。以下是我们面临的主要问题和相应的解决方案:

要解决的问题

  1. 交通信号灯检测的准确性和速度: 交通信号灯检测系统的核心挑战在于如何在复杂的城市交通环境中实现对交通信号灯的高准确度识别与实时处理。由于交通信号灯在不同的天气、光照条件下以及从不同角度和距离观察时其外观可能大不相同,系统需要能够准确地识别并处理这些变化。此外,系统还需要快速响应,以适应实时交通管理和自动驾驶等应用场景的需求。

  2. 模型的泛化能力和适应性: 城市交通环境的多样性要求检测系统具备出色的泛化能力,能够适应不同的环境条件,如不同城市的交通信号灯设计差异、各种天气条件下的可见性变化等。此外,系统还需要能够适应新的或未见过的交通信号灯类型,以应对城市交通设施的不断更新和发展。

  3. 用户交互界面的直观性和功能性: 为了使系统易于使用和访问,我们需要开发一个直观、功能丰富的用户界面。该界面不仅需要为用户提供实时交通信号灯检测的视觉输出,还需要允许用户轻松切换不同的模型版本和输入源(如图片、视频和实时摄像头流),以及调整模型参数等高级功能。

  4. 系统的性能和资源效率: 处理高分辨率的实时视频流需要大量的计算资源,特别是当使用复杂的深度学习模型如YOLOv8进行实时检测时。因此,优化模型的计算效率和减少资源消耗是实现实时检测的关键。此外,系统还需要有效地管理和存储检测结果,以支持后续的数据分析和检索。

  5. 系统的可扩展性和维护性: 随着技术的发展和用户需求的变化,我们的系统可能需要支持更多的功能或集成新的检测模型。因此,系统的架构需要设计得既灵活又可扩展,以便于未来的升级和维护。

2.3.2 解决方案

        针对本项目中交通信号灯检测系统的设计和实现,我们将采取一系列综合措施来解决挑战并优化性能。以下是我们拟采用的方法:

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

  1. 模型架构选择: 我们将使用YOLOv8/v7/v6/v5作为核心深度学习模型,这些模型在速度和准确度之间提供了优秀的平衡。特别是YOLOv8,作为最新版本,在保持高速检测的同时,进一步提升了准确率和鲁棒性,非常适合用于实时交通信号灯检测任务。

  2. 数据增强: 为了提高模型在各种环境条件下的泛化能力,我们计划采用多种数据增强技术,如随机裁剪、缩放、旋转和色彩调整等。这将帮助模型学习到从不同角度、不同光照条件下观察到的交通信号灯的多样性,从而提高检测的准确性和鲁棒性。

  3. 迁移学习: 为了加速训练过程并提高模型性能,我们将采用迁移学习策略。通过在大型通用数据集(如COCO或ImageNet)上预训练模型,然后使用交通信号灯的特定数据集进行微调,可以有效地利用已有的知识,加快收敛速度并提高识别精度。

技术框架和开发工具

  1. PyTorch框架: 我们选择PyTorch作为开发和训练深度学习模型的框架,因为它提供了灵活的API、优秀的文档和社区支持,以及出色的GPU加速能力,非常适合于科研和原型开发。

  2. Streamlit交互界面: 我们将使用Streamlit框架构建用户交互界面,因为Streamlit能够轻松地将Python脚本转换为交互式Web应用。通过Streamlit,我们可以快速开发出支持图像、视频和实时摄像头流输入的交互式界面,并实现模型切换和参数调整等功能。

  3. CSS美化: 为了提升用户界面的美观性和用户体验,我们将使用CSS对Streamlit界面进行美化。通过定制样式,我们可以改善界面的布局、色彩和字体等,使其更加直观和易用。

  4. PyCharm IDE: 我们将使用PyCharm作为主要的开发工具,因为它提供了丰富的Python开发功能,如代码自动完成、项目管理、版本控制集成等,能够提高开发效率和代码质量。

功能实现和系统设计

  1. 多输入源支持: 系统将设计为支持多种输入源,包括静态图像、视频文件和实时摄像头输入。这将增加系统的灵活性和适用性,满足不同用户场景的需求。

  2. 模型切换功能: 我们将实现一个动态模型切换功能,允许用户根据具体需求选择不同版本的YOLO模型(如YOLOv5到YOLOv8)。这不仅能够提供灵活性,还可以让用户根据性能和准确性的需求做出选择。

2.4 博文贡献与组织结构

        本文的主要贡献在于设计和实现了一个基于YOLOv8/v7/v6/v5的交通信号灯检测系统,该系统不仅提高了交通信号灯检测的准确性和效率,同时通过Streamlit开发的用户友好界面,为研究人员和工程师提供了一个易于使用的实验平台。以下是本文的具体贡献:

  1. 详尽的文献综述: 本文提供了关于交通信号灯检测领域的深入文献综述,涵盖了YOLOv8/v7/v6/v5等先进目标检测算法,以及这些算法在交通信号灯检测中的应用情况。此外,还对比了不同算法的性能,为选择合适的模型提供了依据。

  2. 数据集的详细处理: 介绍了如何准备和处理用于交通信号灯检测的数据集,包括数据的采集、预处理、增强等步骤,以及如何构建适用于不同YOLO版本的训练和验证数据集。

  3. 算法选择与优化: 讨论了为什么选择YOLOv8/v7/v6/v5作为检测模型的原因,并详细说明了如何对这些模型进行调整和优化,以适应交通信号灯检测任务的特殊需求。

  4. 美观友好的网页设计: 使用Streamlit设计并实现了一个交互式的网页应用,用户可以通过这个应用上传图片、视频或直接通过摄像头进行实时交通信号灯检测,同时可以方便地切换不同的模型和参数设置,大大增强了系统的可用性和灵活性。

  5. 算法效果对比: 提供了YOLOv7/v6/v5等不同版本的YOLO模型在交通信号灯检测任务上的性能对比,包括准确性、速度和资源消耗等方面的综合评估,帮助用户根据实际需求选择最合适的模型。

  6. 完整的资源包: 为了便于复现和进一步研究,本文提供了完整的数据集、预训练模型和代码资源包,包括模型训练和预测的完整代码,以及详细的使用说明。

博客后续章节的组织结构:

  • 绪论: 简要介绍交通信号灯检测的背景、意义和研究现状,以及本研究的目标和主要贡献。

  • 算法原理: 详细介绍YOLOv8/v7/v6/v5等算法的原理、架构和关键技术,以及这些算法在交通信号灯检测任务中的应用和优化策略。

  • 数据集处理: 介绍数据集的选择、预处理、增强等步骤,以及如何构建适合训练和验证的数据集。

  • 代码介绍: 提供模型训练和预测的详细代码介绍,包括环境配置、参数设置、训练过程和结果评估等。

  • 实验结果与分析: 展示不同模型在交通信号灯检测任务上的实验结果,包括准确率、检测速度等指标的对比分析。

  • 系统设计与实现: 详细介绍基于Streamlit的交互式web界面。


3. 数据集处理

        在我们开展的交通信号灯检测项目中,数据集的质量和结构对模型的训练和最终性能至关重要。本项目使用了一个精心准备和预处理的数据集,涵盖了广泛的交通标志类型,以确保检测模型能够在现实世界的各种情况下表现出色。

Chinese_name = {
 	"-Road narrows on right": "右侧变窄",
    "50 mph speed limit": "限速50英里",
    "Attention Please-": "请注意",
    "Beware of children": "注意儿童",
    "CYCLE ROUTE AHEAD WARNING": "自行车道警告",
    "Dangerous Left Curve Ahead": "左弯危险",
    "Dangerous Rright Curve Ahead": "右弯危险",
    "End of all speed and passing limits": "限速结束",
    "Give Way": "让路",
    "Go Straight or Turn Right": "直行或右转",
    "Go straight or turn left": "直行或左转",
    "Keep-Left": "靠左",
    "Keep-Right": "靠右",
    "Left Zig Zag Traffic": "左侧曲折",
    "No Entry": "禁止进入",
    "No_Over_Taking": "禁超车",
    "Overtaking by trucks is prohibited": "禁卡车超车",
    "Pedestrian Crossing": "人行道",
    "Round-About": "环岛",
    "Slippery Road Ahead": "路滑",
    "Speed Limit 20 KMPh": "限速20公里",
    "Speed Limit 30 KMPh": "限速30公里",
    "Stop_Sign": "停止",
    "Straight Ahead Only": "仅直行",
    "Traffic_signal": "交通灯",
    "Truck traffic is prohibited": "禁卡车通行",
    "Turn left ahead": "前左转",
    "Turn right ahead": "前右转",
    "Uneven Road": "路不平"

}

        数据集包含了10000张图像,其中7092张用于训练模型以识别和理解不同类型的交通标志,1884张用于验证模型的泛化能力,而剩余的1024张则用于测试模型在未知数据上的性能。这种分布保证了模型在各个阶段都能接触到足够的数据量,从而使学习过程更加稳定和可靠。

在这里插入图片描述

       &#16图像中的交通标志类型繁多,包括“右侧变窄”、“限速50英里”、“请注意”、“注意儿童”等29个类别,每个类别都有相应的图像实例。标志的多样性考验了模型识别和分类不同标志的能力。在目标检测任务中,这种多类别的场景是挑战性的,因为模型需要区分具有细微差别的类别,同时忽略无关的变量,如光照和遮挡。

        对图像进行了预处理,包括自动校正像素数据的方向和删除EXIF方向信息,以及调整图像大小到统一的416x416像素。这一预处理步骤是至关重要的,它不仅统一了输入数据的格式,还去除了可能影响模型训练的不必要的变量,如图像方向。
在这里插入图片描述

        为了进一步提高模型的鲁棒性,数据集在标注时采用了YOLOv8格式,该格式针对模型训练进行了优化。标注的信息丰富,包含了标志的位置、类别以及模型的置信度等级,这为模型提供了丰富的上下文信息,有助于更准确地学习和预测。

        数据集的分布可视化显示,某些类别的实例数量较多,而有些则相对较少。这种不平衡的分布可能会影响模型的性能,因为模型可能会对有更多训练实例的类别过拟合,而对于较少实例的类别则可能欠拟合。因此,在模型训练过程中,需要采用技术如数据增强、类别权重调整或过采样来缓解这一问题。

        从数据集的分布图中还可以看出,某些标志的大小和位置在图像中存在普遍的趋势,这些趋势可以指导模型在检测任务中更加关注特定的区域。例如,如果某个类别的标志经常出现在图像的右上角,模型可能会学习在这一区域进行更加密集的搜索。

        综上所述,我们的数据集经过精心设计和预处理,不仅包含了丰富多样的交通标志图像,并且还考虑到了现实世界应用中的各种变化因素,为训练高性能的交通标志检测模型提供了坚实的基础。通过这个数据集的使用和分析,我们希望在实际场景中实现准确和可靠的交通标志检测,为自动驾驶系统和交通管理提供支持。


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,通过精心设计的类和方法实现了一个高效且准确的目标识别模型。

        首先,我们利用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模型训练中使用的一些重要超参数及其设置:

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

        环境设置与模型加载:首先,我们需要导入用于构建和训练模型的必要库。这包括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 = "TrafficSignRecognition"
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模型训练损失函数图像中,我们可以对模型的训练过程和性能做出详尽的分析。这些图像记录了训练过程中的关键指标,包括损失函数的变化和评价指标的变化,这些指标对于理解模型的学习效率和预测能力至关重要。

在训练和验证损失图中,我们观察到模型的box_losscls_loss(类别损失)和dfl_loss(目标函数损失)随着训练过程逐渐下降,显示出模型在学习数据集上的表现越来越好,这意味着模型对交通标志的定位、类别分类和置信度预测越来越准确。训练损失和验证损失都表现出了平滑的下降趋势,并且两者之间没有出现明显差异,这表明模型没有出现过拟合现象,具有良好的泛化能力。

特别是,在val/box_loss图中,我们看到损失值在前期下降较快,随后逐步趋于稳定,最终保持在较低水平,说明模型在验证集上的边界框预测十分稳健。类似地,val/cls_lossval/dfl_loss也显示出类似的趋势,这进一步证实了模型对类别和目标函数的预测性能。

在性能指标方面,metrics/precisionmetrics/recall图显示模型在交通标志检测任务上的精确率和召回率都非常高。精确率接近1的数值表示模型对于正样本的预测非常准确,而召回率的高值则表明模型能够检测到数据集中的大多数正样本。这两个指标的高值对于交通标志检测来说至关重要,因为在实际应用中,漏检或误检都可能导致严重的后果。

metrics/mAP50(在IoU阈值为0.5时的平均精度)和metrics/mAP50-95(在IoU阈值从0.5到0.95的平均精度)的图表中,我们可以看到模型的平均精度在所有IoU阈值上都非常高,这表明模型具有很好的检测一致性和可靠性。这些指标通常用来综合评估目标检测模型的性能,高mAP值说明我们的模型在不同的阈值下都能维持高准确性。

综上所述,图中的训练和验证损失的下降,以及精确率、召回率和mAP的高值,共同证明了我们的YOLOv8模型在交通标志检测任务上有着卓越的表现。模型经过了充分的训练,没有出现过拟合,预测精度高,对真实世界应用来说具有很高的可靠性。这样的模型可以在自动驾驶辅助系统中发挥关键作用,为驾驶者提供准确的交通信息,确保道路安全。在接下来的章节中,我们将深入讨论模型的实际应用场景和进一步优化的可能性。

在这里插入图片描述

5.2 混淆矩阵

        混淆矩阵是评估分类模型性能的关键工具,尤其是在目标检测任务中,它可以详细显示模型在各个类别上的识别能力。通过对混淆矩阵的分析,我们可以对模型在识别不同交通标志上的准确性和潜在的误识别问题有一个直观的认识。

在这里插入图片描述

        混淆矩阵是评估分类模型性能的一个非常有用的工具,它可以直观地表示模型在各个类别上的预测结果与真实标签的匹配程度。根据提供的混淆矩阵图像,我们可以对模型的识别效果进行分析。

        从混淆矩阵中我们可以观察到,对于大多数类别,模型都能够准确地识别出交通标志。这特别体现在对“行人”、“泊车”以及“禁止驶入”标志的高识别率,其中“行人”类别的识别准确数最高,达到了181个正确预测。这说明模型对于这几种标志的学习效果很好,能够在大多数情况下做出准确的预测。

        然而,混淆矩阵同时也揭示了一些模型识别上的问题。例如,“70 Limit”标志与“60 Limit”标志之间存在一些混淆,有一个“70 Limit”被错误地识别为“60 Limit”。同样地,“80 Limit”也有一个实例被错误地归类到“Give way”。这种混淆可能是由于这些限速标志在外观上的相似性造成的,尤其是在图像分辨率不高或标志部分遮挡的情况下更容易发生。

        对角线上的数值表示模型对各个类别的正确预测数量,这些都相对较高,表明模型的整体性能是良好的。但是,也存在一些误检,例如,有一些标志被错误地分类为“背景”,这可能表明模型对某些特定条件下的标志识别不够鲁棒。

        需要注意的是,除了主对角线之外的其他高值区域,比如与“行人”相关的误判,这表明可能存在一些系统性的偏差,导致模型在某些特定情况下将其他类别误判为“行人”。这可能与行人标志的特征在某种程度上与其他标志存在相似性有关,或者是由于在训练数据中“行人”类别样本的过多,使得模型对这一类别有过度敏感的倾向。

        总结来说,混淆矩阵显示我们的YOLOv8模型在交通标志检测方面表现出色,但也揭示了一些特定标志间的混淆问题。这些发现为我们提供了进一步优化模型的方向,如增强对易混淆类别的训练、改进图像预处理方法或者调整模型结构以更好地区分相似类别。在未来的工作中,我们可以通过扩充数据集、引入更多的数据增强技术,或者对模型进行微调,来进一步提高模型的准确率和鲁棒性。

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

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

模型图像大小 (像素)mAPval 50-95CPU ONNX 速度 (毫秒)A100 TensorRT 速度 (毫秒)参数数量 (百万)FLOPs (十亿)
YOLOv5nu64034.373.61.062.67.7
YOLOv8n64037.380.40.993.28.7
YOLOv6N64037.5--4.711.4
YOLOv7-tiny64037.4--6.0113.1

(2)度量指标

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

        在我们的博客中,接下来我们深入探讨架构设计。本系统采用了模块化设计思想,旨在通过清晰定义的组件和接口来提升系统的可维护性和扩展性。下面是系统架构的关键组成部分:

在这里插入图片描述

  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/BV1sH4y1n7Q8/

在这里插入图片描述

完整安装运行教程:

        这个项目的运行需要用到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. Redmon J, Farhadi A. Yolov3: An incremental improvement[J]. arXiv preprint arXiv:1804.02767, 2018 ↩︎

  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. 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. ↩︎

  4. 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. ↩︎

  5. 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. ↩︎

  • 27
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逗逗班学Python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值