基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的交通信号标志识别软件(Python+PySide6界面+训练代码)
摘要:开发高效的交通信号标志识别软件对于提升道路安全和自动驾驶技术发展具有重要意义。本篇博客详细阐述了如何利用深度学习构建一个交通信号标志识别软件,并提供了完整的实现代码。该软件基于先进的YOLOv8算法,并对比了YOLOv7、YOLOv6、YOLOv5的性能,展示了不同模型间的性能指标,如mAP、F1 Score等。文章深入讲解了YOLOv8算法的原理,提供了相应的Python代码、训练数据集,并集成了一个基于PySide6的美观UI界面。
该软件能够精确识别和分类图像中的交通信号和标志,支持从图片、图片文件夹、视频文件以及摄像头输入进行检测,包含热力图分析、标记框类别、类别统计、可调Conf、IOU参数、可视化结果显示等功能。此外,还设计了基于SQLite数据库的用户注册登录管理界面,提供模型切换和UI界面定制的选项。本文旨在为深度学习新手提供实用指南,完整的代码和数据集已在文章结尾提供链接,便于读者下载和应用。本文结构如下:
演示与介绍视频:https://www.bilibili.com/video/BV1tW421w7rA/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/mbd-ZZuakp1y
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZuakp5q
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuakp1q
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZuakp1s
前言
在当今快速发展的交通系统中,交通信号标志识别软件扮演着至关重要的角色。这类软件不仅是智能交通管理系统和自动驾驶技术的基石,而且对于提高道路安全、减少交通拥堵以及提升驾驶体验都具有不可替代的作用。研究交通信号标志识别软件的意义不仅仅在于技术本身的发展。更重要的是,这些技术的应用大大提升了道路使用效率,降低了交通事故的发生率,为驾驶者提供了更安全、更便捷的驾驶环境。此外,随着全球自动驾驶车辆的增加,对于高效、准确的交通标志识别需求日益增长,这推动了相关技术的不断创新和发展。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240301151648562-253093865.jpg)
近年来,国内外的研究者在交通信号标志识别领域取得了显著成果。通过引入YOLOv5[1]、YOLOv6[2]、YOLOv7[3]以及最新的YOLOv8等算法,研究者不仅提高了识别的准确性,还显著提升了处理速度,使得实时交通标志识别成为可能。这些进展包括算法的结构优化、训练过程的改进、以及对遮挡和光照变化条件下识别能力的增强等方面。除了YOLO[4]系列,其他如Faster R-CNN、SSD等算法也在持续优化中,以适应不同的应用场景。
EfficientDet系列是针对不同计算能力场景设计的一系列模型,其中D7x版本为目前性能最强的变体。它采用了复合缩放技术(compound scaling)对网络宽度、深度及输入分辨率进行均衡缩放,有效提升了模型的效率和准确性。
视觉Transformer[5](ViT)模型将Transformer架构应用于图像识别任务中,通过将图像分割成序列化的小块(patches),然后利用自注意力机制进行特征提取。ViT在处理图像时能够捕捉到全局的依赖关系,这对于复杂场景下的交通标志识别尤为重要。
Swin Transformer是一种基于Transformer的层次化视觉模型,它通过引入移动窗口的机制,有效降低了计算复杂度,同时保持了全局信息的整合能力。这种设计使得Swin Transformer在处理大尺寸图像时更为高效。
本博客所做的工作是基于YOLOv8算法构建一个交通信号标志识别软件,呈现系统界面的效果,深入讲解其算法原理,提供代码实现,并分享系统的开发过程。希望本博客的分享能给予读者一定的启示,推动更多的相关研究。本文的主要贡献如下:
- 采用最先进的YOLOv8算法:本文采用了目前最先进的YOLOv8算法,对交通信号标志识别软件的开发进行了详细的介绍和分析。与之前广泛使用的早期深度学习模型相比,YOLOv8在效率和精确度上均有显著提升,为交通标志识别提供了新的技术路线和更高的性能标准。
- 利用PySide6实现交通信号标志识别软件:通过使用Python的PySide6库,本文展示了如何开发一个用户友好的交通信号标志识别软件界面。这种直观便捷的交互方式不仅便于用户使用,也促进了YOLOv8算法的普及和交通信号标志识别技术的应用。
- 包含登录管理功能:本文设计的登录管理功能增加了系统的安全性,并为将来引入更多个性化功能奠定了基础。这一设计思路提升了软件的实用性和可扩展性,为用户提供了更加安全和个性化的体验。
- 对YOLOv8模型的深入研究:本文不仅介绍了如何使用YOLOv8算法进行交通信号标志识别,还对算法的性能进行了详细的研究,包括精确度、召回率等关键指标的评估,以及在不同环境条件下的表现分析。这些研究为进一步优化和改进YOLOv8算法提供了重要的理论和实践基础。
- 提供完整的数据集和代码资源包:为了让读者能够更好地理解和应用YOLOv8及其他算法在交通信号标志识别中的实际操作,本文提供了完整的数据集和代码资源包。这些资源使读者能够直接复现实验结果,并在此基础上进行自己的研究和开发。
1.数据集介绍
在构建高效的交通信号标志识别软件时,选择和处理合适的数据集是确保软件性能的关键。本篇博客章节将全面介绍我们所使用的数据集,这是一个精心构建且富有挑战性的数据集,专门用于训练和评估交通标志的自动识别系统。我们的数据集由10,000张图像组成,这些图像被细分为7,092张用于训练的图像,1,884张用于验证的图像,以及1,024张用于测试的图像。这样的划分旨在保证模型可以在广泛的数据上进行训练,同时拥有独立的验证集和测试集来公正地评估模型性能。
在预处理阶段,我们对图像进行了自动方向校正,并剥离了EXIF信息中的方向数据,以消除由于拍摄角度不同而引起的变化,确保所有图像都按照统一的方向进行处理。此外,为了适应我们所使用的YOLOv8算法,所有图像都被统一调整至416x416像素的分辨率。这一步骤通过拉伸图像完成,尽管这可能会引起一定程度的形状变形,但是它保证了图像能够满足模型输入的尺寸要求。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240301151653887-1242710435.jpg)
数据集的类别分布图展示了各类交通标志的实例数量。我们注意到,如“限速”和“禁止通行”等常见标志的实例数量较多,而像“自行车过路”和“右侧道路变窄”等标志的实例数量相对较少。这种不均匀的分布反映了现实世界中交通标志出现的频率,但也提示我们可能需要采取特定的数据平衡技术,以避免模型在训练时对某些类别过拟合,对其他类别则学习不足。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240301151657855-1447178796.jpg)
我们还对数据集中的标注进行了详尽的分析。锚框分布图显示了交通标志的宽高比例分布情况,大多数锚框集中在某个区域,这表明了大部分标志具有相似的形状比例。而散点图则展示了标志在图像中的相对位置分布,这有助于我们在设计检测模型时,可以更加精确地设置注意力机制和锚框的初始位置。博主使用的类别代码如下:
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": "路不平"}
总而言之,我们的数据集不仅在数量上满足了深度学习模型的需求,而且在质量上也进行了精心的处理。通过上述的预处理步骤、详细的类别分布分析以及锚框和位置的分布考量,我们确保了数据集能够支持我们的识别软件在各种现实世界的情况下,都能表现出优秀的性能。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240301151722312-120326351.gif)
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行交通信号标志检测的图片或视频,或者启动摄像头进行实时检测。在进行交通信号标志检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240301151725372-1282146307.gif)
(3)此外,系统还提供了一键更换YOLOv8/v5模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240301151732397-270461307.gif)
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240301151743744-318339030.png)
3. YOLOv8算法原理
YOLOv8算法代表了目标检测领域的最新进展,其设计理念围绕提升检测速度和准确度的同时,简化模型结构和训练过程。在本部分博客中,我们将详细探讨YOLOv8的核心原理,包括其网络架构、创新点和所采用的技术。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240301151825729-447152286.jpg)
YOLOv8的架构延续了YOLO系列的设计哲学,即“你只看一次”(You Only Look Once),强调在一次前向传播中实现对图像中所有目标的检测。YOLOv8进一步优化了模型的各个组成部分,包括骨干网络(Backbone)、颈部网络(Neck)以及头部网络(Head)。
在骨干网络方面,YOLOv8采用了C2F的SPPF结构进行特征提取。这种结构的特点是在保留空间信息的同时,增强了网络的接受场,并通过并行连接增加了网络的宽度。SPPF,即空间金字塔池化快速版,是对SPP的改进,它可以聚合不同尺度下的特征,提升模型对尺寸变化的适应性。
在颈部网络部分,YOLOv8采用了基于FPN-PAN结构的改进版本。FPN(Feature Pyramid Networks)用于构建多尺度的特征金字塔,有助于检测不同大小的目标;而PAN(Path Aggregation Network)则用于增强特征的上下文关联性。这种改进版的结构进一步强化了特征之间的信息流动,提高了小目标的检测能力。
在头部网络方面,YOLOv8采用了解耦头(Decoupled Head)的设计,这意味着它将目标分类和目标定位的任务分离开来,这样做能够减少任务之间的干扰,提高模型的学习效率。此外,YOLOv8摒弃了传统的Anchor-based方法,转而采用了Anchor-free的策略,简化了训练流程并减少了超参数的需求,使得模型更加灵活和易于训练。
在损失函数方面,YOLOv8引入了Distribution Focal Loss和CIoU Loss。Distribution Focal Loss是对传统的Focal Loss的改进,它通过对类别概率分布进行建模,而不仅仅是对单一类别的预测,这样做可以提高模型在类别不平衡数据集上的性能。CIoU Loss则是一种用于边界框回归的损失函数,它考虑了重叠面积、中心点距离和长宽比的一致性,能够更精确地指导模型进行边界框的调整。
通过这些创新的设计和技术的应用,YOLOv8算法在保持YOLO系列一贯的快速检测特性的同时,大幅提升了在复杂环境下的识别准确率和鲁棒性。它的出现,为实时目标检测技术的发展开辟了新的可能性,特别是在对实时性和准确性要求极高的交通信号标志识别领域。
4. 代码简介
在本节中,我们将详细介绍如何使用YOLOv8进行交通信号标志检测的代码实现。代码主要分为两部分:模型预测和模型训练。
4.1 模型预测
在模型预测部分,首先导入了OpenCV库和YOLO模型。OpenCV库是一个开源的计算机视觉和机器学习软件库,包含了众多的视觉处理函数,使用它来读取和处理图像。YOLO模型则是要用到的目标检测模型。
import cv2
from ultralytics import YOLO
接着,加载自行训练好的YOLO模型。这个模型是在大量的图像上预训练得到的,可以直接用于目标检测任务。
model.load_model(abs_path("weights/best-yolov8n.pt", path_type="current"))
然后,使用OpenCV读取了一个图像文件,这个图像文件作为要进行目标检测的图像输入。
img_path = abs_path("test_media/test.png")
image = cv_imread(img_path)
在读取了图像文件之后,就可以使用加载的模型对图像进行预测了。下图为预测结果。
pred, superimposed_img = model.predict(pre_img)
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240301151841003-1505169700.png)
4.2 模型训练
这里我们开始训练和测试自己的数据集,在cmd终端或pycharm中运行run_train_model.py进行训练,以下是训练过程中的结果截图。YOLOv8的损失函数是其性能的关键部分,它指导模型学习如何准确地检测和分类对象。
以下表格详细介绍了YOLOv8模型训练中使用的一些重要超参数及其设置:
超参数 | 设置 | 说明 |
---|---|---|
学习率(lr0 ) |
0.01 | 决定了模型权重调整的步长大小,在训练初期有助于快速收敛。 |
学习率衰减(lrf ) |
0.01 | 控制训练过程中学习率的降低速度,有助于模型在训练后期细致调整。 |
动量(momentum ) |
0.937 | 加速模型在正确方向上的学习,并减少震荡,加快收敛速度。 |
权重衰减(weight_decay ) |
0.0005 | 防止过拟合,通过在损失函数中添加正则项减少模型复杂度。 |
热身训练周期(warmup_epochs ) |
3.0 | 初始几个周期内以较低的学习率开始训练,逐渐增加到预定学习率。 |
批量大小(batch ) |
16 | 每次迭代训练中输入模型的样本数,影响GPU内存使用和模型性能。 |
输入图像大小(imgsz ) |
640 | 模型接受的输入图像的尺寸,影响模型的识别能力和计算负担。 |
在这个博客章节中,我们将深入探讨如何使用Python和PyTorch框架来训练一个交通信号标志识别模型。下面,我将一步步解析代码的每个部分,以便您更好地理解模型训练的整个过程。
首先,导入必要的Python库,os模块用于处理文件路径和目录结构,torch是PyTorch的核心库,用于深度学习相关操作,yaml用于读写配置文件,而ultralytics是YOLO官方提供的Python包,它使得加载和训练模型变得简单。QtFusion.path中的abs_path则用于获取文件的绝对路径。
import os
import torch
import yaml
from ultralytics import YOLO # 导入YOLO模型
from QtFusion.path import abs_path
接着,我们设置训练环境和基本参数。如果检测到CUDA环境,则使用GPU,否则使用CPU。workers和batch则分别设置了数据加载时使用的工作线程数和批处理大小。
device = "cuda:0" if torch.cuda.is_available() else "cpu"
workers = 1
batch = 8
紧接着,我们定义了数据集的名称,并通过abs_path函数获取配置文件的绝对路径。然后,将路径转换为UNIX风格的路径,这通常是为了确保路径的兼容性。
data_name = "TrafficRoadSign"
data_path = abs_path(f'datasets/{data_name}/{data_name}.yaml', path_type='current') # 数据集的yaml的绝对路径
unix_style_path = data_path.replace(os.sep, '/')
然后,我们找到配置文件的目录路径,然后读取YAML文件并加载其内容。如果YAML文件中有path键,我们更新它为目录路径,再将修改后的内容写回文件。这保证了模型在训练时能够找到正确的数据集路径。
# 获取目录路径
directory_path = os.path.dirname(unix_style_path)
# 读取YAML文件,保持原有顺序
with open(data_path, 'r') as file:
data = yaml.load(file, Loader=yaml.FullLoader)
# 修改path项
if 'path' in data:
data['path'] = directory_path
# 将修改后的数据写回YAML文件
with open(data_path, 'w') as file:
yaml.safe_dump(data, file, sort_keys=False)
最后,我们初始化模型并启动训练过程。YOLO类用于加载预训练的模型权重,准备模型进行检测任务。通过调用train方法,我们传入了数据集的路径、设备类型、工作线程数、图像尺寸、训练周期和批处理大小,以及训练任务的名称。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 # 指定训练任务的名称
)
在深度学习模型的训练过程中,损失函数和评估指标的变化曲线对于理解模型的性能和学习进度至关重要。本部分博客将对YOLOv8模型在交通标志识别任务上的训练损失和性能指标进行详细分析。
首先,观察训练集和验证集上的框损失(box_loss)和分类损失(cls_loss)图像,可以看出随着训练过程的进行,这两种损失都表现出明显的下降趋势。这表明模型在学习如何更准确地定位目标框架,并正确分类每个目标。特别是在训练初期,损失迅速下降,显示了模型对数据的快速适应能力。然而,在训练后期,损失曲线趋于平稳,这可能表明模型开始接近其学习能力的极限,或者需要更细微的调整来进一步降低损失。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240301151853334-1161125777.png)
接下来,我们分析方向损失(dfI_loss),这是YOLOv8中的一个新指标,用于衡量模型预测框架方向的准确性。从曲线来看,这一损失在训练过程中也稳定下降,表明模型在预测目标方向上越来越精确。这对于交通标志识别尤为重要,因为正确的方向是理解标志含义的关键。
在性能指标方面,我们重点关注精确度(precision)、召回率(recall)、平均精度(mAP50)和严格平均精度(mAP50-95)。精确度和召回率曲线显示,模型能够以较高的准确度检测到大部分目标,且保持较高的召回率。这意味着模型不仅准确地识别出大多数真正的目标,还能最小化漏检。mAP50和mAP50-95作为更全面的性能评估指标,也显示出了类似的提升趋势。mAP50较为宽容,只要预测框与真实框的交并比(IoU)达到50%即认为是正确的,而mAP50-95则考量了从50%到95%的IoU,是一个更严格的评估。二者都随训练进度稳步提升,显示出模型对交通标志的识别能力在各个IoU阈值上都有所增强。
PR曲线图展示了模型在不同召回率水平上的精确度表现。从曲线图中可以看出,随着召回率的增加,模型的精确度略有下降,但总体保持在一个较高水平。这种现象在目标检测任务中是常见的,因为当尝试检测更多的正样本(即提高召回率)时,模型很可能会增加一些错误的检测(即假阳性),从而导致精确度下降。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240301151859491-1241864206.png)
在图中,我们可以看到曲线的起点精确度接近1,这意味着在召回率很低时,模型能够以极高的精确度检测出少数样本。随着召回率提高,精确度开始逐渐下降,但下降的速度较慢,表明模型能够在检测更多样本的同时,保持较高的判断正确性。在召回率接近1时,精确度有所下降,但依然保持在一个较高的水平,这表明模型在几乎检测到所有正样本的同时,仍能保持较高的检测准确度。
在该PR曲线图中,还标注了平均精度(mAP)为0.933(在IoU=0.5的阈值下),这是一个表现模型整体性能的指标。mAP值越高,表示模型的整体性能越好。在本例中,0.933的mAP值说明了模型在交通标志检测任务上具有非常优秀的性能。
通过这样的分析,我们可以得出结论,YOLOv8模型不仅在单个类别上表现出色,而且在整个数据集的所有类别上都能达到很高的识别准确度。这为我们在复杂的交通环境中部署此模型提供了信心。当然,除了PR曲线和mAP值,我们还需要考虑其他因素,如模型的运行速度、资源消耗等,这些都是决定模型是否适合实际应用场景的重要指标。综合这些指标,YOLOv8在交通标志识别上的表现令人印象深刻,展现了其在实时目标检测领域的强大潜力。
4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8对比
(1)实验设计:
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240301151914975-1612987661.png)
本实验旨在评估和比较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是精确率(Precision)和召回率(Recall)的调和平均值。精确率是指模型正确识别的正例与所有识别为正例的案例之比,而召回率是指模型正确识别的正例与所有实际正例之比。F1-Score对于不平衡的数据集或者需要同时考虑精确率和召回率的任务特别重要。
- mAP(Mean Average Precision):mAP是衡量模型在多个类别上平均检测准确度的指标。它计算了模型在所有类别上的平均精度,是目标检测领域中常用的性能度量。
名称 | YOLOv5nu | YOLOv6n | YOLOv7-tiny | YOLOv8n |
---|---|---|---|---|
mAP | 0.940 | 0.940 | 0.914 | 0.933 |
F1-Score | 0.93 | 0.93 | 0.91 | 0.92 |
(3)实验结果分析:
在目标检测领域,YOLO系列算法因其出色的性能和快速的检测速度而广受欢迎。本次实验中,我们将YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n这四个版本在同一数据集上进行了对比测试,主要关注它们在平均精度(mAP)和F1-Score这两个关键性能指标上的表现。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240301151927972-815662989.png)
接着,F1-Score作为精确率和召回率的调和平均,能够综合反映模型的准确性和完整性。从F1-Score来看,YOLOv5nu和YOLOv6n再次表现出相似的性能,均为0.93,这表明这两个模型在保证检测完整性的同时,也保持了较高的检测准确性。YOLOv7-tiny的F1-Score为0.91,与mAP结果相符,表现略低。YOLOv8n的F1-Score为0.92,虽然比YOLOv5nu和YOLOv6n略低,但仍然是一个非常强劲的结果,考虑到YOLOv8n的其他优势,它在实际应用中可能是最佳选择。
综合这些实验数据,我们可以得出结论,虽然YOLOv5nu和YOLOv6n在这一轮测试中的精度上略胜一筹,但YOLOv8n在维持高精度的同时,提供了其他潜在优势,如更快的检测速度和更低的资源需求。而对于对模型大小和推理速度有严格限制的场景,YOLOv7-tiny则可能是一个合适的选择。在选择合适的模型时,应根据实际应用的需求和资源限制综合考量。通过这样的比较,我们可以更明智地选择适合我们具体任务的YOLO版本,从而在实际应用中达到最佳的性能和效率平衡。
4.4 代码实现
在这篇博客中,我们将深入探讨一个使用Python和多个库(包括OpenCV, QtFusion, PySide6)创建的实时物体检测应用程序。这个程序结合了图像处理、机器学习(使用YOLOv8模型),以及图形用户界面(GUI)的创建,展示了如何将这些强大的技术融合在一起,构建一个实用且直观的应用。
(1)导入必要的模块和配置
首先,我们需要搭建一个基础的应用框架,这要求我们导入几个关键的模块。sys模块让我们能够与Python解释器进行交互,time模块帮助我们获取推理时间,cv2即OpenCV库提供了强大的图像处理功能。为了构建用户界面,我们使用了PySide6的QtWidgets和QtCore模块。
import sys # 导入sys模块,用于访问与Python解释器相关的变量和函数
import time # 导入time模块,用于获取当前时间
import cv2 # 导入OpenCV库,用于图像处理
from QtFusion.widgets import QMainWindow # 从QtFusion库导入FBaseWindow类,用于创建主窗口
from QtFusion.handlers import MediaHandler # 从QtFusion库导入MediaHandler类,用于处理媒体流
from QtFusion.utils import drawRectBox, get_cls_color # 从QtFusion库导入drawRectBox函数,用于在图像上绘制矩形框
from PySide6 import QtWidgets, QtCore # 导入PySide6库的QtWidgets和QtCore模块,用于创建GUI
from QtFusion.path import abs_path
from QtFusion.config import QF_Config
from YOLOv8Model import YOLOv8Detector # 从YOLOv8Model模块导入YOLOv8Detector类,用于物体检测
QF_Config.set_verbose(False)
(2)定义类别和模型
此外,为了让模型能够识别交通标志,我们预先定义了一系列的类别名称,并为每个类别分配了一种颜色。这是通过YOLOv8Detector类和get_cls_color函数实现的。
cls_name = ["右侧变窄", "限速50英里", "请注意", "注意儿童", "自行车道警告", "左弯危险", "右弯危险", "限速结束", "让路",
"直行或右转", "直行或左转", "靠左", "靠右", "左侧曲折", "禁止进入", "禁超车", "禁卡车超车", "人行道", "环岛",
"路滑", "限速20公里", "限速30公里", "停止", "仅直行", "交通灯", "禁卡车通行", "前左转", "前右转", "路不平"] # 定义类名列表
model = YOLOv8Detector() # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/traffic-yolov8n.pt", path_type="current")) # 加载预训练的YOLOv8模型
colors = get_cls_color(model.names) # 获取类别颜色
(3)创建主窗口
接下来,我们创建了一个图形用户界面,这是实时显示结果的窗口。QMainWindow提供了一个基本的窗口,而QLabel则用于展示图像。我们对这个窗口进行了简单的设置,如调整大小和位置。我们的目标是能够响应用户的操作。在这里,我们通过重载keyPressEvent方法实现了这一功能,当用户按下Q键时,程序将安全关闭。
class MainWindow(QMainWindow): # 自定义主窗口类
def __init__(self): # 构造函数
super().__init__() # 调用父类构造函数
self.resize(850, 500) # 设置窗口大小
self.label = QtWidgets.QLabel(self) # 创建标签用于显示图像
self.label.setGeometry(0, 0, 850, 500) # 设置标签位置和大小
def keyPressEvent(self, event): # 键盘事件处理
if event.key() == QtCore.Qt.Key.Key_Q: # 按下Q键时
self.close() # 关闭窗口
(4)主程序流程
在处理视频帧之前,我们需要对图像进行预处理,并将其送入YOLOv8模型中。我们定义了frame_process函数来实现这一过程。该函数首先调整图像大小以适配窗口,然后使用模型进行推理。我们还计算了推理时间,并在控制台中打印出来,这对于评估模型的实时性能很有帮助。
def frame_process(image): # 定义frame_process函数,用于处理每一帧图像
image = cv2.resize(image, (850, 500)) # 调整图像的大小
pre_img = model.preprocess(image) # 对图像进行预处理
t1 = time.time() # 获取当前时间
pred, superimposed_img = model.predict(pre_img) # 使用模型进行预测
t2 = time.time() # 获取当前时间
use_time = t2 - t1 # 计算预测所用的时间
print("推理时间: %.2f" % use_time) # 打印预测所用的时间
det = pred[0] # 获取预测结果
# 如果有检测信息则进入
if det is not None and len(det):
det_info = model.postprocess(pred) # 对预测结果进行后处理
for info in det_info: # 遍历检测信息
name, bbox, conf, cls_id = info['class_name'], info['bbox'], info['score'], info[
'class_id'] # 获取类名、边界框、置信度和类别ID
label = '%s %.0f%%' % (name, conf * 100) # 创建标签,包含类名和置信度
# 画出检测到的目标物
image = drawRectBox(image, bbox, alpha=0.2, addText=label, color=colors[cls_id]) # 在图像上绘制矩形框,并添加标签和颜色
window.dispImage(window.label, image) # 在窗口的label控件上显示图像
在模型预测出结果后,我们需要将这些结果以直观的方式展示出来。我们使用了drawRectBox函数来在图像上绘制矩形框,并添加了标签和颜色以区分不同的交通标志。最后,我们初始化了QApplication和MainWindow对象,设置了MediaHandler来处理摄像头的视频流,并开始了媒体流的处理。所有这些都在一个事件循环中进行,直到用户决定退出。
model = YOLOv8Detector() # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/traffic-yolov8n.pt", path_type="current")) # 加载预训练的YOLOv8模型
colors = get_cls_color(model.names) # 获取类别颜色
app = QtWidgets.QApplication(sys.argv) # 创建QApplication对象
window = MainWindow() # 创建MainWindow对象
videoHandler = MediaHandler(fps=30) # 创建MediaHandler对象,设置帧率为30
videoHandler.frameReady.connect(frame_process) # 当有新的帧准备好时,调用frame_process函数
videoHandler.setDevice(device=0) # 设置设备为0,即默认的摄像头
videoHandler.startMedia() # 开始处理媒体流
# 显示窗口
window.show()
# 进入 Qt 应用程序的主循环
sys.exit(app.exec())
通过以上的步骤,我们构建了一个完整的实时交通标志识别应用。这个应用不仅可以实时识别和显示交通标志,还能响应用户的交互操作。在自动驾驶和智能交通系统领域,这种应用的潜力是巨大的。通过不断优化和改进,我们相信这样的应用将会在未来的智能交通解决方案中占据一席之地。
5. 交通信号标志识别软件实现
在实现一款实时交通信号标志识别软件时,采用面向对象的设计思路,依赖Python语言和多种开源库如Pyside6、QtFusion、Pytorch等。其中,重要的MainWindow类是系统的主体,负责提供用户界面来控制输入源、进行交通信号标志检测与识别,并展示检测结果。以下将详细介绍其设计思路、架构设计以及整个流程。
5.1 系统设计思路
在我们的系统设计中,我们采取了模块化和分层的架构策略,旨在提高系统的可维护性、可扩展性以及用户交互的直观性。整个系统设计围绕提供一个高效、准确和用户友好的交通标志识别解决方案展开。
(1)架构设计
我们设计的MainWindow类是软件的核心,它不仅作为用户界面的主要入口,还充当着控制器的角色,调度各个组件完成特定的任务。通过精心设计的界面,用户可以轻松地与软件进行交互,观察实时的交通标志检测结果,调整设置,并了解模型的性能指标。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240301151938531-289916146.png)
- 处理层(Processing Layer):在处理层,我们利用了先进的YOLOv8Detector类,它内置了预训练的深度学习模型,能够处理实时视频流并准确地识别各种交通标志。这个模型是我们软件的智能核心,其高性能确保了软件能够快速响应并在各种环境条件下稳定工作。
- 界面层(UI Layer):界面层是用户与软件交互的直接界面。我们通过Qt的强大功能构建了直观的UI,其中包含了实时视频显示、状态指示器以及操作按钮等。这些组件不仅美观,而且直观易用,让用户即使在没有深度学习或计算机视觉知识的情况下也能轻松使用软件。
- 控制层(Control Layer):控制层作为沟通用户指令与软件反馈的桥梁,承担着监听用户操作和指导处理流程的任务。通过事件驱动的信号和槽机制,控制层能够响应用户的各种操作,如启动和停止视频流处理、切换模型配置等,并将用户的操作转化为软件的反馈。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240301151954912-1221296593.png)
为了增强软件的实用性,我们也在系统中加入了多媒体处理器,它能够从摄像头捕获视频流,并将视频帧送入模型进行识别。此外,我们还实现了一系列的槽函数,它们可以处理模型的输出,并将检测结果实时显示在用户界面上。
总体而言,我们的设计思路致力于打造一个强大且用户友好的应用,让用户不仅能够体验到最新的深度学习模型带来的便利,同时也能享受到平滑且直观的交互体验。这个交通信号标志识别软件的实现,不仅展现了当代深度学习技术在实际应用中的潜力,也为未来自动驾驶技术的发展奠定了基础。通过不断迭代和优化,我们相信这款软件能够在未来的道路交通管理中扮演重要角色。
(2)系统流程
以下是交通信号标志识别软件的工作流程详细介绍,我们将探讨实现一个交通信号标志识别软件的整体流程设计。这款软件以用户友好性和功能实用性为核心,结合了实时图像处理和深度学习技术,旨在为用户提供一个高效且准确的交通标志识别工具。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240301152004797-817999492.png)
-
当用户启动应用程序时,系统立即实例化MainWindow类,这个类是用户交互的核心,负责初始化用户界面和设置必要的应用参数。这确保了用户从开始就能拥有清晰直观的操作体验。用户界面不仅美观,而且功能齐全,能够让用户轻松选择和配置输入源,不论是实时摄像头捕获的画面、视频文件播放还是静态图片分析。
-
选择输入源后,系统动态调用媒体处理器和相关的处理方法来适应用户的选择。这可能涉及到调整摄像头设置、读取视频文件或加载图像文件等一系列操作。无论选择哪种媒体输入,系统都会确保它们能够无缝地整合到接下来的处理流程中。
-
媒体输入源就绪之后,系统开始进入持续的帧处理流程,该流程分为几个关键阶段:
- 预处理阶段:经过预处理的图像将被传递给YOLOv8模型,模型利用其深度学习算法识别和定位交通标志。这一步是整个软件的智能核心,模型输出的检测结果不仅包含交通标志的位置,还有对应的类别信息。
- 检测与识别阶段:经过预处理的图像将被传递给YOLOv8模型,模型利用其深度学习算法识别和定位交通标志。这一步是整个软件的智能核心,模型输出的检测结果不仅包含交通标志的位置,还有对应的类别信息。
- 界面更新阶段:随着模型检测结果的生成,用户界面会实时刷新,新的检测框和类别标签将被绘制在图像上,让用户可以直观地观察模型的识别效果。同时,用户还能在界面上查看关于检测结果的详细统计数据,如识别出的各类交通标志的数量和分布。
- 交互操作:软件提供了多种交互操作,用户可以通过界面按钮来保存检测结果、查询软件信息,或者通过筛选工具针对特定类别的标志进行分析和查看。
- 媒体控制:为了提高用户体验,软件允许用户控制媒体的播放状态,包括开始或停止视频捕捉、暂停视频播放,甚至是对单张图像进行分析。
整个系统设计的优点在于其流程的连贯性和模块的独立性。每个阶段都经过精心设计,确保能够快速响应用户的操作,并提供准确的交通标志识别结果。通过这样的设计,我们的软件能够满足实时交通监控和自动驾驶辅助系统的需要,为用户提供一个功能强大且易于操作的交通信号标志识别解决方案。随着技术的进步和用户反馈的积累,我们期待软件能够不断完善,为未来的智能交通贡献更多价值。
5.2 登录与账户管理
在我们的交通信号标志识别软件中,用户体验是设计的核心之一。为了提升这一体验,我们特别设计了一个用户账户管理系统,这一系统不仅仅是识别功能的补充,更是确保用户能在个性化和安全的环境下使用软件的关键。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240301152022948-858435933.png)
用户首次使用软件时,会遇到一个简洁而直观的登录界面。这个界面基于PySide6构建,后端数据存储则依赖于SQLite数据库,这样的设计选择既保证了界面的流畅性,又确保了数据的安全性和可维护性。在登录界面,用户可以轻松注册新账户,或使用已有账户登录。注册过程中,用户需要设置用户名和密码,还可以上传个人头像,这些信息会被安全地存储在数据库中。
一旦登录,用户就可以进入主界面,开始使用交通标志识别功能。主界面的设计旨在实现直观的交互,无论是图像的上传、视频流的捕捉,还是批量文件的处理,都能够快速响应。在识别过程中,用户不仅能看到实时的检测框、类别及置信度等信息,还能够保存检测结果,进行后续的查看和分析。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240301152031106-1058008140.png)
软件不仅提供了强大的检测功能,还考虑到了用户可能需要对自己的账户信息进行管理。因此,我们在登录界面中集成了修改密码、设置头像、注销账户等功能。用户可以随时更新自己的个人信息,或在不使用软件时注销账户,这些都通过简单易懂的操作来完成。账户管理系统的引入,为用户提供了一个私人定制的使用环境。每个用户都有自己独立的空间来保存个性化设置和识别历史,这些都可以在用户的个人账户中进行管理。同时,系统的设计也保证了数据的隐私性和安全性,用户可以放心地使用各项功能,不必担心个人信息的泄露。
通过这些设计,我们的交通信号标志识别软件不仅能够导入和利用各类深度学习模型进行多物体识别和检测,还能提供一系列便利的个性化服务,满足用户在实时目标检测场景下的多样化需求。未来,我们将继续优化账户管理系统,增加更多的个性化功能,提升用户体验,使我们的软件成为用户在日常生活和专业工作中不可或缺的助手。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
![](https://img2024.cnblogs.com/blog/1974721/202402/1974721-20240223172556334-254454142.png)
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1tW421w7rA/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/mbd-ZZuakp1y
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZuakp5q
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuakp1q
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZuakp1s
在文件夹下的资源显示如下,下面的链接中也给出了Python的离线依赖包,读者可在正确安装Anaconda和Pycharm软件后,复制离线依赖包至项目目录下进行安装,另外有详细安装教程:(1)Pycharm软件安装教程;(2)Anaconda软件安装教程;(3)Python环境配置教程;
离线依赖安装教程:https://www.bilibili.com/video/BV1hv421C7g8/
离线依赖库下载链接:https://pan.baidu.com/s/1y6vqa9CtRmC72SQYPh1ZCg?pwd=33z5 (提取码:33z5)
6. 总结与展望
在本博客中,我们详细介绍了一个基于YOLOv8模型的交通信号标志识别软件,还实验了YOLOv7、YOLOv6、YOLOv5等模型。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的交通信号标志检测和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
Wu W, Liu H, Li L, et al. Application of local fully Convolutional Neural Network combined with YOLO v5 algorithm in small target detection of remote sensing image[J]. PloS one, 2021, 16(10): e0259283. ↩︎
Li C, Li L, Jiang H, et al. YOLOv6: A single-stage object detection framework for industrial applications[J]. arXiv preprint arXiv:2209.02976, 2022. ↩︎
Wang C Y, Bochkovskiy A, Liao H Y M. YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2023: 7464-7475. ↩︎
Fang W, Wang L, Ren P. Tinier-YOLO: A real-time object detection method for constrained environments[J]. IEEE Access, 2019, 8: 1935-1944. ↩︎
Han K, Wang Y, Chen H, et al. A survey on vision transformer[J]. IEEE transactions on pattern analysis and machine intelligence, 2022, 45(1): 87-110. ↩︎