基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的车型识别与计数系统(深度学习模型+UI界面代码+训练数据集)

摘要:开发车型识别与计数系统对于提高交通管理效率和城市规划具有重要意义。本篇博客详细介绍了如何利用深度学习构建一个车型识别与计数系统,并提供了完整的实现代码。该系统基于强大的YOLOv8算法,并结合了YOLOv7YOLOv6YOLOv5的对比,给出了不同模型之间的性能指标如mAPF1 Score等结果分析。文章深入讲解了YOLOv8算法的底层原理,提供了相应的Python代码训练数据集,并封装成一个基于PySide6的美观UI界面

系统能够精准地检测和分类交通中的不同车型并实现车辆计数,支持选择图片图片文件夹视频文件以及开启摄像头检测,包含柱状图分析标记框类别类别统计、可调ConfIOU参数可视化结果显示等功能。另外,设计了基于SQLite数据库的用户注册登录管理界面可点击按钮切换不同模型可方便修改的UI界面。本文旨在为深度学习领域的新手提供一份实用指导和参考,完整的代码和数据集已在文章结尾提供链接,便于读者下载和使用。本文结构如下:

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

基于YOLOv8/v7/v6/v5的车型识别与计数系统演示与介绍(深度学习模型+PySide6界面+训练数据集)


前言

        在当前快速发展的智能交通系统中,车型识别与计数系统成为了城市管理和智慧交通建设的重要组成部分。随着城市化进程的加速,交通拥堵、车辆管理等问题日益凸显,如何高效、准确地进行车辆识别与计数,对于改善交通状况、指导城市交通规划、优化交通资源分配等方面具有重要意义。此外,准确的车型识别技术还对于实施差异化的交通管理策略、提高道路使用效率、加强环境保护等具有深远的影响。

        随着计算机视觉技术的飞速发展,基于深度学习的车型识别与计数系统尤其是利用YOLO(You Only Look Once)系列算法,已经展现出了极高的效率和准确性。YOLO算法作为一种先进的实时目标检测系统,已经从YOLOv5迭代发展到了YOLOv8版本,其在速度和准确性方面都有了显著的提升。这些技术的发展不仅推动了车型识别领域的研究,也为智能交通系统的实际应用提供了强有力的技术支持。

在这里插入图片描述

        从最早的YOLO1,到YOLO90002,再到YOLOv43,YOLOv5等,这一系列的发展都在推动着目标检测技术的进步。在去年美团发布了YOLOv64,然后紧接着YOLOv75,到现在的YOLOv86,这个最新版本在许多方面都进行了优化与改进,如使用了更复杂的网络架构,更精细的预测机制,以及加入了对小目标的更好处理。

        视觉变换器(ViT)作为一种基于自注意力机制的模型,近年来在图像分类和目标检测任务中表现出了令人瞩目的性能。ViT通过将图像分割成多个小块并将它们视为序列进行处理,利用自注意力机制捕获全局依赖关系,从而在一些任务中超越了传统的卷积神经网络(CNN)。在车型识别领域,ViT的引入有助于提升模型对车辆特征的理解,尤其是在不同视角和光照条件下的识别能力。

        注意力机制,尤其是在YOLOv8和ViT中的应用,使得模型能够更加聚焦于图像中的关键信息,从而提高识别的准确性。这种机制通过给予图像中不同部分不同的权重,强化了模型对目标特征的识别能力,特别是在车辆遮挡和复杂背景情况下。

        MMDetection作为一个综合的目标检测工具箱,提供了包括YOLOv5、Faster R-CNN、Mask R-CNN等多种经典和最新的目标检测算法的实现。其易用性和高效性使得研究者能够快速实验和部署不同的算法,以找到最适合特定任务需求的解决方案。在车型识别任务中,MMDetection不仅可以用于快速原型设计,还能通过其丰富的算法库来探索和实现最优的模型配置。

        本博客通过详细介绍一个基于YOLOv8算法的车型识别与计数系统的开发和实现,旨在为深度学习和目标检测领域的研究者和从业者提供一个全面的研究和应用示例。本文的贡献可以概括如下:

  1. 采用最先进的YOLOv8算法:我们首次将YOLOv8算法应用于车型识别与计数系统,展现了其在处理复杂交通场景中的高效性和准确度。通过与YOLOv7、YOLOv6、YOLOv5等早期算法的性能对比,本文详细展示了YOLOv8在车型识别精度、处理速度等方面的显著优势,为后续研究提供了新的技术路径。
  2. 利用PySide6实现用户友好的系统界面:通过采用PySide6库,我们开发了一个直观且易于操作的车型识别与计数系统界面。该界面不仅优化了用户体验,也便于从业者和研究人员更有效地利用YOLOv8算法进行车型识别与计数,推动了技术的实际应用。
  3. 集成登录管理功能,增强系统安全性:系统设计中包含了登录管理功能,确保了使用过程的安全性和个性化定制的可能性。这一创新点不仅提升了系统的专业性和安全性,也为将来引入更多高级功能打下了基础。
  4. 对YOLOv8模型的深入研究与分析:本文不仅介绍了YOLOv8算法的应用,还对其性能进行了全面评估,包括精确度、召回率以及在不同环境下的表现分析。这些深入的研究有助于全面理解YOLOv8算法的强大能力和应用范围,为算法的进一步优化和改进提供了坚实的基础。
  5. 提供完整的数据集和代码资源包:为了促进技术的共享和传播,本文提供了一套完整的数据集和代码资源包,包括用于训练和测试的详细数据集以及实现系统的完整代码。这使得读者能够直接复现实验结果,并在此基础上进行进一步的研究和应用开发。

