基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的交通标志识别系统详解(深度学习模型+UI界面代码+训练数据集)
摘要:本篇博客详细介绍了利用深度学习构建交通标志识别系统的过程,并提供了完整的实现代码。该系统采用了先进的YOLOv8算法,并与YOLOv7、YOLOv6、YOLOv5等早期版本进行了性能评估对比,分析了性能指标如mAP、F1 Score等。文章深入探讨了YOLOv8算法的工作原理,提供了相应的Python代码、训练数据集,并集成了一个基于PySide6的用户友好UI界面。
该系统能够在多种媒介——如图片、图片文件夹、视频文件及实时视频流——中准确识别交通标志,包含了热力图分析、标记框类别、类别统计等高级功能,并允许调整Conf、IOU参数以优化识别效果。系统还设计了基于SQLite数据库的用户注册登录管理界面,支持一键切换不同YOLO模型,并提供了UI界面的自定义修改选项。本文旨在为交通标志识别领域的研究者和深度学习初学者提供实用的指导和资源。完整的代码和数据集链接已在文章末尾提供,方便读者下载和使用。本文结构如下:
演示与介绍视频:https://www.bilibili.com/video/BV1Cx4y1Q759/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/ZZyUmZxu
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZubmphq
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuclppp
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZyTl5dp
前言
随着全球城市化进程的加速,交通管理面临着前所未有的挑战。智能交通系统(ITS)作为解决这一问题的关键技术,已经成为全球研究的热点。其中,交通标志识别系统作为ITS的重要组成部分,对于实现交通规则自动化监控、提升道路安全以及辅助自动驾驶技术的发展具有至关重要的意义。准确高效地识别交通标志不仅能够帮助驾驶者做出正确的驾驶决策,避免交通事故,还能为自动驾驶车辆提供关键的环境信息,确保其安全行驶。
随着深度学习技术的飞速发展,交通标志识别领域已经取得了显著进步。尤其是基于YOLO(You Only Look Once)系列算法的研究,因其在速度和准确度上的优势,成为了该领域研究的重点。自YOLO算法首次提出以来,其后续版本YOLOv2到最新的YOLOv8均在不断突破检测速度和准确性的限制,为实时交通标志识别提供了强有力的技术支持。
最新的研究显示,YOLOv8在继承前版本高效性能的基础上,通过改进网络架构和优化算法,进一步提升了识别准确率和速度。例如,通过引入更加复杂的特征提取网络,YOLOv8能够更好地处理交通标志的细节特征,从而在复杂的交通场景中实现更高的识别准确性[1]。同时,针对交通标志识别中的小目标问题,研究者通过改进YOLOv8的特征融合策略,有效提升了对小尺寸交通标志的检测能力[2]。除了YOLO系列,其他深度学习算法如SSD(Single Shot MultiBox Detector)和Faster R-CNN也在交通标志识别领域得到了应用。这些算法各有优缺点,例如,Faster R-CNN在准确性方面表现优异,但速度较慢,而SSD则在速度上有明显优势。最近的研究尝试通过算法融合或改进,结合这些算法的优点,进一步优化交通标志识别的性能[3]。
在数据集方面,随着大规模标注数据集的不断发布和更新,如COCO和Pascal VOC,为交通标志识别的训练提供了丰富的数据资源。最新的研究中,一些工作专注于通过数据增强技术,如图像旋转、缩放和颜色变换,来提高模型的泛化能力和鲁棒性[4]。
此外,考虑到实际应用中对计算资源的限制,模型轻量化和压缩技术的研究也变得尤为重要。一些最新的研究聚焦于通过网络剪枝、知识蒸馏等技术,减少模型的计算复杂度和内存占用,使得交通标志识别系统更易于部署在边缘设备上[5]。
本文通过综合运用最新的YOLOv8算法和PySide6库,构建了一个高效且用户友好的交通标志识别系统。在交通标志识别的研究与实践领域,本文的工作不仅推进了算法的应用,还提供了实用的开发工具和方法。以下是本文的主要贡献:
- 采用最先进的YOLOv8算法进行交通标志识别:本文采用了当前最先进的目标检测算法YOLOv8进行交通标志的识别,与先前版本的YOLO算法(如YOLOv7、YOLOv6、YOLOv5)相比较,展现了YOLOv8在识别效率和准确度上的显著优势。通过深入分析和实验验证,本文为交通标志识别领域提供了一种更高效、更准确的解决方案。
- 利用PySide6实现交通标志识别系统:本文详细介绍了如何使用PySide6库开发一个具有友好用户界面的交通标志识别系统。该系统提供了直观便捷的交互方式,使得非专业用户也能轻松完成交通标志的识别任务。这一工作不仅展示了深度学习技术在实际应用中的潜力,也推动了技术的普及和应用。
- 包含登录管理功能,增强系统安全性:系统设计中加入的登录管理功能,为使用者提供了一个安全的使用环境。这一设计考虑到了系统的安全性和未来发展的扩展性,为添加更多个性化功能奠定了基础。
- 对YOLOv8模型的深入研究:通过对YOLOv8算法的深入研究和广泛测试,本文对模型在不同环境下的表现进行了全面的分析,包括精准度、召回率等关键性能指标的评估。这些研究成果不仅加深了对YOLOv8算法性能的理解,也为算法的进一步优化和改进提供了重要的参考。
- 提供完整的数据集和代码资源包:为了让读者能够更容易地理解、学习和应用本文介绍的技术,我们提供了一套完整的数据集和代码资源包。这些资源使得读者可以方便地复现本文的实验结果,并在此基础上进行自己的研究和开发工作。
1.数据集介绍
在构建任何基于机器学习的系统时,数据集的质量和组织方式对于实现高性能模型至关重要。本文详细介绍了一个专为交通标志识别系统设计的数据集,该数据集旨在通过引入多样化的环境条件、不同尺寸和形状的交通标志,以及精确的标注信息,提供一个全面而丰富的训练和测试平台。
我们的数据集包含了7444张图像,其中6516张用于训练,632张用于验证,296张用于测试。这种划分确保了模型可以在足够大的训练集上学习,同时拥有合适的验证集来调整模型超参数,并通过测试集公正评估模型性能。数据集中的图像涉及各种不同的交通标志,包括但不限于限速、禁止、警告和指示类别,这些图像在各种天气条件下拍摄,从晴朗的天空到雨后的街道,再到夜幕下的昏暗光线,确保模型能在多变的实际环境中保持高准确度。
对于数据集的每一张图像,我们都进行了精细的预处理和增强。预处理包括标准化图像尺寸和色彩空间的调整,这些步骤是为了减少模型训练时的计算负担,并避免因图像差异而引起的偏差。数据增强则是为了提高模型的泛化能力,包括随机旋转、缩放、裁剪和颜色调整等方法,以此模拟不同的拍摄条件和角度,增强模型对复杂场景的适应性。
通过对数据集分布的分析,我们注意到存在一些潜在的不平衡因素,需要在模型训练时加以考虑。类别分布的不均可能导致模型偏向于频繁出现的类别,例如'No entry'标志的高频次可能导致模型对这一特定类别过度适应。为了解决这一问题,我们可能采用重采样技术或调整损失函数中类别的权重,以平衡模型对各类别的关注程度。
标注分布的可视化表明,大多数交通标志位于图像的中心区域,而标注的宽高比集中在较小范围内。这提醒我们在数据集的进一步处理中需要引入更多边缘位置和不同尺寸的标志,以提升模型在识别不常见场景下标志的能力。尽管如此,我们也认识到,数据集中的多样性和精确的标注信息将对训练一个高效的交通标志识别模型起到积极作用。博主使用的类别代码如下:
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': "停车"}
在后续的研究和应用中,我们将继续探讨数据集的扩展和优化,特别是增加样本的多样性,改进数据增强方法,并平衡类别分布,以提高识别系统的性能和可靠性。通过这些努力,我们相信我们的交通标志识别系统将能够在多样化的实际应用场景中表现卓越,为智能交通系统的实施和发展做出重要贡献。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行交通标志识别的图片或视频,或者启动摄像头进行实时检测。在进行交通标志识别时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8/v5模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
3. YOLOv8算法原理
YOLOv8算法是目前先进的目标检测框架之一,其设计理念在于通过高效的网络结构实现快速而精准的目标检测。YOLOv8的网络架构采用了Neck和Head的分离设计,这意味着特征提取(Backbone)和目标检测(Head)两个过程被明确区分,从而优化了每个部分的性能。
在特征提取阶段,YOLOv8继承并发展了YOLOv5和YOLOv7的设计思想,采用CSPNet结构作为其Backbone,CSPNet的优势在于减少计算重复性,同时保持了丰富的渐进式特征。这种结构通过跨阶段部分网络(CSP)的方式,降低了计算量并改进了特征传播效率。这一点在处理大量图像数据时特别重要,因为它能够有效地减少计算资源消耗,同时保持或提升检测性能。
YOLOv8的Neck部分采用了SPP(Spatial Pyramid Pooling)和FPN(Feature Pyramid Networks)的结合,这在多尺度目标检测中尤为关键。SPP能够在不同尺度下提取有效的上下文信息,而FPN通过多尺度特征融合增强了模型对不同大小目标的检测能力。SPP通过最大池化操作捕获不同尺度的特征,而FPN则通过自顶向下和自底向上的路径加强了特征之间的连接。
在Head部分,YOLOv8采取了一种被称为Decoupled-Head的方法,这种方法将分类和定位两个任务分开处理,有助于提升模型在这两个方面的专注度和准确性。相较于传统的设计,Decoupled-Head的方法通过分离这两个任务来减少它们之间的相互干扰,从而提高了整体的检测性能。
YOLOv8还引入了Anchor-Free的机制,这是目标检测领域中的一项创新。与传统依赖Anchor Box的方法不同,Anchor-Free机制允许模型直接预测目标的中心点和边界框,减少了对先验框的依赖,这使得模型更加灵活,也简化了训练过程。
此外,YOLOv8在损失函数上也进行了创新,采用了Distribution Focal Loss和CIoU Loss。Distribution Focal Loss对于不平衡数据分布具有更好的鲁棒性,它能够减少易分样本对损失函数的贡献,更专注于难以识别的样本。CIoU Loss则更加关注边界框的几何精度,不仅考虑了预测框和实际框的重叠面积,还考虑了它们的中心点距离和形状相似度,这有助于在边界框回归任务中获得更高的精度。
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)
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 | 模型接受的输入图像的尺寸,影响模型的识别能力和计算负担。 |
在本节,我们将深入探讨如何使用YOLOv8算法训练一个高效的交通标志识别系统。我将分享实际的代码实现过程,并对关键步骤进行详细的分析。
首先,我们从导入必要的库开始。使用Python的os和yaml库来处理文件路径和配置文件,并引入YOLO模型,这是我们训练过程中的核心。
import os
import yaml
from ultralytics import YOLO # 导入YOLO模型
from QtFusion.path import abs_path
然后,我们设置了数据集的路径,这通过abs_path函数完成,它将相对路径转换为绝对路径,确保无论我们在哪里运行代码,路径都是正确的。这对于跨平台的项目至关重要,因为不同操作系统的文件路径表示方式可能不同。
data_path = abs_path('datasets/VehicleType/vehicle.yaml', path_type='current') # 数据集的yaml的绝对路径
unix_style_path = data_path.replace(os.sep, '/')
# 获取目录路径
directory_path = os.path.dirname(unix_style_path)
接下来,我们读取了配置文件中的内容,并根据需要对其进行了修改。这一步是为了确保配置文件中的path键正确地指向了我们的数据集路径。
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类来加载预训练的YOLO模型。这里我们加载了YOLOv5nu的权重,这一步骤是为了使用这些预训练的权重作为我们训练的起点,这可以大大加快训练速度并提高最终模型的性能。
workers = 1
batch = 8
data_name = "TrafficSign"
model = YOLO(abs_path('./weights/yolov5nu.pt', path_type='current'), task='detect') # 加载预训练的YOLOv8模型
results = model.train( # 开始训练模型
data=data_path, # 指定训练数据的配置文件路径
device='cpu', # 指定使用CPU进行训练
workers=workers, # 指定使用2个工作进程加载数据
imgsz=640, # 指定输入图像的大小为640x640
epochs=100, # 指定训练100个epoch
batch=batch, # 指定每个批次的大小为8
name='train_v5_' + data_name # 指定训练任务的名称
)
在准备好数据和模型之后,我们开始了训练过程。train方法被用来指定了许多重要的训练参数,如数据集路径、计算设备、工作进程数、输入图像的尺寸、批次大小以及训练周期数。
model = YOLO(abs_path('./weights/yolov8n.pt'), task='detect') # 加载预训练的YOLOv8模型
results2 = model.train( # 开始训练模型
data=data_path, # 指定训练数据的配置文件路径
device='cpu', # 指定使用CPU进行训练
workers=workers, # 指定使用2个工作进程加载数据
imgsz=640, # 指定输入图像的大小为640x640
epochs=100, # 指定训练100个epoch
batch=batch, # 指定每个批次的大小为8
name='train_v8_' + data_name # 指定训练任务的名称
)
最后,我们重复了相同的训练步骤,但这次使用YOLOv8的权重。代码展示了如何加载另一个预训练模型YOLOv8并进行训练,这显示了如何灵活地在不同版本的YOLO模型之间进行切换。
在对YOLOv8模型进行训练的过程中,我们通过监控不同的损失函数和性能指标来评估模型的学习进度和性能。损失函数的变化趋势和最终的精确度评估对于理解模型的性能至关重要。本文将对训练过程中损失函数和性能指标的变化进行深入分析。
首先,我们观察到训练和验证阶段的边界框损失(box_loss)均呈下降趋势,这表明模型在学习过程中对目标定位的准确性逐渐提高。初始阶段损失较高,随着迭代次数的增加,损失逐渐稳定在一个较低的水平。这个下降的趋势是模型学习的积极迹象,意味着模型能够越来越好地预测出标志的位置。
分类损失(cls_loss)也显示出类似的下降趋势,无论是在训练集还是验证集上,这反映了模型在区分不同类别的交通标志方面的性能也在不断提升。初始的损失较高可能是由于模型对数据集中的类别分布不均和类别间的差异性不熟悉,但随着训练的进行,模型逐渐对这些类别有了更好的判别能力。
对于方向损失(dfI_loss),它代表模型对于交通标志旋转和变形的预测能力。从图中可以看出,方向损失在训练过程中也显著下降,这意味着模型在识别和理解不同方向和形状的交通标志方面变得更加精确。
在性能指标方面,精确度(precision)和召回率(recall)是评价模型识别效果的重要指标。我们可以看到,在训练的过程中,精确度和召回率都逐步上升并趋向稳定,最终达到了非常高的水平。这表明模型在识别交通标志时不仅准确率高,而且能够检测到大部分真实存在的交通标志。
在评估机器学习模型,尤其是目标检测模型的性能时,F1分数是一个重要指标,因为它综合考虑了模型的精确度和召回率。F1分数是精确度和召回率的调和平均,能够平衡两者之间的关系。理想的情况是,模型能够同时拥有高精确度和高召回率,但在实际情况中,通常需要在两者之间做出权衡。
从F1-Confidence曲线图中,我们可以观察到,曲线随着置信度阈值的增加先迅速上升后逐渐平稳,这意味着在一定的置信度阈值范围内,模型能够达到较高的精确度和召回率的平衡。对于所有类别,F1分数在置信度约为0.772时达到0.98的高值,这显示了模型在综合性能上的优异表现。
在曲线中,我们还可以看到各个类别的F1分数随置信度阈值变化的趋势。大多数类别的曲线在高置信度阈值下趋向于合并,这表明模型对不同类别的标志具有一致的识别能力。然而,也有个别曲线在某些置信度区间的F1分数较低,这可能是由于某些类别样本较少或者标志本身的复杂性导致模型识别能力较弱。
值得注意的是,F1分数在置信度阈值极低和极高时的下降趋势。当置信度阈值很低时,模型会产生更多的假阳性预测,导致精确度降低;而置信度阈值很高时,则可能会错过一些正确的预测,导致召回率降低。因此,选择合适的置信度阈值对于保证模型最佳性能至关重要。
总结来说,模型表现出了卓越的性能,并且在合适的置信度阈值下实现了精确度和召回率的最佳平衡。对于未来的应用,我们可以根据实际需求(是否偏好更高的精确度或更高的召回率)来调整置信度阈值,以达到最佳的识别效果。此外,针对那些F1分数较低的类别,进一步的数据收集、样本增强或模型调优可能需要被考虑,以便提升模型在这些类别上的性能。通过对F1分数和其他性能指标的综合分析,我们能够深入理解模型的行为,并据此做出信息化的决策来改善模型的整体性能。
4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8对比
(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是精确率(Precision)和召回率(Recall)的调和平均值。精确率是指模型正确识别的正例与所有识别为正例的案例之比,而召回率是指模型正确识别的正例与所有实际正例之比。F1-Score对于不平衡的数据集或者需要同时考虑精确率和召回率的任务特别重要。
- mAP(Mean Average Precision):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这四个版本的YOLO算法进行了实验,旨在评估其在相同数据集上的表现。实验结果显示,所有算法版本在平均精确度(mAP)上均达到了0.991或以上,而在F1-Score上,YOLOv5nu和YOLOv8n略高,均为0.98,YOLOv6n和YOLOv7-tiny则为0.97。
mAP作为一个综合性能指标,反映了模型检测准确性和信心水平的综合表现。在我们的实验中,所有模型都显示出极高的mAP得分,其中YOLOv7-tiny以0.993的得分略微领先,但差异不显著。这表明,尽管YOLOv7-tiny被设计为更轻量级的模型,其检测性能却并未受到太大影响,仍能与其他版本相匹配。
在F1-Score方面,YOLOv5nu和YOLOv8n共享最高分,这意味着它们在精确率(检测到的交通标志中正确的比例)和召回率(所有交通标志中检测到的比例)之间取得了最佳平衡。尽管所有模型的F1-Score都非常接近,这种微小的差异可能在一些特定应用中变得重要,特别是当准确率和召回率同等重要时。
在进行深度学习模型的选择时,除了这些性能指标外,还需要考虑模型的速度、大小以及是否易于部署等因素。例如,尽管YOLOv7-tiny在mAP上略胜一筹,但如果部署环境对模型大小和速度有更严格的要求,则YOLOv5nu和YOLOv8n可能是更合适的选择,特别是它们在F1-Score上也展现了相同的优异表现。
总的来说,我们的实验结果表明,尽管YOLO系列的不同版本在设计和性能上有所变化,但它们在处理相同数据集时表现出相近的高水平性能,这证明了YOLO算法家族在交通标志识别任务上的有效性和鲁棒性。选择哪一个版本的算法,应根据具体应用场景和需求来定。
4.4 代码实现
在这篇博客中,我们将探讨如何结合YOLOv8检测器和PySide6框架,实现一个交通标志识别系统。这个系统能够处理视频流,并实时展示检测到的车辆,为用户提供直观的视觉反馈。现在,让我们深入理解实现这一功能的代码逻辑。
(1)导入必要的模块和配置
我们首先导入必要的模块。sys模块让我们能够与Python解释器交互,time模块用于计时,而cv2是OpenCV库,我们用它来处理视频流中的图像。QtWidgets和QtCore模块用于构建GUI,而QtFusion库提供了用于创建窗口、处理媒体流和绘制结果的辅助工具。
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)定义类别和模型
YOLOv8模型是实现交通标志识别的关键,我们通过实例化YOLOv8Detector并加载预训练权重来准备模型。这一步骤对于确保我们的检测系统能够准确地识别各种交通标志至关重要。为了在图像上区分不同的车辆类型,我们通过get_cls_color函数为每一类车辆分配一个颜色。这样,在最终的输出图像中,用户可以通过颜色轻松区分不同的车辆类型。
cls_name = ["限速40", "限速50", "限速60", "限速70",
"限速80", "注意让行", "禁止驶入", "泊车",
"行人", "环形交叉", "停车"] # 定义类名列表
model = YOLOv8Detector() # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/traffic-yolov8n.pt", path_type="current")) # 加载预训练的YOLOv8模型
colors = get_cls_color(model.names) # 获取类别颜色
(3)创建主窗口
接下来,我们定义了一个MainWindow类,这是我们的主窗口。它包含了一个QLabel用于显示视频流和检测结果。我们还定义了一个keyPressEvent方法来处理用户输入,允许用户通过按下'Q'键退出应用程序。
class MainWindow(QMainWindow): # 定义MainWindow类,继承自FBaseWindow类
def __init__(self): # 定义构造函数
super().__init__() # 调用父类的构造函数
self.resize(850, 500) # 设置窗口的大小
self.label = QtWidgets.QLabel(self) # 创建一个QLabel对象,用于显示图像
self.label.setGeometry(0, 0, 850, 500) # 设置QLabel对象的几何形状
def keyPressEvent(self, event): # 定义keyPressEvent函数,用于处理键盘事件
if event.key() == QtCore.Qt.Key.Key_Q: # 如果按下的键是Q键
self.close() # 关闭窗口
(4)主程序流程
处理视频帧的主要函数是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控件上显示图像
随后,我们创建了QApplication和MainWindow对象,设置了视频流处理的帧率,并连接了新帧的处理函数。通过启动媒体处理并显示窗口,我们完成了从摄像头捕获视频、实时处理图像到图形界面呈现的整个流程。
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())
最后,我们通过展示主窗口并进入Qt应用程序的主循环,使得用户界面保持响应并能够实时更新。我们展示了如何使用先进的对象检测模型和现代GUI框架,搭建一个实时检测系统。详细的代码解释提供了从环境设置到有效显示检测结果的全面视角,旨在帮助读者更好地理解如何构建一个实用的交通标志识别系统。
5. 交通标志识别系统实现
在构建我们的交互式交通标志识别系统时,不仅需要快速准确地处理视频流中的图像数据,还需要提供一个清晰易用的界面,让用户能够无缝地与之交互。我们的设计思路遵循了将复杂的功能模块化和简化的原则,通过将界面设计、媒体处理和深度学习模型融为一体,我们实现了这一目标。
5.1 系统设计思路
在我们的系统设计中,我们的设计理念是构建一个高效、直观且用户友好的界面,使用户能够无缝地与系统交互。整个系统被设计为一个紧密集成的框架,其中每个组件都旨在提升整体性能和用户体验。
(1)架构设计
系统设计采用的是一个层次化、模块化的架构,以提升整体的灵活性和可维护性。通过精心设计的MainWindow类,我们将用户交互、媒体流处理和深度学习模型有效地融合在一个统一的应用程序中。此外,为了增强各模块间的协作性能,系统特别采用了信号和槽机制来处理模块间的通信,这在Qt框架中是实现事件驱动编程的核心。
- 处理层(Processing Layer):由深度学习的核心组成,即YOLOv8Detector类,这个类封装了预训练的YOLOv8模型以及图像处理和预测的相关方法。它负责接收原始图像帧,执行对象检测任务,并输出识别结果。通过高效的算法优化和GPU加速(如果可用),这一层确保了交通标志识别的速度和精度。
- 界面层(UI Layer):由Ui_MainWindow类实现的用户界面构成,界面设计注重用户体验,提供直观的操作界面。用户可以通过这一层与系统交互,例如,查看实时视频流中交通标志的检测结果,或者修改设置来调整检测参数。界面层的设计考虑了用户的易用性和操作的直观性,旨在让用户即使在没有技术背景的情况下也能轻松地使用系统。
- 控制层(Control Layer):由MainWindow类实现,它扮演着命令中心的角色,响应用户在界面层的操作,控制媒体处理器的启停,以及调用处理层的检测方法。控制层负责维护系统状态,协调用户指令和后端逻辑的执行。它利用Qt的信号和槽机制来监听UI事件(如按钮点击)和处理器的输出(如检测到的帧),并将这些信息传递给适当的处理函数进行响应。
通过这样的系统设计思路,我们确保了每个组件都可以在遵循单一职责原则的同时高效协作。处理层的独立性允许我们在不影响UI的情况下更新和优化检测算法,而界面层的灵活性使得未来的UI改进和功能扩展成为可能。此外,控制层的集成性质使得维护和升级系统的复杂性大大降低,同时为后续可能的功能迭代和优化奠定了基础。整个系统的设计理念是为了满足实时性、准确性和用户体验这三者间的最佳平衡,以达到最终用户和技术需求的双重满足。
(2)系统流程
在本博客中,我们将讲述设计一个交互式交通标志识别系统的全过程。本系统的核心设计理念是用户友好性,高效整合前沿的YOLOv8目标检测技术和直观的用户界面,以确保即使是非专业用户也能轻松使用该系统。在系统的设计中,我们特别强调了处理层、界面层和控制层的分离,旨在实现高效的模块间交互和数据流管理。
我们的系统首先通过MainWindow类的实例初始化,它不仅为用户提供了一个操作界面,还负责配置整个应用程序的相关参数。这样的设计使得用户能够通过一个清晰的界面来选择数据输入源,无论是实时的摄像头捕获、视频文件还是静态图像,都能够轻松接入并处理。
-
当用户启动我们的应用程序时,系统会立即实例化MainWindow类。这个类是应用程序的核心,负责初始化用户界面并设置必要的参数,为用户提供与系统交互的界面。MainWindow类的设计考虑了用户友好性和操作直观性,确保用户能够轻松地启动和使用识别系统。
-
用户选择输入源之后,系统将激活相应的媒体处理器来处理这些输入。对于实时捕获的图像流,可能涉及到摄像头的初始化和配置;对于视频文件,需要处理文件的读取和解码;而对于静态图像,系统则加载并准备图像数据。这一过程确保了不同类型的输入源都能被系统准确地识别和处理。
-
接着,系统进入连续帧处理的阶段。这一阶段分为几个关键步骤:
预处理阶段:在这一步,系统对捕获的每一帧图像进行必要的预处理工作,这包括调整图像尺寸以符合YOLO模型的输入需求、色彩空间的转换、图像归一化等。这些预处理步骤对于后续的检测精度和系统性能至关重要。
检测与识别阶段:经过预处理的图像被送入经过训练的YOLOv8模型进行分析,模型会精确地检测出图像中的交通标志并对其进行分类。得益于YOLOv8的高效性能,这一步可以实时进行,即使在视频流中也能快速识别出交通标志。
界面更新阶段:随着检测结果的产生,界面将实时更新,展示每个检测到的交通标志的位置和类别。这些信息可以通过框选标志、标注类别等视觉元素展现给用户,同时界面上也会实时更新表格或条形图来展示检测的统计数据。
交互操作:用户可以通过各种交互元素进行操作,例如保存检测结果的快照、查看程序的帮助信息、查询版本信息等。这些交互设计都是为了提高用户体验和系统的实用性。
媒体控制:我们的系统还允许用户对媒体播放进行控制,包括开始和停止摄像头捕捉、控制视频的播放以及对静态图像的分析。这样的媒体控制功能使用户可以根据需要暂停或继续检测过程。
通过这样的系统设计和工作流程,我们的交互式交通标志识别系统不仅能够提供高效准确的交通标志识别功能,还能够给用户带来高度的可控性和良好的交互体验。这种整合了前沿深度学习技术和人性化界面设计的系统,是当今智能交通领域创新应用的典范。
5.2 登录与账户管理
在本节中,我们将讨论一个综合性的交通标志识别系统,该系统不仅在技术层面上实现了先进的多物体检测,而且在用户体验方面也进行了深入的设计。一个特别值得注意的特性是系统集成了一个完整的用户账户管理功能,旨在为用户提供一个安全、个性化的使用环境。
用户账户管理是基于PySide6实现的,PySide6是一个允许开发者创建跨平台本地GUI应用程序的库。它提供了与Qt框架兼容的API,是Python语言的首选工具之一。账户信息的存储则依赖于SQLite数据库,这是一个轻量级的数据库,它的设计目标是嵌入式到应用程序中,不需要运行一个独立的数据库服务器。
用户首先通过登录界面进入系统。如果是新用户,他们可以选择注册新账户,提供必要的信息如用户名、密码,并设置个人头像。一旦完成注册,用户就可以使用这些凭据登录系统。我们也意识到用户信息安全的重要性,因此实现了密码修改功能,让用户能够定期更新密码以保护账户安全。
为了增强用户体验,我们还提供了头像设置功能。用户可以选择一个图像作为个人头像,这增加了一种个性化的观感。如果用户决定不再使用系统,他们可以选择注销账户。当用户想要返回系统时,重新登录功能允许他们轻松地恢复到他们的个人设置和历史记录。
进一步地,一旦登录,用户就能访问主界面并开始使用交通标志识别功能。无论是通过上传图片、视频文件、实时捕捉摄像头画面还是批量文件输入,系统都能提供实时的目标检测功能,并将识别结果直观地展示给用户,包括检测框、类别和置信度等详细信息。用户还可以保存和管理这些检测结果,使得每一次使用都成为一个个性化且连贯的体验。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1Cx4y1Q759/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/ZZyUmZxu
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZubmphq
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuclppp
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZyTl5dp
在文件夹下的资源显示如下,下面的链接中也给出了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等模型。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的交通标志识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
Fang W, Wang L, Ren P. Tinier-YOLO: A real-time object detection method for constrained environments[J]. IEEE Access, 2019, 8: 1935-1944. ↩︎
Redmon J, Divvala S, Girshick R, et al. You only look once: Unified, real-time object detection[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 779-788. ↩︎
Redmon J, Farhadi A. YOLO9000: better, faster, stronger[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2017: 7263-7271. ↩︎
Bochkovskiy A, Wang C Y, Liao H Y M. Yolov4: Optimal speed and accuracy of object detection[J]. arXiv preprint arXiv:2004.10934, 2020. ↩︎
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. ↩︎