摘要:开发夜间车辆检测系统对于自动驾驶技术具有关键作用。本篇博客详细介绍了如何运用深度学习构建一个夜间车辆检测系统,并提供了完整的实现代码。该系统基于强大的YOLOv8算法,并对比了YOLOv7、YOLOv6、YOLOv5,展示了不同模型间的性能指标,如mAP、F1 Score等。文章深入解释了YOLOv8的原理,提供了相应的Python代码、训练数据集,并集成了一个基于PySide6的界面。
系统能够精准检测和分类夜间车辆,支持通过图片、图片文件夹、视频文件及摄像头进行检测,包含柱状图分析、标记框类别、类别统计、可调Conf、IOU参数和结果可视化等功能。还设计了基于SQLite的用户管理界面,支持模型切换和UI自定义。本文旨在为深度学习初学者提供实用指导,代码和数据集见文末。本文结构如下:
文章目录
- 前言
- 1. 数据集介绍
- 2. 系统界面效果
- 3. YOLOv8算法原理
- 4. 代码简介
- 4.1 模型预测
- 4.2 模型训练
- 4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8对比
- 4.4 代码实现
- 5. 夜间车辆检测系统实现
- 5.1 系统设计思路
- 5.2 登录与账户管理
- 下载链接
- 6. 总结与展望
- 结束语
➷点击跳转至文末所有涉及的完整代码文件下载页☇
基于深度学习的夜间车辆检测系统演示与介绍(YOLOv8/v7/v6/v5模型+PySide6界面+训练数据集)
前言
在当今社会,随着自动驾驶技术和智能交通系统的迅猛发展,夜间车辆检测作为其中的一个关键技术,其重要性日益凸显。夜间车辆检测系统不仅对提高夜间道路安全、减少交通事故发生具有重要意义,而且对于促进智能交通系统的整体发展和自动驾驶技术的完善也起到了不可或缺的作用。尽管夜间行车环境因视线不良和光线不足而增加了检测难度,但通过不断的技术革新,研究者们已经在这一领域取得了显著进展。
随着深度学习技术的飞速发展,基于YOLO1(You Only Look Once)系列算法的夜间车辆检测系统表现出了优异的检测速度和准确性,特别是最新的YOLOv82及其前身YOLOv73、YOLOv64、YOLOv55等版本,它们在性能上的大幅提升,为夜间车辆检测带来了革命性的改进。近期的研究表明,通过算法的细致优化和深度学习模型的精确训练,这些系统能够在低光照条件下有效识别和跟踪车辆,极大地提高了夜间行车的安全性和便捷性。
国内外众多研究团队在夜间车辆检测领域持续深耕,不仅关注于算法本身的改进,还涵盖了数据集的更新、模型训练的优化策略、以及检测性能的全面提升等多个方面。例如,一些最新的研究通过引入更加多样化和复杂的夜间行驶场景数据集,进一步增强了模型的泛化能力和鲁棒性。此外,通过结合多模态数据处理技术,如雷达信号和红外图像,研究者们能够在极端低光照条件下,还原更为准确的车辆检测结果,从而为自动驾驶系统提供更为可靠的感知信息。
Faster R-CNN和SSD等算法也在夜间车辆检测领域得到了应用。研究者们通过对这些模型进行特定的优化,如采用多尺度输入和集成学习技术,能够进一步提高在复杂夜间环境中的检测性能。
近年来,Transformer-based模型,如ViT(Vision Transformer),也被引入到车辆检测领域,尤其是其在处理图像序列方面的能力,为夜间动态车辆检测提供了新的解决方案。这些模型通过利用全局上下文信息,能够更好地处理光照不均和遮挡等问题,进一步提升了检测的准确性和鲁棒性。
在数据集方面,为了训练和验证这些高性能的模型,研究社区开发了更加丰富和多样化的数据集,如Berkeley DeepDrive BDD100K和Waymo Open Dataset,这些数据集包含了大量的夜间驾驶场景,为算法的训练和优化提供了宝贵的资源。通过在这些复杂数据集上的训练,算法能够更好地适应实际的夜间行驶环境,提高在实际应用中的性能。
本博客所做的工作是基于YOLOv8算法构建一个夜间车辆检测系统,展示系统的界面效果,详细阐述其算法原理,提供代码实现,以及分享该系统的实现过程。希望本博客的分享能给予读者一定的启示,推动更多的相关研究。本文的主要贡献如下:
- 采用最先进的YOLOv8算法进行夜间车辆检测:通过采用当前最先进的YOLOv8算法,本文不仅展示了其在夜间车辆检测方面的出色性能,也通过与YOLOv7、YOLOv6、YOLOv5等早期版本的对比分析,直观地证明了YOLOv8在效率和精准度上的显著优势。此外,本文还深入探讨了YOLOv8算法的原理和关键技术细节,为相关领域的研究者和技术开发者提供了宝贵的参考和启发。
- 利用PySide6实现友好的用户界面:通过利用PySide6库,本文成功开发出了一个美观且易于操作的系统界面,极大地提升了用户体验,使得夜间车辆检测变得更加直观和便捷。这一点不仅展示了技术实现的可能性,也推动了YOLOv8算法在实际应用场景中的广泛应用。
- 集成登录管理功能,提升系统安全性:系统中加入的登录管理功能,进一步增强了系统的安全性,并为未来添加更多个性化功能和服务提供了可能,这表明了本文在系统设计上的前瞻性和创新性。
- 对YOLOv8模型进行深入研究:对YOLOv8模型的深入研究,包括对其精准度、召回率等关键性能指标的全面评估,以及在不同环境和条件下的表现分析,为该算法的进一步优化和应用提供了坚实的理论和实验基础。这一部分的工作不仅有助于更全面地理解YOLOv8算法的性能,也为其在夜间车辆检测领域的应用提供了科学的指导和建议。
- 提供完整的数据集和代码资源包:通过提供完整的数据集和代码资源包,本文极大地降低了读者复现实验结果和进行进一步研究的门槛,这不仅体现了本文对知识共享的贡献,也为推动夜间车辆检测技术的研究和应用创造了条件。
1. 数据集介绍
在本博客中,我们将深入探讨一个为夜间车辆检测系统设计的数据集,该数据集不仅在规模上体现了丰富性,也在多样性和复杂性上满足了深度学习模型训练的需求。整个数据集由9867张图像构成,其中7410张用于训练,1457张用于验证,以及1000张用于测试。这一细致的分配确保了模型在训练过程中能够学习到足够多的特征,并在后续的验证和测试阶段能够准确评估模型的泛化能力。
在预处理阶段,所有图像均调整至统一的640x640像素分辨率,采用的是拉伸方法以适应模型的输入需求。虽然这可能改变了图像的原始长宽比,但现代目标检测模型如YOLOv8已经足够鲁棒,能够适应这类变化。尽管数据增强的具体细节未在此提及,但我们可以推断,在训练过程中可能会应用各种常用的数据增强技术,如随机裁剪、旋转和色彩抖动等,以增强模型对不同光照条件和环境噪声的适应性。
对于数据集的类别分布,我们发现存在显著的不平衡性,其中汽车(car)类别的实例数量远远超过人(person)类别,而自行车(bicycle)和狗(dog)的数量则相对较少。这种不平衡反映了夜间道路场景中的常见模式,同时也挑战了模型在识别低频类别上的能力。在模型训练过程中,我们可能需要考虑重采样技术或修改损失函数,以避免对高频类别过度拟合的同时,提升对低频类别的检测精度。
进一步分析目标的空间分布,我们注意到大部分检测目标的中心点聚集在图像中央区域,这与现实世界中车辆和行人在道路上的分布相一致。然而,这也暗示我们需要确保模型同样能够有效识别图像边缘区域的目标,防止潜在的边缘偏差。博主使用的类别代码如下:
Chinese_name = {"bicycle": "自行车", "car": "汽车", "dog": "狗", "person": "人"}
此外,目标尺寸分布的分析揭示了大部分目标在图像中所占的比例,绝大多数目标的高度集中在0.2到0.6的范围,宽度则多分布在0.1到0.4的范围内。这种分布对于调整模型的锚框大小和比例提供了重要信息,有助于提升模型对于不同尺寸目标的检测能力。
综上所述,我们介绍的数据集是专门为夜间车辆检测设计的,它不仅提供了大量的训练和测试图像,还通过细致的预处理、类别平衡和目标大小分析,为研究者和开发者提供了丰富的资源来训练和优化深度学习模型。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行夜间车辆检测的图片或视频,或者启动摄像头进行实时检测。在进行检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
3. YOLOv8算法原理
在探讨YOLOv8算法的原理时,我们首先需要理解YOLO(You Only Look Once)系列算法的核心理念,即在单次前向传播过程中同时进行目标的定位和分类。这种一步到位的检测方式使得YOLO算法在速度和效率上有着显著的优势。YOLOv8作为这一系列中的最新迭代,不仅继承了前代YOLO算法的这些优点,而且在结构设计和性能上都有了显著的改进,从而进一步提升了检测的准确性和速度。
YOLOv8算法的结构可以分为三个主要部分:Backbone(主干网络)、Neck(连接网络)和Head(检测头)。在Backbone部分,YOLOv8采用了CSP(Cross Stage Partial networks)结构,这种结构有效地平衡了模型的学习能力和参数量。CSP结构通过部分跨阶段连接,促进了梯度的直接传播,这对于深层网络的学习是极为有益的。它还减少了计算量,因为它允许网络在少量的参数下进行更深层次的特征学习。
Neck部分则是负责提取不同尺度特征并进行融合的关键模块。YOLOv8的Neck部分利用了SPP(Spatial Pyramid Pooling)结构和FPN(Feature Pyramid Networks)技术。SPP能够提取多尺度的上下文信息,这对于检测不同尺寸的目标至关重要。而FPN采用了一个自顶向下的结构,将高层的语义信息传递到低层,从而实现了从粗到细的特征融合。
在Head部分,YOLOv8采取了自适应标签分配(adaptive label assignment)策略,这是一种更为灵活的标签分配方式,允许模型根据目标的不同特性自动调整标签。这意味着算法能够根据目标的大小、形状以及其在图像中的上下文信息,动态地选择最合适的锚点,这种策略能够有效地减少标签分配误差,提升模型的性能。
YOLOv8还引入了AutoML技术,在算法的设计和优化过程中自动寻找最优的模型参数和结构。这种技术可以减轻手动调参的工作量,确保了YOLOv8在不同的检测场景下都能达到最佳性能。此外,YOLOv8还支持云端训练和边缘计算,使得算法可以在资源受限的设备上进行训练和推断,同时还可以利用云端的强大计算能力进行大规模的训练任务。
综上所述,YOLOv8通过其独特的结构设计,不仅继承了YOLO系列的高速检测特性,而且还通过CSP网络结构和先进的特征融合技术,显著提升了对于各种尺寸目标的检测能力。这些技术的融合使得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/1.jpg")
image = cv_imread(img_path)
在读取了图像文件之后,将图像大小调整为850x500,并对图像进行预处理,就可以使用模型进行预测了。
image = cv2.resize(image, (850, 500))
pre_img = model.preprocess(image)
pred, superimposed_img = model.predict(pre_img)
4.2 模型训练
在这部分博客内容中,我们将深入探讨一个使用PyTorch框架和Ultralytics YOLO库进行模型训练的实际案例。通过解析提供的代码,我们将一探究竟,看看如何利用这些强大的工具来训练一个夜间车辆检测模型。
代码的核心逻辑是首先设置好训练环境,然后加载预训练的YOLO模型,并在此基础上进行进一步的训练以适应我们的特定任务——在这里是夜间车辆检测。这个过程涉及到许多细节,包括数据路径的设置、模型参数的配置以及训练过程的初始化。
首先,代码通过import语句导入必要的Python包,包括操作系统接口os、PyTorch库torch、YAML文件解析库yaml以及Ultralytics的YOLO模型。紧接着,我们设置设备变量device,这样模型就可以在GPU上进行训练(如果可用),这是深度学习训练过程中提升速度的关键。
import osimport 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。然后,我们设置了数据集名称data_name和数据集配置文件的路径data_path,这里使用了一个辅助函数abs_path来确保获取到文件的绝对路径。
workers = 1
batch = 8data_name = "NightVehicle"
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配置文件,并根据当前的目录结构对其进行了更新,确保了模型训练时引用的路径是正确的。
# 读取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.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, # 指定输入图像的大小为640x640epochs=120, # 指定训练100个epochbatch=batch, # 指定每个批次的大小为8name='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, # 指定输入图像的大小为640x640epochs=120, # 指定训练100个epochbatch=batch, # 指定每个批次的大小为8name='train_v8_' + data_name # 指定训练任务的名称
)
在夜间车辆检测领域,对训练过程的损失函数进行分析是至关重要的。它不仅反映了模型学习的状况,还指示了模型的性能可能存在的问题。
首先,从训练和验证的损失图中可以看出,随着训练进程的推进,train/box_loss、train/cls_loss和train/obj_loss均呈现出下降趋势,这表明模型在学习过程中逐渐拟合训练数据,并且在边界框定位、类别分类和目标检测上的表现都在不断改进。相应的,验证损失val/box_loss、val/cls_loss和val/obj_loss虽然波动较大,但总体上也显示出下降趋势,这表明模型对未见数据的泛化能力在增强。
在验证损失的曲线中,val/box_loss、val/cls_loss和val/obj_loss均呈现与训练损失相似的下降趋势,这表明模型在未见过的数据上也具有良好的泛化性能。特别是val/obj_loss的快速下降表明,在验证集上,模型对于目标的定位和检测能力有显著的提升。然而,我们也注意到在某些初期阶段,验证损失出现了小幅的波动,这可能是由于模型在适应新数据时的短暂不稳定,但随着训练的深入,这种波动逐渐减少,模型表现出更强的稳定性。
在性能指标部分,metrics/precision和metrics/recall表现出相对波动的上升趋势。metrics/precision反映了模型对正类别的预测准确率,而metrics/recall则指出模型对实际正类别的检出率。两者随着训练的进行逐渐提升,说明模型在区分目标与非目标上越来越准确,并能够检测出更多真实的目标。尽管精度和召回率在某些训练阶段出现波动,但整体趋势仍然向好,说明模型正在学习如何平衡这两个指标,以达到最优的检测效果。
metrics/mAP50和metrics/mAP50-95两个指标分别代表了在IoU(交并比)阈值为50%和50%-95%不同阈值范围内的平均精度。mAP50的提升表明模型在较宽松的IoU阈值下性能良好,而mAP50-95的上升趋势则显示了模型在更严格的IoU阈值下也能保持较高的性能。这两个指标的持续提升证实了模型在整个训练过程中的优化是有效的。
在深度学习模型的评估过程中,精确度-召回率(Precision-Recall,简称PR)曲线是衡量模型性能的重要工具,特别是在目标检测任务中,它能够揭示模型对于不同类别目标检测能力的细致情况。根据提供的PR曲线图,我们可以对YOLOv8模型在夜间车辆检测任务上的性能进行专业分析。
首先,PR曲线图上的每条曲线代表了模型在特定类别上的性能,曲线下方的面积(Area Under Curve, AUC)可以视为该类别检测准确性的综合指标。在此图中,我们看到“car”类别的曲线(橙色)位于其他类别之上,且曲线下的面积较大,显示了模型对汽车的检测精确度和召回率都相对较高,其mAP@0.5值达到了0.724,这意味着在IoU阈值为50%时,模型对汽车目标的检测性能非常出色。相比之下,“bicycle”和“dog”类别的表现较弱,mAP@0.5分别为0.353和0.339,这可能是由于这些类别在数据集中样本数量较少,或者是因为夜间条件下这些目标的特征不如汽车明显,导致模型学习它们的特征更为困难。
“person”类别(蓝色曲线)的性能处于中等水平,其mAP@0.5为0.542,表明模型在检测行人方面的效果逊色于车辆,但仍然具有一定的准确性。这种性能的差异可能与目标的大小、形状变化或者在夜间环境下的可见性有关。综合所有类别的mAP@0.5值为0.490,表明在IoU阈值为50%时,模型的整体性能接近于中等水平。值得注意的是,mAP@0.5是一个相对宽松的指标,如果我们采用更严格的IoU阈值(如mAP@0.75或mAP@[0.5:0.05:0.95]),模型的性能可能会有不同程度的下降,这需要在实际应用中根据需求进行选择和调整。
从PR曲线的形状来看,理想的情况是曲线越靠近右上角越好,这代表着高精确度和高召回率的完美平衡。在我们的分析中,虽然没有任何一条曲线完全接近右上角,但“car”类别的表现最为接近,这表明模型在特定类别上的检测能力是有差异的,且与训练数据的质量和分布密切相关。
通过对PR曲线图的详细分析,我们可以了解到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.485 | 0.547 | 0.448 | 0.490 |
F1-Score | 0.50 | 0.56 | 0.49 | 0.50 |
(3)实验结果分析:
在深度学习领域,持续的算法迭代和更新是提升模型性能的关键途径。我们通过在相同的数据集上实施一系列实验,旨在比较和评估不同版本的YOLO模型——包括YOLOv5nu、YOLOv6n、YOLOv7-tiny以及YOLOv8n——在夜间车辆检测任务上的性能。实验的设计和目的是为了明确各版本模型在准确性和检测效率上的差异,以便为实际应用提供更具指导性的见解。
从给定的实验结果来看,YOLOv6n在mAP值上表现最佳,达到了0.547,这表明在所有检测模型中,YOLOv6n在检测所有类别的平均精度上表现最优。这可能是因为YOLOv6n在网络结构或特征提取上有所改进,提升了模型对于目标的检测能力,尤其是在处理不同大小和形状的目标方面。
YOLOv5nu的表现略低于YOLOv6n,mAP为0.485,但其F1-Score达到0.50,与YOLOv8n相同。F1-Score是精确率和召回率的调和平均,其值的相似性表明YOLOv5nu和YOLOv8n在精确率和召回率之间取得了较好的平衡。虽然YOLOv5nu的整体精度略低,但在特定条件下,可能仍然是一个可取的选择,尤其是当我们需要在精确率和召回率之间寻找最佳平衡点时。
YOLOv7-tiny在这四个模型中的mAP值最低,为0.448,这可能是由于其“tiny”版本为了实现更快的速度和更低的资源消耗而简化了模型结构,牺牲了一定的检测精度。然而,如果系统资源有限,或者需要在边缘设备上进行实时检测,YOLOv7-tiny可能是一个适合的选择。
YOLOv8n虽然在mAP上没有超过YOLOv6n,但其F1-Score与YOLOv5nu持平,这表明它在精确率和召回率的综合性能上具有一定的优势。结合YOLOv8n最新的架构改进和优化,这个版本可能在处理某些特定类型的任务时,能够提供更好的性能。
总的来说,这些实验结果提供了对不同YOLO版本在同一数据集上性能的直观了解,每个版本都有其独特的优势。在选择合适的模型时,我们需要根据实际应用场景、所需的检测精度、系统资源限制以及对速度的要求等多个因素进行综合考量。
4.4 代码实现
在现代计算机视觉领域,将深度学习模型应用于实时图像处理任务已成为一项重要技术。本博客将重点介绍如何通过YOLOv8模型实现夜间车辆检测的完整过程。此任务不仅涉及模型的准确性,还包括用户界面的交互性和友好性,以便于用户能够直观地观察和评估模型的检测结果。
(1)引入必要的库
首先,系统的构建开始于导入必要的Python模块。sys模块是Python内建的模块,它提供了许多与Python解释器紧密相关的功能。例如,sys.argv用于获取命令行参数,这在启动应用程序时尤为重要。time模块允许我们获取当前时间,这对于性能评估和监控推理时间至关重要。OpenCV库(cv2)是图像处理的核心,它提供了一系列强大的功能来捕捉和处理图像数据。
import random # 导入random模块,用于生成随机数
import sys # 导入sys模块,用于访问与Python解释器相关的变量和函数
import time # 导入time模块,用于处理时间
from QtFusion.config import QF_Config
import cv2 # 导入OpenCV库,用于处理图像
from QtFusion.widgets import QMainWindow # 从QtFusion库中导入FBaseWindow类,用于创建窗口
from QtFusion.utils import cv_imread, drawRectBox # 从QtFusion库中导入cv_imread和drawRectBox函数,用于读取图像和绘制矩形框
from PySide6 import QtWidgets, QtCore # 导入PySide6库中的QtWidgets和QtCore模块,用于创建GUI
from QtFusion.path import abs_path
from YOLOv8Model import YOLOv8Detector # 从YOLOv8Model模块中导入YOLOv8Detector类,用于加载YOLOv8模型并进行目标检测
QF_Config.set_verbose(False)
(2)初始化模型
我们需要加载预训练好的模型权重,这是确保我们能够捕捉到夜间场景中车辆的关键步骤。代码中使用了YOLOv8Detector类来加载我们训练好的权重文件。这个类的load_model方法接受一个指向模型权重文件的路径,这些权重定义了YOLOv8模型的结构和已学习的参数。
cls_name = ["自行车", "汽车", "狗", "人"] # 定义类名列表
colors = [[random.randint(0, 255) for _ in range(3)] for _ in range(len(cls_name))] # 为每个目标类别生成一个随机颜色model = YOLOv8Detector() # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/night-yolov8n.pt", path_type="current")) # 加载预训练的YOLOv8模型
(3)设置主窗口
为了能够有效地与用户交互,我们创建了一个名为MainWindow的类,它继承自QMainWindow。这个类的构造函数中定义了窗口的大小,并初始化了一个用于显示图像的QLabel。此外,还有一个处理键盘事件的函数,允许用户通过按下Q键来退出应用程序。
class MainWindow(QMainWindow): # 定义MainWindow类,继承自FBaseWindow类def __init__(self): # 定义构造函数super().__init__() # 调用父类的构造函数self.resize(640, 640) # 设置窗口的大小self.label = QtWidgets.QLabel(self) # 创建一个QLabel对象self.label.setGeometry(0, 0, 640, 640) # 设置QLabel的位置和大小def keyPressEvent(self, event): # 定义keyPressEvent函数,用于处理键盘事件if event.key() == QtCore.Qt.Key.Key_Q: # 如果按下的是Q键self.close() # 关闭窗口
(4)主程序流程
在主函数中,我们初始化了应用程序并创建了MainWindow的一个实例。然后我们读取了一个图像,并使用OpenCV库调整其大小。这个图像将被用作模型的输入。为了提高处理速度,我们对图像进行了预处理,以满足YOLOv8模型的输入要求。
app = QtWidgets.QApplication(sys.argv) # 创建QApplication对象
window = MainWindow() # 创建MainWindow对象img_path = abs_path("test_media/NightVehicle_SIXU_A04005.jpg") # 定义图像文件的路径
image = cv_imread(img_path) # 使用cv_imread函数读取图像image = cv2.resize(image, (850, 500)) # 将图像大小调整为850x500
pre_img = model.preprocess(image) # 对图像进行预处理
YOLOv8模型的检测过程是通过调用predict方法来完成的。我们记录了开始和结束时间,以计算模型在单个图像上的推理时间。接着,我们根据预测结果在图像上绘制了边界框和类别标签,最后将处理后的图像显示在GUI界面上。
t1 = time.time() # 获取当前时间(开始时间)
pred = model.predict(pre_img) # 使用模型进行预测
t2 = time.time() # 获取当前时间(结束时间)
use_time = t2 - t1 # 计算预测所用的时间det = pred[0] # 获取预测结果的第一个元素(检测结果)# 如果有检测信息则进入
if det is not None and len(det):det_info = model.postprocess(pred) # 对预测结果进行后处理for info in det_info: # 遍历检测信息# 获取类别名称、边界框、置信度和类别IDname, bbox, conf, cls_id = info['class_name'], info['bbox'], info['score'], info['class_id']label = '%s %.0f%%' % (name, conf * 100) # 创建标签,包含类别名称和置信度# 画出检测到的目标物image = drawRectBox(image, bbox, alpha=0.2, addText=label, color=colors[cls_id]) # 在图像上绘制边界框和标签print("推理时间: %.2f" % use_time) # 打印预测所用的时间
window.dispImage(window.label, image) # 在窗口的label上显示图像
# 显示窗口
window.show()
# 进入 Qt 应用程序的主循环
sys.exit(app.exec())
此博客的代码示例展示了从模型加载到图像处理,再到最终的用户交互展示的完整流程。它不仅适用于夜间车辆检测,还可以扩展到其他各种实时图像识别任务中。
5. 夜间车辆检测系统实现
在实现一款实时夜间车辆检测系统时,我们深入考虑了用户体验和操作便捷性。系统设计思路的核心是将高效的目标检测能力与直观的用户界面(UI)紧密结合,以确保即使是非技术用户也能轻松地使用系统。为此,我们设计了一个综合架构,其中MainWindow类扮演了控制中心的角色,协调处理层和界面层的交互。
5.1 系统设计思路
MainWindow类的主要目标是提供一个用户友好的交互式夜间车辆检测系统。为了实现这个目标,采取了将界面、媒体处理和模型集成在一起的设计思路。
架构设计
我们的系统设计思路以三层架构为核心:处理层、界面层和控制层。在我们的系统设计中,重点放在了确保各个组件能够协同工作,同时保持足够的模块独立性,以便于未来的维护和升级。
- 处理层(Processing Layer):在处理层,我们利用了YOLOv8Detector类,它集成了强大的预训练YOLOv8模型,能够快速准确地识别夜间行车环境中的车辆。这一层是系统的“大脑”,负责分析用户上传的图像并检测出其中的目标。
- 界面层(UI Layer):界面层是用户与系统交流的“面孔”。我们设计的界面简洁直观,通过QtFusion库实现,它为用户提供了图像上传、结果展示和操作反馈等一系列交互功能。用户可以直接在界面上观察到模型的检测结果,这些结果以边界框的形式直观地标注在图像上,同时还显示了检测对象的类别和置信度。
- 控制层(Control Layer):控制层则是“指挥官”,它通过MainWindow类的槽函数和事件响应机制,管理用户的输入命令,并将这些命令转换为对处理器和模型的控制指令。这一层确保了用户操作的流畅性和系统反馈的及时性,无论是开始检测、停止操作还是退出程序,都能得到迅速而精确的响应。
整个系统的设计旨在无缝地集成这些层次,使得从图像上传到目标检测的整个过程既高效又用户友好。用户在操作过程中无需关注背后复杂的技术细节,所有复杂的处理过程都被优雅地封装在易于理解的界面操作之下。
系统流程
在构建一个智能监控系统时,我们将深入了解如何构建一个基于YOLOv8模型的夜间车辆检测系统。这个系统是一个交互式应用程序,它集成了图像处理、目标检测与用户交互,提供了从图像输入到目标识别的完整流程。我们的目的是提供一个既直观又功能强大的工具,使用户能够轻松处理并分析夜间行车环境中的车辆信息。
- 当用户启动应用程序时,首先展现在他们面前的是由MainWindow类实例化的用户界面。这个界面不仅美观,还充满了功能性,它引导用户轻松地选择图像输入源——无论是实时的摄像头图像流,还是存储在硬盘上的视频文件或图片。这种灵活的输入选择为用户提供了广泛的使用场景,无论是监控实时交通,还是分析已记录的行车情况。
- 选择了输入源后,系统后台开始活跃起来。一系列媒体处理器被激活,它们负责配置摄像头、读取视频或加载图像。这个过程是无缝的,用户几乎感觉不到任何等待时间,他们的选择很快就会在屏幕上呈现出来。在媒体输入源准备就绪后,系统进入了一个连续的处理循环,对图像进行一系列精细的预处理,以确保每一帧图像都符合YOLOv8模型的输入标准。
- 紧接着是检测与识别阶段,这是系统的核心所在。经过预处理的图像被送入训练有素的YOLOv8模型,该模型快速精准地识别出图像中的车辆,并给出它们的位置。每一个被识别的车辆都将在界面上以边界框的形式展示出来,让用户能够直观地看到检测结果。
- 我们的系统并不仅仅停留在展示结果上。随着检测数据的不断产生,界面也会实时更新,提供丰富的交互操作。用户可以保存检测的快照,查看系统的帮助文档,甚至通过筛选功能深入分析特定的检测数据。所有这些操作都通过一系列设计精良的按钮和菜单项实现,保证了用户体验的流畅性和友好性。
- 媒体控制同样是我们系统设计中的亮点。用户可以随时控制媒体播放的状态,包括启动或停止视频的分析,这为用户提供了操作上的自由度。无论是安全监控员需要暂停检测以更仔细地观察某个疑点,还是研究人员希望停下来分析某个特定场景,我们的系统都能够迅速响应。
总而言之,通过这个由MainWindow类驱动的夜间车辆检测系统,我们不仅仅是提供了一个工具,更是为用户打造了一次全面的交互体验。用户能够在这个平台上,无缝地完成从选择图像源到获取检测结果的整个过程,而这一切的背后,都是基于YOLOv8模型的强大目标检测能力。
5.2 登录与账户管理
在构建夜间车辆检测系统的过程中,我们考虑到了检测的准确性和实时性,还有用户的个性化体验和数据管理的需求。为此,我们整合了一个全面的账户管理系统,这不仅提升了系统的安全性,也极大地增强了用户体验。
系统的账户管理功能基于强大的PySide6框架和SQLite数据库构建,确保了用户信息的安全存储和快速检索。用户首次使用系统时,会被引导至登录界面,这里他们可以进行新账户的注册,包括设置用户名、密码以及上传个人头像。这一步骤是简单直观的,通过友好的用户界面,用户可以快速完成注册过程,并立即开始使用系统。在后续使用中,用户可以根据需要修改密码、更新头像,甚至注销账户。这些功能的加入,使用户能够在一个私密且个性化的空间内管理自己的检测结果和偏好设置。
一旦登录,用户就能进入到主界面,这里是夜间车辆检测的操作中心。主界面的设计既直观又功能丰富,实时显示包括检测框、类别以及置信度等信息。我们支持多种输入源,如图片、视频、实时摄像头以及批量文件,使得用户能够根据自己的需求选择最适合的方式进行车辆检测。这一点是非常重要的,因为它为用户提供了灵活性,无论是想要分析一个静止的图像,还是想要从视频中提取动态信息,或是希望从摄像头捕获实时数据,系统都能够满足。
我们的系统不仅在技术层面上实现了先进的多物体识别和检测,更在用户层面上提供了全面的服务。账户管理界面的设计和实现,让用户在进行实时目标检测时,能够有一个更加个性化和安全的使用环境。每一位用户都可以按照自己的需要定制系统,保存个人的检测历史,以便于后续的访问和分析。这种设计使得夜间车辆检测系统不仅是一个强大的技术工具,更是一个贴心的个人助手。通过这些细致的功能,我们的系统为用户提供了一个无缝、高效且愉悦的使用体验,使得从账户管理到车辆检测的每一个步骤都变得既简单又高效。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1Uu4m1u7Kr/
在文件夹下的资源显示如下,下面的链接中也给出了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模型的实时夜间车辆检测系统。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的夜间车辆检测和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
Fang W, Wang L, Ren P. Tinier-YOLO: A real-time object detection method for constrained environments[J]. IEEE Access, 2019, 8: 1935-1944. ↩︎
Terven J, Cordova-Esparza D. A comprehensive review of YOLO: From YOLOv1 to YOLOv8 and beyond[J]. arXiv preprint arXiv:2304.00501, 2023. ↩︎
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. ↩︎