1.数据集介绍

        在构建一个高效且准确的车型识别与计数系统时,使用了一个精心准备的数据集,总共包括2026张图像,这些图像被细致地分为1488张训练图像、507张验证图像和31张测试图像。这样的分布确保模型在学习过程中能够接触到广泛的数据,同时也可以通过验证和测试集合准确评估其泛化能力和实际表现。

在这里插入图片描述

        在预处理阶段,我们对数据集中的图像进行了一系列标准化操作。首先,所有的图像都经过自动方向校正,移除了EXIF方向信息,确保了在进行图像处理时,所有的图像都保持一致的方向。这一步是至关重要的,因为不同的拍摄角度或设备可能导致图像的方向不一,影响算法的训练和识别准确度。其次,我们将所有图像统一调整为416x416像素的大小,采用拉伸的方式以适配YOLOv8算法的输入要求。虽然这种缩放可能会引入一定的形变,但我们的系统已经优化,可以抵消这种变化的影响。

        数据集的多样性是提高车型识别系统准确性的关键。我们的数据集不仅包括了各种尺寸和类型的车辆,如轿车、货车、卡车等,还特别关注了不同类别的平衡性。如数据集分布图所示,我们包含了从小型轿车(tiny car)到特种车辆(special car)等多个类别,其中中型车(mid car)和大型货车(big truck)的实例数量最多,这反映了它们在实际道路交通中的普遍性。特种车辆虽然样本量较少,但其包含在数据集中对模型的适应性和灵活性至关重要。

在这里插入图片描述

        我们还分析了数据集中车辆的位置和尺寸分布。大部分车辆目标位于图像的中心区域,这与实际驾驶场景相吻合,在这些场景中,车辆通常位于驾驶员的视野中央。此外,车辆目标在图像中的尺寸分布较为集中,这表明在不同图像中,车辆尺寸相对一致,有利于算法学习如何预测车辆的大小。博主使用的类别代码如下:

Chinese_name = {'tiny-car': "小型车", 'mid-car': "中型车", 'big-car': "大型车", 'small-truck': "小型卡车",
                'big-truck': "大型卡车", 'oil-truck': "油罐车", 'special-car': "特种车"}

        总的来说,这个综合性的数据集不仅通过精确的预处理和标准化步骤来优化训练效果,而且通过多样化的样本类型和均衡的类别分布来增强模型的泛化能力。此外,我们详尽的数据分析确保了模型训练过程中的各项指标得到充分考虑,为实现高精度的车型识别与计数系统奠定了坚实的基础。


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

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

        在本节,我们将深入探讨如何使用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 = "VehicleType"

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模型之间进行切换。

        从损失函数图像可以看出,训练过程中的框定位损失(box_loss)、分类损失(cls_loss)和目标检测损失(df1_loss)随着训练周期的增加而逐渐减少。这是一个良好的训练迹象,表明模型在学习如何更准确地识别和分类图像中的车辆。特别是,训练和验证阶段的框定位损失显著下降,说明模型在定位车辆的边界框方面表现出了优秀的学习能力。这一点对于车型识别系统尤其重要,因为边界框的准确性直接影响到后续的车型分类和计数。

