摘要:开发行人车辆检测与计数系统对于提升城市交通管理和监控系统的效率至关重要。本篇博客详细介绍了如何利用深度学习构建一个行人车辆检测与计数系统,并提供了完整的实现代码。该系统基于强大的YOLOv8算法,并结合了YOLOv7、YOLOv6、YOLOv5的对比,给出了不同模型之间的性能指标如mAP、F1 Score等结果分析。文章深入讲解了YOLOv8算法的底层原理,提供了相应的Python代码、训练数据集,并封装成一个基于PySide6的美观UI界面。
系统能够精准地检测和分类图像中的行人和车辆,支持选择图片、图片文件夹、视频文件以及开启摄像头检测,包含标记框类别、类别统计、可调Conf、IOU参数、可视化结果显示等功能。另外,设计了基于SQLite数据库的用户注册登录管理界面、可点击按钮切换不同模型、可方便修改的UI界面。本文旨在为深度学习领域的新手提供一份实用指导和参考,完整的代码和数据集已在文章结尾提供链接,便于读者下载和使用。本文结构如下:
目录演示与介绍视频:https://www.bilibili.com/video/BV1vy421B7Zm/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/mbd-ZZubk55v
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZuYmpxu
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuYmp9u
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZuYmp9s
前言
在当今社会,随着城市化进程的加速和汽车数量的剧增,交通管理和城市安全监控面临着前所未有的挑战。行人车辆检测与计数作为智能交通系统(ITS)和城市监控系统的关键技术之一,对于缓解交通拥堵、预防交通事故、提高道路使用效率以及加强公共安全监控等方面具有重要的研究意义和应用价值。随着人工智能和计算机视觉技术的快速发展,特别是深度学习技术的广泛应用,行人和车辆的自动检测技术已经取得了显著的进步。
随着深度学习技术的快速发展,行人车辆检测领域已经取得了显著的进步。特别是,基于卷积神经网络(CNN)的对象检测模型,在提高检测精度和速度方面发挥了重要作用。YOLO系列作为代表之一,从YOLOv1到最新的YOLOv8,每一次更新都在推动着检测技术的极限。YOLOv8[1]通过引入更加复杂的网络结构和优化算法,大幅提高了在多种标准数据集上的检测性能,成为行人和车辆检测研究中的重要工具。同时,Transformer模型的引入为对象检测提供了新的视角。ViT(Vision Transformer)在图像分类任务上的成功激发了研究者将其应用于对象检测领域,通过引入自注意力机制,ViT能够更好地捕捉图像中的全局依赖关系,这对于复杂场景下的行人和车辆检测尤为重要。
除了YOLO系列和Transformer模型外,近年来还出现了多种优化算法和技术,旨在进一步提高检测的准确性和实时性。例如,一些研究通过改进损失函数和锚框生成策略,有效提高了小目标检测的精度。其他研究则聚焦于模型的轻量化和加速,使得行人车辆检测技术能够更好地部署在移动设备和边缘计算平台上。此外,数据增强技术的发展也为提高模型的泛化能力和鲁棒性提供了重要支持。通过模拟不同光照和天气条件,增强后的数据集能够帮助模型更好地适应实际应用中的多变环境。
Swin Transformer是一种基于Transformer[2]的新型网络架构,它将图像分割为多个小块并在这些块上应用自注意力机制,能够更有效地捕捉图像中的局部细节和全局上下文信息。Swin Transformer在行人和车辆检测任务中表现出色,尤其是在处理遮挡和复杂场景时的性能优于传统CNN模型。
CenterNet2是在原有CenterNet基础上的改进,它采用了一种新颖的中心点检测机制,通过预测物体中心点及其属性(如大小、形状等)来实现检测。该模型还结合了一种高效的特征融合策略,显著提升了对小目标和密集场景下目标的检测精度。CenterNet2在多个公开数据集上都展现了优越的检测性能。
面对复杂多变的交通场景和不断增长的性能需求,行人车辆检测领域仍然面临着众多挑战。尽管YOLOv8等最新模型在性能上取得了显著的进步,但在处理高密度人群和车辆、遮挡情况以及极端天气条件下的检测任务时,仍然存在限制。因此,未来的研究方向之一是如何进一步优化模型结构和算法,以提高在这些复杂场景下的检测精度和速度。另外,随着自动驾驶技术的发展,如何实现更高效的实时检测和跟踪,以及如何通过多传感器融合技术提高检测系统的鲁棒性,也将是重要的研究方向。此外,随着人工智能伦理和隐私保护意识的提高,如何在保证检测效率的同时,确保技术应用的伦理性和安全性,也是未来研究需要重点关注的问题。
本博客在行人车辆检测与计数领域做出了显著的贡献,不仅深入探讨了最新的目标检测算法YOLOv8的应用,还实现了一个具有用户友好界面的系统,提供了一套完整的解决方案,包括详细的算法原理讲解、系统开发过程分享、以及丰富的代码资源。具体贡献如下:
- 采用最先进的YOLOv8算法:我们基于YOLOv8算法开发了行人车辆检测与计数系统,该算法相较于先前的版本(YOLOv7[3]、YOLOv6[4]、YOLOv5[5])在处理速度和准确度方面都有显著提升。通过详细的性能对比分析,我们展示了YOLOv8在行人车辆检测任务中的优越性,为该领域的研究和应用提供了新的视角。
- 利用PySide6实现友好的用户界面:通过Python的PySide6库,我们开发了一个易于操作、直观的行人车辆检测与计数系统界面。该界面不仅简化了用户操作,还提高了算法的可访问性和实用性,使得非专业用户也能轻松进行行人车辆检测与计数。
- 集成登录管理功能:系统集成的登录管理功能增强了使用的安全性和个性化体验,为将来添加更多定制功能奠定了基础,同时也体现了我们对用户体验和系统安全的重视。
- 对YOLOv8模型的深入研究:除了应用实现,我们还对YOLOv8算法的性能进行了全面的评估,包括精确度、召回率等关键指标的分析,以及模型在不同环境条件下的表现评估。这一部分的研究不仅加深了对YOLOv8算法的理解,也为进一步的算法优化和应用拓展提供了坚实的基础。
- 提供完整的数据集和代码资源包:为了促进行人车辆检测与计数技术的进一步研究和开发,我们分享了完整的数据集和代码资源包。这些资源不仅便于读者复现我们的实验结果,还能鼓励和促进该领域内的进一步探索和创新。
1.数据集介绍
在本博客中,我们将详细介绍用于行人车辆检测与计数任务的数据集。这个数据集由5542张精心挑选的图像组成,分为2856张训练图像、1343张验证图像和1343张测试图像。这样的分布旨在确保模型在训练期间可以学习到足够的特征,并在后期能够通过验证和测试集准确评估模型的泛化能力。
在图像预处理方面,我们采取了自动方向校正,确保所有图像均以正确的方向呈现,剥离了可能会引起模型混淆的EXIF方向信息。此外,每张图像都被统一调整至800x800像素的尺寸,这样的标准化处理对于保持检测算法的一致性和可靠性至关重要。虽然这一步骤涉及了图像的拉伸,但它确保了在不同尺寸和比例的图像之间不会丢失任何像素信息,从而让模型能够更好地从图像中学习特征。
我们的数据集涵盖了从行人到各类车辆的多种对象,其中行人类别的实例数量最多,接近10000个实例,其次是车辆,其他类别如自行车、摩托车、公交车、卡车和火车数量逐渐减少。这种类别分布反映了现实世界中的典型场景,其中行人和私家车辆是街道上最常见的元素。通过这种多样化的类别设置,数据集不仅适用于行人检测任务,也适用于车辆检测,特别是在复杂的城市交通环境中。
通过对数据集的进一步分析,我们可以观察到一些关键的分布特征。例如,边界框位置的热力图显示,大部分检测对象倾向于出现在图像的中心区域。这可能与行人和车辆在道路中心出现的频率有关,因此,检测算法在这一区域需要特别精准。同样,对象中心点的分布图揭示了检测对象主要集中在图像的中部,这为我们设计感兴趣区域(ROI)提供了依据,可能在这些高频区域采用更高的分辨率或更密集的采样。
此外,边界框宽度和高度的分布图表明数据集中包含大量的小尺寸目标。这对检测算法提出了挑战,因为小目标的识别通常更加困难。检测算法需要具备较强的局部特征学习能力,以便在图像中准确识别和定位这些小目标。博主使用的类别代码如下:
Chinese_name = {'person': "行人", 'bicycle': '自行车', 'car': '小汽车', 'motorcycle': '摩托车',
'bus': '公交车', 'truck': '卡车', 'train': '火车'}
总结来说,本文介绍的数据集是一个综合且具有挑战性的资源,它不仅为行人车辆检测算法的开发和评估提供了丰富的数据,还通过详细的预处理和类别分布,为研究者和实践者提供了理解和应对现实世界复杂场景的必要工具。通过本数据集的应用,我们期待推动该领域内检测技术的进步,并激发更多关于优化和实施高效目标检测系统的研究和讨论。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行行人车辆检测的图片或视频,或者启动摄像头进行实时检测。在进行行人车辆检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8/v5模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
3. YOLOv8算法原理
YOLOv8算法作为目标检测领域的最新进展,继承并发展了YOLO系列的核心理念,即“你只看一次”(You Only Look Once),它通过单次的前向传播过程实现对图像中目标的检测,大幅提升了检测速度,使其非常适合实时应用场景。YOLOv8在算法架构上引入了一系列的创新点,以进一步提升其性能。
首先,YOLOv8采用了一个全新的多尺度特征金字塔网络,这意味着它能够同时在不同的尺度上检测目标,使其能够更准确地处理各种尺寸的目标。通过这种多尺度检测策略,YOLOv8在检测小目标和遮挡情况下的目标时表现尤为出色。这种多尺度特征表征能力,使得YOLOv8在处理复杂场景时具有更好的适应性和鲁棒性。
其次,YOLOv8的骨干网络CSPDarknet53结合了残差网络的设计,通过引入跨阶段部分网络(CSPNet)结构,有效减少了计算资源的消耗,并优化了梯度流,这对于加速训练过程和提升检测性能至关重要。CSPDarknet53的设计减轻了模型的参数负担,同时保持了特征表达的丰富性,这对于检测精度的提高尤为关键。
此外,YOLOv8在训练策略上也进行了创新。它采用自适应训练样本选择机制来优化模型性能,这种机制允许模型在训练过程中更聚焦于难以检测的目标,从而更有效地提高模型对这些目标的检测能力。这种自适应的训练方法使得YOLOv8能够在保持高速检测的同时,进一步提高模型的准确率和泛化能力。
最后,YOLOv8的算法结构中采用了高级别的自动化,减轻了模型设计和调优的负担,使得算法更加易于实现和部署。这种自动化程度的提高,在保持高效性能的同时,也大大降低了将算法应用到实际产品中的门槛。
综合以上特点,YOLOv8不仅在速度和精度上取得了平衡,还通过结构和训练的创新,增强了对复杂场景的适应能力,显著提升了目标检测技术的实用价值。通过这些细节的介绍,我们可以深入理解YOLOv8算法的原理,以及它在行人车辆检测与计数任务中的应用潜力。
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 | 模型接受的输入图像的尺寸,影响模型的识别能力和计算负担。 |
在本博客的这一章节中,我们将深入探讨如何使用Python和PyTorch框架以及YOLOv8进行行人车辆检测模型的训练。我们的目标是搭建一个能够准确检测和计数行人及车辆的模型,以便将其应用于智能交通系统和城市监控系统等实际场景。首先,我们从导入必要的库和模块开始。os和torch是Python编程中常用的库,分别用于操作系统级任务和深度学习计算。yaml用于处理YAML文件,这是一种常用的配置文件格式。ultralytics是一个包含YOLO模型实现的库,而QtFusion.path则提供了一种方法来获取文件的绝对路径。
import os
import torch
import yaml
from ultralytics import YOLO # 导入YOLO模型
from QtFusion.path import abs_path
device = "cuda:0" if torch.cuda.is_available() else "cpu"
接下来,我们设置了训练模型时使用的基本参数。这包括使用的工作进程数workers和每个批次的大小batch。这些参数是深度学习训练过程中的关键配置,影响数据加载的效率和批处理的速度。我们的数据集配置文件VehicleTypeDet.yaml包含了训练、验证和测试图像的路径以及类别信息。我们首先获取这个YAML文件的绝对路径,并对路径字符串进行处理,确保它符合Unix风格的路径标准,因为不同操作系统间的路径表示有所差异。
if __name__ == '__main__': # 确保该模块被直接运行时才执行以下代码
workers = 1
batch = 8
data_name = "VehicleTypeDet"
data_path = abs_path(f'datasets/{data_name}/{data_name}.yaml', path_type='current') # 数据集的yaml的绝对路径
unix_style_path = data_path.replace(os.sep, '/')
# 获取目录路径
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)
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 # 指定训练任务的名称
)
在读取YAML配置文件后,我们对其进行了必要的路径修改,以确保训练时能够正确地找到数据集的位置。这是一个常见的预处理步骤,以确保配置文件与实际数据存储位置一致。然后,我们加载了预训练的YOLOv8模型,并开始了训练过程。这里使用YOLO类创建模型实例,并通过train方法启动训练过程。在训练中,我们指定了图像大小、训练周期数、批次大小以及训练任务的名称。这些参数将指导模型的训练过程,从而对模型进行优化。
在我们的YOLOv8模型训练过程中,损失函数和性能指标的监测对于理解模型的学习进度和行为至关重要。通过深入分析训练和验证阶段的损失函数图像,我们可以对模型的性能做出细致的评估。
我们观察到训练和验证的框损失(box_loss)都随着训练周期增加而显著下降。这表明模型对于定位目标的边界框的能力在不断提高。特别是在训练初期,损失函数值的下降速度较快,随后趋于平稳。这是模型逐渐适应数据分布并学习到有效特征的标志。验证集上的框损失稍高于训练集,这是正常现象,因为模型在未见过的数据上通常表现略差。
接着,类别损失(cls_loss)和目标损失(df1_loss)也表现出类似的下降趋势。类别损失的下降意味着模型在区分不同类别的能力上有所提升,而目标损失的减少则反映出模型在预测目标是否存在方面的准确度在提高。然而,我们注意到,在某些训练阶段,这两种损失会出现轻微的波动,这可能是由于学习率的调整或是模型在某些困难样本上的过拟合。
精度(precision)和召回率(recall)是评估检测模型性能的重要指标。在我们的分析中,精度随着训练的进行呈现出逐步上升的趋势,这说明模型越来越少地将非目标误判为目标。召回率的提高则表明模型遗漏检测目标的情况在减少,它能够检测到更多的真实目标。两者的平衡对于实际应用至关重要。
至于平均精度(mAP)指标,[email protected]和[email protected]:0.95都显示了随着训练的进行而逐渐上升的趋势,这表示在不同的置信度阈值下,模型的性能都在提高。特别是[email protected]:0.95,这个指标考虑了更为严格的IoU阈值,从而提供了对模型性能的全面评估。在实际应用中,高mAP值意味着模型能够更为准确地识别和定位各种尺寸的目标。
F1分数是精度和召回率的调和平均值,它为我们提供了一个衡量模型分类准确性的综合指标。在这幅图中,每条曲线代表了不同行人车辆类别在各个置信度阈值上的F1分数,而最厚的蓝色线代表了所有类别的平均F1分数。
下图为博主训练行人车辆检测的F1曲线图。从曲线图中可以看到,各个类别的F1分数随置信度阈值的变化呈现出典型的“山峰”形态。这意味着对于每个类别,存在一个置信度阈值,在这个点上模型达到了精确度和召回率的最佳平衡。例如,对于“person”类别,我们可以看到F1分数在某个置信度阈值附近达到峰值,这说明模型在这个阈值下对于检测行人的性能最佳。而对于其他类别,如“bicycle”、“car”、“motorcycle”等,我们也观察到类似的趋势,尽管它们达到峰值的具体置信度阈值有所不同。
值得注意的是,不同类别的F1分数峰值并不相同,这反映出模型在不同类别上的检测性能存在差异。例如,“car”类别的F1分数曲线高于“bicycle”,这可能是因为汽车目标在图像中通常较大,特征更明显,因此更容易被模型准确检测。而对于较小或细长的目标,如“bicycle”,模型可能需要更精细的特征学习能力来提高检测性能。
整体来看,所有类别的F1分数曲线在置信度阈值约为0.35时汇聚,并在这一点上达到一个综合峰值。这表明,在这个置信度阈值下,模型对于所有类别的平均性能达到最优。实际应用中,可以考虑将这一置信度阈值作为默认设置,以平衡模型对各类目标的检测精确度和召回率。然而,曲线图也显示,当置信度阈值非常高或非常低时,F1分数显著下降。当置信度阈值过低时,模型倾向于将更多的非目标区域误判为目标,导致精确度下降;而当置信度阈值过高时,模型则可能错过一些实际的目标,导致召回率下降。因此,选择一个适中的置信度阈值对于实现最佳检测效果至关重要。
综上所述,通过对F1分数曲线图的分析,我们可以深入了解YOLOv8模型在不同类别上的性能表现,并确定最适合的置信度阈值。这些分析对于模型的优化调整以及后续在实际场景中的部署具有重要指导意义。通过精细的性能调优,我们的目标检测模型将能够在多样化的应用场景中实现更为精确和可靠的目标检测。
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.565 | 0.640 | 0.493 | 0.574 |
F1-Score | 0.57 | 0.64 | 0.53 | 0.58 |
(3)实验结果分析:
在本节中,我们将对YOLO系列中的几个版本——YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n——在相同数据集上的性能进行对比分析,基于两个核心的度量指标:平均精度(mAP)和F1-Score。
mAP是衡量目标检测模型在所有类别上平均性能的一个标准度量,它同时考虑了精确度和召回率。实验结果显示,YOLOv6n在这四个模型中以0.640的mAP得分最高,这表明它在整体上具有最佳的检测性能,能够在多个类别上平衡地识别和定位目标。YOLOv5nu和YOLOv8n的表现相对接近,分别达到了0.565和0.574的mAP得分。虽然YOLOv8n在版本上更加新颖,但其性能提升并不显著,这可能是因为在特定的数据集和任务上,新版本的优化并未完全发挥出预期效果。而YOLOv7-tiny的表现最差,仅有0.493的mAP得分,这可能是由于“tiny”版本的模型更小、更快,但通常牺牲了一些精度,特别是在多类别和复杂场景的数据集上。
接下来是F1-Score的分析,这是精确度和召回率的调和平均数,是判断单个模型性能的关键指标。F1-Score将精确度和召回率结合成一个单一的度量,提供了对模型性能的直观理解。在F1-Score方面,YOLOv6n以0.64的得分继续领先,这与mAP得分的趋势一致,进一步证明了其在该数据集上的优秀性能。YOLOv8n以0.58的F1-Score紧随其后,展现出其较新架构的竞争力。YOLOv5nu的得分为0.57,略低于YOLOv8n,显示出在这一版本迭代中的性能提升。YOLOv7-tiny的表现依然是最低的,得分为0.53,这强调了在追求模型大小和速度优化的同时可能会影响模型的准确性。
总的来说,YOLOv6n在这一组实验中展现出了最佳的综合性能,而YOLOv7-tiny在追求效率的同时牺牲了一定的精度。YOLOv8n作为最新版本,在某些方面有所提升,但在性能上的增长并不如期显著,这提示我们在选择模型时应综合考虑性能与实际应用需求。此外,我们还应意识到,不同的模型可能需要不同的优化策略和超参数调整来充分利用其潜力,因此实验结果可能随着配置的不同而有所变化。通过详细的对比分析,我们可以更好地理解每个模型的优势和局限,为实际应用中的模型选择和优化提供依据。
4.4 代码实现
在本篇博客文章中,我们将深入探讨如何运用YOLOv8模型在实际应用场景中进行目标检测。这项任务涉及到一系列复杂的步骤,从设置运行环境、处理视频帧,到图像的实时展示和目标的检测。在这个过程中,我们将使用一系列高级Python库,包括sys、time、cv2以及自定义的QtFusion和YOLOv8Model库。
在实时行人车辆检测与计数中,结合YOLOv8模型和一系列开源库,如OpenCV、QtFusion和PySide6等,来实现主窗口的展示、摄像头帧的处理以及行人车辆的检测和标注等功能。
(1)导入必要的模块和配置
我们的代码首先导入了必要的模块,包括sys和time,它们分别用于访问与Python解释器相关的变量和函数以及执行与时间相关的操作。OpenCV库(cv2)是我们处理图像和视频的工具。我们还使用了QtFusion库,这是一个包含了多个模块的库,提供了创建用户界面和处理媒体数据的功能。YOLOv8Model模块中的YOLOv8Detector类是我们进行目标检测的核心。
import random # 用于生成随机颜色
import sys # 用于访问Python解释器相关的功能
import time # 用于记录操作所需的时间
from QtFusion.config import QF_Config
import cv2 # OpenCV库,用于图像处理
from QtFusion.widgets import QMainWindow # 用于创建GUI窗口
from QtFusion.utils import cv_imread, drawRectBox # 辅助函数,用于图像读取和绘制
from PySide6 import QtWidgets, QtCore # 构建图形用户界面
from QtFusion.path import abs_path
from YOLOv8Model import YOLOv8Detector # YOLOv8模型,用于目标检测
QF_Config.set_verbose(False)
这一部分主要负责导入各种模块。random用于随机颜色生成,sys和time分别用于系统操作和时间处理。cv2是图像处理的核心,而QtFusion和PySide6则用于构建用户界面。YOLOv8Detector是进行目标检测的关键类。
(2)定义类别和模型
我们的模型YOLOv8Detector被初始化并加载了预训练的权重。我们还使用了get_cls_color函数为不同的类别分配颜色,以便在图像上用不同的颜色标记不同的对象。
cls_name = Label_list # 定义类名列表
model = YOLOv8Detector() # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/best-yolov8n.pt", path_type="current")) # 加载预训练的YOLOv8模型
colors = get_cls_color(model.names) # 获取类别颜色
(3)创建主窗口
代码的主体部分定义了一个MainWindow类,这是我们应用程序的用户界面窗口,它继承自Qt的QMainWindow类。我们调整了窗口的大小并添加了一个标签,用于显示处理后的视频帧。此外,我们为这个窗口定义了键盘事件处理函数,以便在按下'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)主程序流程
在处理视频帧的函数frame_process中,我们对每一帧图像进行预处理,并使用YOLOv8模型进行目标检测。我们记录了模型推理的时间,并打印出来,这对于评估模型性能很有帮助。如果模型在帧中检测到目标,我们将使用辅助函数drawRectBox在图像上绘制边界框和标签,并使用get_cls_color函数获取类别对应的颜色。
def frame_process(image): # 定义帧处理函数,用于处理每一帧图像
image = cv2.resize(image, (850, 500)) # 将图像的大小调整为850x500
pre_img = model.preprocess(image) # 对图像进行预处理
t1 = time.time() # 获取当前时间
pred = 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上显示图像
最后,我们设置了媒体处理器来处理视频流。当新的视频帧准备好时,它会触发我们定义的frame_process函数,实时处理并显示图像。这种设计允许我们的应用程序以高效的方式处理和展示连续的视频帧。
app = QtWidgets.QApplication(sys.argv) # 创建QApplication对象
window = MainWindow() # 创建MainWindow对象
filename = abs_path("test_media/JapanStreet.mp4", path_type="current") # 定义视频文件的路径
videoHandler = MediaHandler(fps=30) # 创建MediaHandler对象,设置帧率为30fps
videoHandler.frameReady.connect(frame_process) # 当有新的帧准备好时,调用frame_process函数进行处理
videoHandler.setDevice(filename) # 设置视频源
videoHandler.startMedia() # 开始处理媒体
# 显示窗口
window.show()
# 进入 Qt 应用程序的主循环
sys.exit(app.exec())
整个博客文章通过逐步解读代码,向读者详细解释了每一行的作用和目的,不仅揭示了背后的技术细节,还展示了如何将这些技术整合在一起,构建一个实用的行人车辆检测与计数应用。我们希望这篇文章能够启发读者进一步探索计算机视觉和机器学习的潜力,并在自己的项目中应用这些有价值的知识。
5. 行人车辆检测与计数实现
在构建我们的交互式行人车辆检测与识别系统时,我们采取了一种集成化的系统设计思路,旨在提供一个高效、直观并且用户友好的操作环境。此系统的设计理念基于模块化的架构,使得界面层、处理层和控制层能够紧密而清晰地协作。
5.1 系统设计思路
在我们的系统设计中,我们旨在构建一个集成化的交互式行人车辆检测与计数应用程序。这个系统不仅能够实时处理视频流并检测其中的行人和车辆,还能够提供一个直观的用户界面,允许用户与检测过程进行交互。我们的设计思路围绕三个核心层次展开:处理层、界面层和控制层,每层都有其特定的职责和功能,共同构成了一个协调一致的整体。
(1)架构设计
在MainWindow类的架构设计中,采用了处理层、界面层、控制层的设计模式。这个系统的设计充分考虑了用户体验和系统性能,通过合理的架构设计和技术选型,实现了一个高效且易于使用的行人车辆检测与识别系统。
在处理层,我们利用了YOLOv8Detector类,这是一个强大的预训练深度学习模型,专门用于图像中的目标检测任务。该模型以其高速和准确性而闻名,能够实时识别视频流中的多个目标。这一层的设计确保了我们的系统在目标检测方面的性能,能够快速准确地识别出行人和车辆,并提供实时反馈。
界面层是用户与系统交互的前端界面。通过Qt框架,我们设计了一系列用户界面元素,包括按钮、标签、显示窗口等。这些元素不仅美观,而且布局合理,确保用户能够轻松理解和使用我们的系统。通过这个层面,用户可以启动或停止视频流的处理,查看检测结果,甚至可以调整模型参数,以获得更适合特定场景的检测效果。
控制层是将界面层与处理层连接起来的桥梁。在这一层,我们通过MainWindow类实现了多个槽函数和其他控制方法。这一层的设计允许我们的应用程序响应用户的操作,如启动视频处理、停止视频流、保存检测结果等。此外,我们还利用Qt的信号和槽机制来实现模块间的通信,如将处理层的检测结果实时更新到界面层的显示窗口中。
总之,我们的系统设计采用了模块化和层次化的方法,确保了每个部分都能专注于其核心功能,同时通过精心设计的交互机制确保了不同部分之间高效的协同工作。通过这种设计,我们的应用程序不仅能够高效地执行行人和车辆的检测任务,还能够提供一流的用户体验,让用户可以直观、方便地与系统进行交互。
(2)系统流程
在我们的最新博客中,我们将深入讨论一个集成了YOLOv8模型的交互式行人车辆检测与计数系统的设计流程。整个系统是围绕用户友好和高效能目标检测构建的,它通过一系列精心设计的步骤,为用户提供了一个直观且强大的应用程序界面。
-
当用户启动应用程序时,系统首先实例化MainWindow类,这一步骤是整个应用的核心。MainWindow类不仅初始化了用户界面,布局了操作按钮和展示窗口,还设定了应用的主要参数。这个起点为用户提供了一个清晰的操作路径,指引他们开始使用应用程序进行目标检测。
-
用户通过主界面选择输入源,这是系统灵活性的体现。无论是摄像头捕捉的实时图像、视频文件还是静态图片,系统都提供了相应的支持。这种多输入源的兼容性确保了应用程序可以适用于不同的使用场景,从实时监控到后期视频分析,都能够满足用户的需求。
-
输入源被确定后,应用程序调用媒体处理器和方法开始处理输入数据。无论是配置摄像头、读取视频文件还是加载图像文件,都涉及到一系列的数据处理步骤。这些步骤保证了数据在送入模型前处于最佳状态,为后续的检测和识别打下了坚实的基础。
-
媒体输入源准备就绪后,系统进入连续帧处理的循环。这个流程开始于图像的预处理,其中可能包括调整图像大小、转换色彩空间和归一化等操作,以确保输入图像满足YOLO模型的需求。随后,在检测与识别阶段,预处理后的图像被送入经过精细训练的YOLOv8模型进行分析,模型准确地输出了行人和车辆的位置及其数量。
-
当检测结果产生后,界面实时更新,不仅展示了检测框,还标注了类别,并在界面的展示区域中展示了检测统计数据。这些实时的视觉反馈增强了用户体验,使得用户可以直观地观察并理解模型的检测结果。
-
此外,用户还可以通过界面与系统进行互动。通过简单的按钮操作,用户可以保存结果、查询信息,甚至通过界面提供的筛选和分析工具深入探究特定的检测数据。这些交互功能大大提高了应用的实用性,并赋予用户更大的控制权。
最后,系统还提供了对媒体播放状态的控制。用户可以自由地启动或停止媒体捕捉、视频播放或图像分析,这提供了操作的灵活性,使用户能够根据自己的需求来调节应用程序的行为。
整个系统的设计理念是以用户为中心,通过高效的目标检测技术、直观的界面设计和强大的交互功能,为用户提供了一个全面的行人车辆检测解决方案。无论是公共安全监控、交通流量分析还是其他需要目标检测的场合,这个系统都能够提供出色的性能和优秀的用户体验。通过这种综合性的设计,我们的系统不仅能够满足专业领域的需求,也易于普通用户的日常使用。
5.2 登录与账户管理
在我们的行人车辆检测与计数系统中,用户体验始终是我们设计的核心。为了提供一个安全且私有的环境,我们整合了一套完整的用户账户管理系统,这一系统基于PySide6框架构建,并使用SQLite数据库作为后端存储。这不仅仅是为了保护用户的个人信息,还能够让用户在我们的平台上拥有个性化的体验。
首先,用户会遇到一个简洁而直观的登录界面,这是他们与我们系统交互的第一步。在这里,新用户可以注册一个全新的账户,而现有用户可以通过输入用户名和密码来登录。注册过程设计得既快捷又安全,确保用户能够轻松地开始他们的检测任务。一旦登录,用户就可以进入系统的主界面,开始行人车辆的检测与计数工作。
账户管理功能不仅限于登录和注册。用户可以在账户中心修改密码,保证账户安全;更新头像,增添个性化元素;甚至注销账户,确保其数据的私密性。这些功能的集成,为用户提供了一个可以定制的平台,使他们能够根据个人喜好和需求调整系统设置。
进一步地,我们的系统允许用户保存和管理自己的检测结果和设置。这意味着用户可以回顾过去的检测记录,分析检测趋势,或者导出数据用于进一步的分析。这些记录会与用户的账户关联,因此用户可以放心地知道自己的数据是安全和私有的。
至于检测功能本身,我们的系统不仅支持图片和视频输入,还支持实时摄像头捕捉和批量文件处理。这样的多输入方式为用户提供了极大的便利性,无论是要处理实时交通流量监控,还是分析历史视频资料,我们的系统都能够满足需求。在主界面中,用户可以实时看到检测框、类别及置信度等关键信息,这些实时反馈为用户提供了直观的监控体验。
总而言之,我们的系统设计考虑了用户操作的便捷性、个性化设置的需求以及数据管理的安全性。通过这些考虑,我们为用户提供了一个功能强大、易于使用且高度私有的行人车辆检测与计数工具。无论用户是安全监控的专业人员,还是交通管理的研究者,甚至是对机器学习感兴趣的爱好者,我们的系统都能为他们提供优质的服务。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1vy421B7Zm/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/mbd-ZZubk55v
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZuYmpxu
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuYmp9u
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZuYmp9s
在文件夹下的资源显示如下,下面的链接中也给出了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等模型。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的行人车辆检测和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
Talaat F M, ZainEldin H. An improved fire detection approach based on YOLO-v8 for smart cities[J]. Neural Computing and Applications, 2023, 35(28): 20939-20954. ↩︎
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. ↩︎
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. ↩︎
. 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. ↩︎
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. ↩︎