在这里插入图片描述

        分类损失的下降也同样重要,因为它反映了模型在区分不同类型车辆上的性能提升。随着分类损失的降低,模型越来越能够准确地识别出是轿车、卡车还是公交车等不同类别的车辆。这对于交通流量分析和城市规划等应用场景来说是一个极为关键的功能。关于目标检测损失(df1_loss),其在训练和验证过程中都有显著的下降。这表明模型在训练过程中对检测任务的学习越来越有效,能够准确地检测并定位图像中的车辆目标。

        我们观察到平均精度均值(mAP50和mAP50-95)的提高,这是衡量目标检测模型性能的另一重要指标。mAP50关注的是IoU阈值为0.5时的性能,而mAP50-95则考虑了从0.5到0.95的不同IoU阈值。这两个指标的提升表明我们的模型不仅能够在较宽松的IoU阈值下表现良好,而且在更严格的条件下也能保持高水平的性能。

        F1分数是精确率和召回率的调和平均,是评估模型性能的重要指标,尤其是在分类任务中。它的最佳值为1,最差值为0。根据曲线图显示,各个车型类别的F1分数随着置信度阈值的变化呈现出不同的变化趋势。在置信度阈值较低时,F1分数迅速上升至接近峰值,这意味着即使在较低的置信度下,模型也能保持较高的精确度和召回率。随着置信度阈值的进一步提高,F1分数趋于稳定,表明模型对车辆类型的识别具有很高的可靠性。

在这里插入图片描述

         细致观察每个类别的曲线,我们可以看到,对于大多数车型类别,包括小型车(tiny-car)、中型车(mid-car)、大型车(big-car)、小型卡车(small-truck)、大型卡车(big-truck)、油罐车(oil-truck)以及特种车辆(special-car),其F1分数在置信度阈值提高到一个点后趋于稳定。这种趋势表明了我们的模型对各类车辆的识别能力是均衡的,没有某一类别明显落后。

         整体F1分数在曲线中展示了0.98的峰值,在置信度为0.726时达到,这表明模型具有很高的准确性和可靠性。对于车型识别任务来说,这样的结果非常理想,因为它意味着模型不仅能够以高置信度准确识别车辆,同时避免了过多的误识别和遗漏。在置信度接近1时,所有类别的F1分数都略有下降。这是因为当置信度设定过高时,模型变得过于保守,只有非常确定的预测才会被认定为正类,导致召回率下降,进而影响F1分数。因此,选择一个适中的置信度阈值是确保模型性能最优化的关键。

        总结来说,这次的评估结果为我们提供了宝贵的指导信息,指明了模型在车型识别任务上的整体性能以及如何通过调整置信度阈值来平衡精确度和召回率。随着我们系统的进一步优化和实际应用,这些评估结果将为我们提供确保模型准确性和可靠性的重要参考。

4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8对比

(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是精确率(Precision)和召回率(Recall)的调和平均值。精确率是指模型正确识别的正例与所有识别为正例的案例之比,而召回率是指模型正确识别的正例与所有实际正例之比。F1-Score对于不平衡的数据集或者需要同时考虑精确率和召回率的任务特别重要。
  • mAP(Mean Average Precision):mAP是衡量模型在多个类别上平均检测准确度的指标。它计算了模型在所有类别上的平均精度,是目标检测领域中常用的性能度量。
名称YOLOv5nuYOLOv6nYOLOv7-tinyYOLOv8n
mAP0.9920.9910.9700.989
F1-Score0.980.970.920.98

(3)实验结果分析

        在此实验中,我们选择了YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n四个模型进行比较。每个模型都在同一数据集上进行训练和测试,以确保结果的可比性。我们使用了两个关键的度量指标:mAP和F1-Score。

        从实验结果来看,YOLOv5nu和YOLOv8n在mAP指标上都表现出色,分别达到了0.992和0.989的高分,而YOLOv6n的表现也非常接近,为0.991。这三个版本的表现都优于YOLOv7-tiny,后者的mAP为0.970。mAP是衡量检测准确性的重要指标,一个高mAP值意味着模型在不同的置信度阈值下都能保持较高的准确性和完整性。

在这里插入图片描述

       F1-Score是另一个关键指标,它结合了精确度和召回率,提供了单一指标来评价模型的总体性能。在F1-Score上,YOLOv5nu和YOLOv8n同样展现了最强的性能,都达到了0.98的得分,而YOLOv6n略低一些,为0.97。YOLOv7-tiny在这个指标上的表现较差,为0.92,这可能是因为其“tiny”版本在保持模型轻量化的同时牺牲了一些检测能力。

       综合这两个指标,我们可以看出YOLOv5nu和YOLOv8n在我们的车型识别任务上表现最佳。YOLOv8n凭借其最新的架构优化和算法创新,展示了与YOLOv5nu相匹配的卓越性能,尽管它在mAP上略低于YOLOv5nu,但这种差异非常微小。YOLOv6n的表现也很接近,显示了YOLO系列在版本迭代中的稳定性和可靠性。而YOLOv7-tiny则更适合对速度要求更高、计算资源有限的场景。

       这些实验结果对于我们选择适合的算法提供了重要的参考。在考虑实际应用时,我们需要权衡模型的准确性、速度和资源消耗。例如,如果部署环境有较严格的计算资源限制,可能会选择YOLOv7-tiny版本,而在计算资源相对充足的环境中,YOLOv5nu或YOLOv8n将是更佳的选择。这些实验不仅展示了各个版本的性能差异,也反映了YOLO系列在不断进化中的技术成熟度。

4.4 代码实现

        在这篇博客中,我们将探讨如何结合YOLOv8检测器和PySide6框架,实现一个实时车辆检测系统。这个系统能够处理视频流,并实时展示检测到的车辆,为用户提供直观的视觉反馈。现在,让我们深入理解实现这一功能的代码逻辑。

(1)导入必要的模块和配置
        首先,我们需要设置程序的运行环境。这包括导入必要的Python模块,如sys模块用于访问与Python解释器相关的变量和功能,time模块用于执行与时间相关的函数,cv2即OpenCV库用于处理视频和图像。此外,我们还需要PySide6库来创建图形用户界面,以及YOLOv8Model模块,其中包含我们的车辆检测逻辑。

import sys  # 导入sys模块,用于处理Python运行时环境的一些操作
import time  # 导入time模块,用于处理时间相关的操作
import cv2  # 导入OpenCV库,用于处理图像和视频
from QtFusion.path import abs_path
from QtFusion.config import QF_Config
from QtFusion.widgets import QMainWindow  # 从QtFusion库中导入FBaseWindow类,用于创建主窗口
from QtFusion.handlers import MediaHandler  # 从QtFusion库中导入MediaHandler类,用于处理媒体数据
from QtFusion.utils import drawRectBox  # 从QtFusion库中导入drawRectBox函数,用于在图像上绘制矩形框
from QtFusion.utils import get_cls_color  # 从QtFusion库中导入get_cls_color函数,用于获取类别颜色
from PySide6 import QtWidgets, QtCore  # 导入PySide6库的QtWidgets和QtCore模块,用于创建GUI和处理Qt的核心功能
from YOLOv8Model import YOLOv8Detector  # 从YOLOv8Model模块中导入YOLOv8Detector类,用于进行YOLOv8物体检测
QF_Config.set_verbose(False)

(2)定义类别和模型
        YOLOv8模型是实现车辆检测的关键,我们通过实例化YOLOv8Detector并加载预训练权重来准备模型。这一步骤对于确保我们的检测系统能够准确地识别各种车辆至关重要。为了在图像上区分不同的车辆类型,我们通过get_cls_color函数为每一类车辆分配一个颜色。这样,在最终的输出图像中,用户可以通过颜色轻松区分不同的车辆类型。

cls_name = ["小型车", "中型车", "大型车", "小型卡车", "大型卡车", "油罐车", "特种车"]  # 定义类别名称列表

model = YOLOv8Detector()  # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/vehicle-best-yolov8n.pt", path_type="current"))  # 加载预训练的YOLOv8模型
colors = get_cls_color(model.names)  # 获取类别颜色

(3)创建主窗口
        接下来,我们定义主窗口类MainWindow,它是我们程序的用户界面。这个窗口不仅展示了视频流,还能展示由YOLOv8检测器处理后的结果。我们通过重写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)主程序流程

        图像处理是我们系统的核心,frame_process函数负责处理每一帧图像。我们首先调整图像大小以适配显示窗口,然后对图像进行预处理并通过YOLOv8模型进行检测。检测完成后,我们使用drawRectBox函数在图像上绘制边界框,并将处理后的图像展示在GUI中。

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上显示图像

        随后,我们初始化主窗口并准备视频处理流程。我们设置了视频文件路径,并创建了MediaHandler对象来处理视频流。通过连接frameReady信号到frame_process函数,我们保证视频的每一帧都能得到实时处理。

app = QtWidgets.QApplication(sys.argv)  # 创建QApplication对象
window = MainWindow()  # 创建MainWindow对象

filename = abs_path("test_media/test.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())

        最后,我们通过展示主窗口并进入Qt应用程序的主循环,使得用户界面保持响应并能够实时更新。我们展示了如何使用先进的对象检测模型和现代GUI框架,搭建一个实时检测系统。详细的代码解释提供了从环境设置到有效显示检测结果的全面视角,旨在帮助读者更好地理解如何构建一个实用的实时车辆检测系统。


5. 车型识别与计数系统实现

        在构建我们的交互式车型识别与计数系统时,不仅需要快速准确地处理视频流中的图像数据,还需要提供一个清晰易用的界面,让用户能够无缝地与之交互。我们的设计思路遵循了将复杂的功能模块化和简化的原则,通过将界面设计、媒体处理和深度学习模型融为一体,我们实现了这一目标。

5.1 系统设计思路

        在我们的系统设计中,我们的设计理念是构建一个高效、直观且用户友好的界面,使用户能够无缝地与系统交互。整个系统被设计为一个紧密集成的框架,其中每个组件都旨在提升整体性能和用户体验。
(1)架构设计
        在系统的核心,我们设计了MainWindow类,它不仅作为用户界面的主体,更是各个功能模块交互的枢纽。MainWindow类的设计采用了分层架构模式,明确区分了处理层、界面层和控制层,使得每一层都有明确的职责,提高了整个系统的可维护性和可扩展性。

在这里插入图片描述

  • 处理层(Processing Layer):处理层是由YOLOv8Detector类和相关的方法构成,它搭载了预训练的深度学习模型,负责图像数据的实时处理。这一层的设计关键在于高效率的图像识别与处理能力,它直接关系到系统性能的核心指标。
  • 界面层(UI Layer):界面层则由Ui_MainWindow类负责,它生成了整个应用程序的用户界面。界面层设计得既直观又友好,包含了各种用户交互元素,比如按钮、标签和显示框等,确保用户能够轻松地理解和操作系统。
  • 控制层(Control Layer):控制层则承担了界面与处理层之间的桥梁作用,它由MainWindow类中的槽函数和其他方法组成。控制层响应用户的操作,控制媒体处理器的行为,同时确保模型的检测结果能够被准确地反映在用户界面上。

        通过这样的架构设计,我们的系统不仅保证了在识别与计数车辆类型方面的高准确度和高速度,还提供了极佳的用户体验。利用信号和槽机制,系统中的不同模块可以高效地进行交互和数据传递,这为系统的可靠性和响应性提供了保障。这种设计让我们的系统不仅在技术上先进,同时在用户体验上也达到了高标准。

(2)系统流程

        在本博客中,我们将讲述设计一个交互式车型识别与计数系统的全过程。本系统的核心设计理念是用户友好性,高效整合前沿的YOLOv8目标检测技术和直观的用户界面,以确保即使是非专业用户也能轻松使用该系统。在系统的设计中,我们特别强调了处理层、界面层和控制层的分离,旨在实现高效的模块间交互和数据流管理。

        我们的系统首先通过MainWindow类的实例初始化,它不仅为用户提供了一个操作界面,还负责配置整个应用程序的相关参数。这样的设计使得用户能够通过一个清晰的界面来选择数据输入源,无论是实时的摄像头捕获、视频文件还是静态图像,都能够轻松接入并处理。

在这里插入图片描述

  1. 当用户选择了数据输入源后,系统会调用媒体处理器来配置摄像头、读取视频文件或加载图像文件。这个过程涉及到了多种媒体处理技术,以确保输入数据能够正确地被系统接收和解析。一旦输入源准备就绪,系统便开始了连续帧处理的循环,这一循环包含了几个关键阶段:预处理、检测与识别以及界面更新。

  2. 在预处理阶段,系统会对每一帧图像进行标准化处理,以适应YOLOv8模型的输入需求。随后,这些图像被送入预先训练好的YOLOv8模型进行车辆目标的检测和识别。检测结果随后将被实时反馈到界面上,展示检测框,并标注车辆类型。同时,界面也会实时显示检测统计数据,如检测到的车辆数量和类型分布,以直观的图表形式呈现给用户。

  3. 用户交互也是系统设计的一个重要部分。用户可以通过界面提供的按钮进行多种操作,比如保存检测结果、查询系统信息等。此外,用户还能够控制媒体播放,例如开始或停止视频分析。

        整个系统的设计不仅重视技术的实现,还特别关注用户体验。我们希望通过这样的设计,使技术不再遥远和复杂,而是成为用户日常生活和工作中的得力助手。通过实时的车型识别与计数,我们的系统能够为城市交通管理、停车场管理以及智能交通系统的研究提供有力的数据支撑和应用示例。

5.2 登录与账户管理

        在本节中,我们将讨论一个综合性的车型识别与计数系统,该系统不仅在技术层面上实现了先进的多物体检测,而且在用户体验方面也进行了深入的设计。一个特别值得注意的特性是系统集成了一个完整的用户账户管理功能,旨在为用户提供一个安全、个性化的使用环境。

在这里插入图片描述

        我们的系统基于PySide6框架,与SQLite数据库相结合,构建了一个完备的用户登录和注册界面。这个界面不仅简洁直观,而且包含了丰富的功能,如账户创建、密码更新、头像个性化以及账户注销和重新登录等。这些功能为用户提供了一个独立的个人空间,在这个空间内,用户可以保存个人的检测历史和偏好设置,从而实现了个性化的用户体验。

        通过用户友好的登录界面,用户可以轻松地注册新账户或登录到系统,然后进入主功能界面进行车型识别任务。系统的设计考虑到了用户可能需要在不同时间点访问和管理个人数据,因此提供了修改密码和头像设置等功能。此外,考虑到用户可能需要在不同设备上使用系统,我们还提供了账户注销和重新登录的选项,增加了使用的灵活性。

        主界面是用户与车型识别与计数系统交互的中心。在这里,系统实时显示检测框、类别和置信度等关键信息,并支持多种输入方式,包括图片、视频、实时摄像头捕获和批量文件处理。用户可以根据个人需求,选择最合适的输入方式进行车型识别,并将结果记录下来。

在这里插入图片描述
        整个系统的设计思路是以用户为中心,旨在提供一个全面、易于使用的车型识别解决方案。我们的目标是让用户能够在一个安全的环境中享受到最新的深度学习技术带来的便捷。无论用户的需求是进行单次的车辆检测还是连续的交通流监控,这个系统都能提供强大的支持。通过这样的系统设计,我们希望能够提升用户对智能交通系统的认知,推动智能交通技术的应用和发展。


下载链接

    若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:

在这里插入图片描述

完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷

演示与介绍视频:https://www.bilibili.com/video/BV1w2421T71S/

在这里插入图片描述

    在文件夹下的资源显示如下,下面的链接中也给出了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等模型。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的车型识别与计数结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。

        该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。


结束语

        由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。


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

  2. Redmon J, Farhadi A. YOLO9000: better, faster, stronger[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2017: 7263-7271. ↩︎

  3. Bochkovskiy A, Wang C Y, Liao H Y M. Yolov4: Optimal speed and accuracy of object detection[J]. arXiv preprint arXiv:2004.10934, 2020. ↩︎

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

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

  6. Terven J, Cordova-Esparza D. A comprehensive review of YOLO: From YOLOv1 to YOLOv8 and beyond[J]. arXiv preprint arXiv:2304.00501, 2023. ↩︎

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

思绪无限

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

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

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

打赏作者

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

抵扣说明:

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

余额充值