摘要:本文深入探讨了如何应用深度学习技术开发一个先进的常见车型识别系统。该系统核心采用最新的YOLOv8算法,并与早期的YOLOv7YOLOv6YOLOv5等版本进行性能比较,主要评估指标包括mAPF1 Score等。详细解析了YOLOv8的工作机制,提供了相应的Python代码训练数据集,以便于理解和应用。系统不仅支持在静态图像中识别车型,还能处理视频文件实时视频流批量文件,展现出卓越的灵活性和准确性。

此外,研究还整合了基于PySide6的用户友好界面和基于SQLite数据库用户登录注册界面进行管理功能,使得操作简便,同时允许用户轻松切换不同YOLO模型并自定义界面。这一系统旨在为车型识别研究和深度学习初学者提供实用指导,文末提供了代码库和数据集的下载链接,鼓励读者进一步探索。本文结构如下:

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

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


前言

        在当今社会,随着城市化进程的加速和汽车保有量的急剧增加,交通管理、智能监控、自动驾驶等领域对于高效、准确的车型识别技术提出了迫切需求。常见车型识别系统作为计算机视觉和人工智能领域的一个重要研究方向,旨在通过图像或视频中的车辆图像自动识别其车型。这种技术的应用不仅可以大幅提高交通系统的管理效率和安全水平,还能为智能交通系统的发展提供强有力的技术支持。

        在过去几年中,基于深度学习的车型识别技术取得了显著的进展。特别是YOLO系列算法在提高识别速度和准确性方面发挥了重要作用。自从YOLOv5被公开以来,其后续版本YOLOv6、YOLOv7和YOLOv8陆续推出,每个版本都在性能和效率上有所改进。这些算法的迭代不仅反映了深度学习领域的快速发展,也推动了车型识别技术的应用前景。

在这里插入图片描述

        首先,YOLOv5作为系列中的重要转折点,以其出色的平衡性能获得了广泛关注。通过改进网络结构和训练策略,YOLOv5实现了在保持高准确率的同时,大幅提升了处理速度,这对于需要实时处理的车型识别系统尤为重要1。随后,YOLOv6引入了更为高效的特征提取机制和更加精细的层次结构,进一步提升了模型的泛化能力和对小目标的识别性能。YOLOv6的这些改进,使其在复杂环境下的车型识别任务中表现出色2。YOLOv7在此基础上,通过引入新的注意力机制和更加复杂的网络连接,优化了模型的特征学习能力。这些改进使得YOLOv7在处理高度遮挡和光照变化的场景时,能够更加准确地识别车型3。最新的YOLOv8则是在前几个版本的基础上,综合利用了最新的深度学习技术,如自适应学习率调整、自动化模型剪枝等,以进一步提高模型的性能和效率。YOLOv8的推出,标志着车型识别技术向更高精度、更高效率迈进了一大步4。除了YOLO系列之外,还有其他深度学习算法在车型识别领域也取得了显著成果。例如,基于Transformer的模型因其强大的全局信息建模能力,开始被应用于车型识别任务中,展现出了与卷积神经网络相媲美甚至超越的性能5

        本博客围绕构建一个基于最先进YOLOv8算法的常见车型识别系统,不仅深入剖析了算法原理,还提供了实际的系统实现和丰富的开发资源。通过这篇博客的分享,我们希望为车型识别领域的研究者和实践者提供一个全面而深入的参考框架,促进这一技术的进一步发展和应用。具体而言,本文的主要贡献可以概括如下:

  1. 引入并深入探讨了YOLOv8算法在常见车型识别中的应用:本文不仅采用了最新的YOLOv8算法,而且详尽比较了该算法与其前版本YOLOv7、YOLOv6、YOLOv5的性能差异。通过这种对比,我们展现了YOLOv8在处理速度和识别准确度上的显著优势,为车型识别领域提供了新的研究思路和技术路径。
  2. 开发了用户友好的常见车型识别系统:利用Python的PySide6库,我们设计和实现了一个具有高度交互性和用户友好界面的常见车型识别系统。该系统不仅易于使用,还能有效地展示YOLOv8算法在实际应用中的强大能力,推动了算法的普及和应用。
  3. 设计了系统的登录管理功能:通过引入登录管理机制,我们不仅增强了系统的安全性,也为将来集成更多个性化功能奠定了基础,进一步提升了系统的实用性和灵活性。
  4. 对YOLOv8算法性能进行了全面评估:本文深入研究了YOLOv8算法在常见车型识别任务中的表现,包括精准度、召回率等关键性能指标的评估,以及算法在不同环境条件下的适应性分析。这些研究成果不仅丰富了我们对YOLOv8算法性能的理解,也为进一步改进和优化算法提供了重要依据。
  5. 提供了完整的数据集和代码资源包:为了促进读者的学习和实践,本文分享了一套完整的数据集和代码资源包。这些资源涵盖了从算法训练到系统实现的全过程,使读者能够直接复现实验结果,并在此基础上进行自己的研究和开发。

1.数据集介绍

        在构建高效且精准的车型识别系统中,一个精心构建和维护的数据集发挥着不可或缺的作用。本研究使用的数据集包含了总计3569张图像,它们被细心地分配到了训练集、验证集和测试集中,分别拥有2775张、412张和382张图像。这样的分配旨在确保模型能在训练过程中学习到足够的特征,在验证过程中调整参数以避免过拟合,并在测试过程中公平地评估模型性能。

在这里插入图片描述

        每张图像在预处理阶段都经过了严格的标准化步骤,这包括尺寸调整和像素值归一化,以满足模型输入的一致性需求。这种一致性对于神经网络模型来说至关重要,因为它们对输入数据的规模和分布非常敏感。数据增强则是我们为了提高模型泛化能力而采取的策略。通过随机旋转、缩放、剪裁以及颜色调整等技术,模型被训练以识别在不同环境下、从不同角度拍摄、以及在不同光照条件下的车辆。

        进一步分析数据集的内部构成,我们观察到一些明显的类别不平衡现象。特定类别,如“car”,在数据集中的实例数量远远超出其他类别。这种不平衡可能会引起模型对频繁类别的过拟合,对于罕见类别的识别能力不足。针对这一问题,我们可能会需要应用特定的数据采样或成本敏感学习方法来确保模型对所有类别都具有良好的识别能力。

在这里插入图片描述

        关于边界框的位置和尺寸分布,我们的分析揭示了数据集的两个特点。首先,大部分边界框集中在图像的中心区域,这可能会导致模型对于中心区域的车辆有更好的识别能力,而对于边缘区域的车辆识别能力较弱。因此,在未来收集数据时,应考虑增加更多边缘位置的车辆图像。其次,边界框的尺寸分布指向了许多较小尺寸的对象实例,这可能表明车辆在图像中占比相对较小,这样的分布要求我们的模型能够有效识别远处或较小的车辆对象。博主使用的类别代码如下:

Chinese_name = {"2-wheeler": "两轮车", "auto": "自动车", "bus": "公交车", "car": "汽车",
                "crosswalk": "人行横道", "person": "行人", "traffic signal": "交通信号", "truck": "卡车", "van": "货车"}

        通过综合这些分析,我们得出结论,该数据集提供了丰富的车辆图像和标注信息,为训练出一个高性能的车型识别模型奠定了基础。然而,数据集的构建并非一劳永逸,它需要随着研究的深入和技术的进步不断地进行优化和扩充。面对类别不平衡和位置偏差的挑战,以及不断变化的技术环境,持续改进数据集将是我们未来工作的重要部分,以确保车型识别系统能在现实世界中的广泛应用场景下保持其准确性和鲁棒性。


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 = "VehicleTypeDet"

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训练时的损失函数和评估指标图像的分析,我们可以深入理解模型训练的动态,并据此优化模型参数。
在这里插入图片描述

        首先,观察训练集上的损失函数图像,包括边界框损失(train/box_loss)、分类损失(train/cls_loss)和置信度损失(train/obj_loss)。这三者随着训练过程逐渐下降,这是模型逐步学习到数据分布并提高预测准确度的直接体现。边界框损失的下降意味着模型在定位目标的准确性上得到了显著提高;分类损失的减少则反映了模型对于车辆类型识别的能力增强;而置信度损失的降低表示模型对于其预测结果更加自信。

        在验证集上,损失函数图像呈现了类似的下降趋势,这表明模型在未见过的数据上也表现出了良好的泛化能力。尤其值得注意的是,在一些训练早期阶段,验证集的损失函数值有显著的下降,这可能是因为模型正从初始的随机状态快速地学习到有价值的特征。

        转向模型的评估指标,包括精度(precision)、召回率(recall)、平均精度均值(mAP50和mAP50-95)。精度的波动在整个训练过程中比较大,这可能是由于训练过程中正样本和负样本比例的变化导致的。尽管如此,精度的整体趋势是向上的,这说明模型越来越少地将负样本错误地分类为正样本。召回率的提升说明模型能够识别出更多的正样本,这对于车辆检测系统尤为重要,因为遗漏车辆可能会带来严重的安全风险。

        mAP(平均精度均值)是一个综合评估指标,它考虑了模型在不同阈值下的精度和召回率。mAP50和mAP50-95两个指标的稳步提升表明,模型在不同的IoU(交并比)阈值下都展现出了良好的性能。在mAP50-95指标上,模型表现得尤为出色,这表明模型在检测精细度上具有很好的表现,即使在较为严格的IoU阈值下也能保持高准确度。

        在评估机器学习模型的性能时,F1分数是衡量模型准确性的一个重要指标,它是模型精确度和召回率的调和平均值。该曲线图展示了不同类别在不同置信度阈值下的F1分数变化情况,为我们提供了一种直观的方法来评估我们的车型识别模型表现。

在这里插入图片描述

         通过观察F1-Confidence曲线图,我们可以发现,在置信度阈值较低时,大多数类别的F1分数较高,这可能是由于在低置信度阈值时模型将更多的检测结果视为正类,从而导致召回率较高。然而,随着置信度阈值的提高,即模型对自己预测结果的自信度增强时,F1分数开始下降,这通常意味着模型开始变得更加保守,错过了一些正类(即召回率下降),但同时减少了错误分类正类的情况(即精确度提高)。理想的模型应当在保持较高召回率的同时也具有较高的精确度。

         具体来说,某些类别如“car”和“bus”在各个置信度阈值下均展现出较高的F1分数,这表明模型在这些类别上的识别表现较为出色。与之相比,如“2-wheeler”和“traffic signal”等类别的F1分数较低,这可能是由于这些类别在数据集中样本较少、样本分布不均或者类别本身难以识别所导致的。

         此外,整体F1分数在某个置信度阈值(图中蓝色线显示为0.385)达到了平衡点,此时所有类别的平均F1分数为0.66。这个点代表了模型对于所有类别综合评价的最优置信度阈值,是评估模型性能时的重要参考。选择该阈值可以在精确度与召回率之间取得较好的平衡,以达到实际应用中的最佳效果。

         通过这些观察,我们可以了解到模型在各个类别上的性能以及整体性能水平,并据此调整模型参数或后处理步骤,比如置信度阈值的选择。在进一步的模型训练和优化过程中,我们可以专注于那些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.6840.7270.6230.693
F1-Score0.670.720.650.66

(3)实验结果分析

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

        从mAP指标来看,YOLOv6n以0.727的分数领先,显示出最好的平均检测精度。其次是YOLOv8n,mAP为0.693,表现也相当出色。YOLOv5nu的mAP为0.684,略低于YOLOv8n。而YOLOv7-tiny的mAP为0.623,是四者中最低的,这可能是因为“tiny”版本的模型为了减少计算资源的使用而简化了网络结构,导致性能有所下降。

在这里插入图片描述
       从F1-Score指标来看,YOLOv6n同样以0.72的分数位于首位,表明其在精确度和召回率之间取得了最佳平衡。YOLOv5nu以0.67的F1得分位居第二,而YOLOv8n的F1得分为0.66,与YOLOv5nu相当。YOLOv7-tiny的F1得分为0.65,是所有版本中最低的

       通过优化柱状图的显示范围,我们强调了不同算法间的性能差异,使得数据间的对比更为明显。整体而言,这样的视觉比较为我们提供了清晰的性能概览,有助于选择最适合特定应用需求的YOLO版本。

4.4 代码实现

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

(1)导入必要的模块和配置
        首先,我们导入了必要的库和模块。sys模块让我们能够与Python解释器进行交互,而time模块则用于记录模型预测所需的时间。图像处理库cv2即OpenCV,是实现视觉任务的核心。接下来,我们引入了QtFusion和PySide6库,这些库提供了创建图形用户界面(GUI)所需的工具和控件。

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 = ["两轮车", "自动车", "公交车", "汽车", "人行横道", "行人", "交通信号", "卡车", "货车"]   # 定义类名列表

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

(3)创建主窗口
        接下来,代码的核心在于MainWindow类,它继承自QMainWindow。这个类负责创建并管理应用程序的主窗口。我们为它设置了大小,并定义了一个QLabel来显示摄像头捕获的图像。此外,我们还为MainWindow类定义了一个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函数中,我们首先调整了图像的大小以适应窗口,然后对图像进行预处理,并使用YOLOv8模型进行预测。预测完成后,我们计算并打印出了推理时间,这是衡量性能的一个重要指标。若模型成功检测到车辆,我们将使用drawRectBox函数来在图像上绘制边界框,并显示类别名称和置信度。

def frame_process(image):  # 定义frame_process函数,用于处理每一帧图像
    image = cv2.resize(image, (850, 500))  # 调整图像的大小
    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控件上显示图像

        随后,我们创建了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类,它不仅作为用户界面的主体,更是各个功能模块交互的枢纽。MainWindow类的设计采用了分层架构模式,明确区分了处理层、界面层和控制层,使得每一层都有明确的职责,提高了整个系统的可维护性和可扩展性。

在这里插入图片描述

  • 处理层(Processing Layer):处理层是系统的核心,包含了实现车型识别功能的所有算法和逻辑。这一层主要由YOLOv8Detector类组成,该类封装了对YOLOv8模型的操作,包括模型加载、图像预处理、预测执行和后处理。此外,处理层还负责处理图像数据,将摄像头捕获的实时图像转换为模型可以分析的格式。
  • 界面层(UI Layer):界面层是用户与系统交互的前端界面,由Ui_MainWindow类生成。它定义了用户操作的各种控件,例如按钮用于启动或停止识别过程,标签用于显示结果,以及图像展示区域用于实时展示识别过程。这个界面不仅需要是用户友好的,还要能够实时响应系统的变化,并将识别结果以直观的方式展示给用户。
  • 控制层(Control Layer):控制层则起到了指挥官的角色,它连接处理层和界面层,确保用户界面上的操作能够传递给处理层,并将处理结果反馈给用户。MainWindow类负责这一层的实现,通过定义槽函数和事件处理函数来响应用户的交互请求,如启动视频流、关闭程序等。同时,控制层还负责协调媒体处理器和识别模型,使得它们能够顺畅地工作。

        这三层的设计不仅使系统的结构更加清晰,也便于我们在未来对系统进行升级和扩展。例如,如果未来有了更新版本的YOLO模型,我们只需要在处理层进行更新,而不必改动其他部分。同样,如果需要添加更多的用户功能,我们也可以仅在界面层进行扩展,而不影响系统的其他部分。通过这种层次化的架构设计,我们能够构建出一个既强大又灵活的车型识别系统。

(2)系统流程

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

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

在这里插入图片描述

  1. 当用户启动应用程序时,系统首先实例化MainWindow类。这个类是整个应用的大脑,它负责初始化用户界面、设置参数,并准备一切所需的资源。用户界面的设计旨在提供清晰的导航,让用户无需猜测即可进行下一步操作。

  2. 确定输入源后,系统调用MediaHandler类来处理实时或静态的媒体数据。这涉及到图像捕获、视频流解码等复杂的媒体处理工作。随后,每一帧数据都会经过精心设计的预处理阶段,这包括调整分辨率、颜色空间的转换等,以确保数据符合YOLOv8模型的输入要求。

  3. 我们还为用户提供了媒体控制功能,用户可以通过简单的按钮操作来控制媒体流的播放状态,比如开始或暂停实时监控,或者控制视频的播放。这样的设计让用户能够根据自己的需求来控制整个检测流程

        总之,这个系统的设计旨在结合先进的车型识别技术和用户友好的界面设计,提供一个高效、直观且可靠的车型识别工具。从系统架构到用户交互,每个环节都经过精心设计,以确保即使是非专业用户也能轻松上手,这也是我们系统设计的主要贡献之一。

5.2 登录与账户管理

        在我们的常见车型识别系统中,用户体验的优化同样是我们设计的重点。系统提供了一个简洁而直观的用户登录界面,整合了PySide6的强大GUI能力和SQLite的轻量级数据库管理功能。用户首次使用系统时,可以通过注册功能创建自己的账户,这一过程涵盖了密码设置、头像个性化等选项,以确保每个用户的账户体验都是独特且私密的。一旦注册完成,用户便可以使用这些凭证安全地登录到系统。

在这里插入图片描述

        登录后,用户进入的是一个功能丰富的主界面,在这里可以执行常见车型的识别任务。无论是上传图片、导入视频文件,还是连接实时摄像头捕获的画面,系统都能够准确识别车型,并在界面上实时展示包括检测框、类别和置信度在内的详细信息。更进一步,用户可以保存检测结果,并在需要时进行查看和管理,这一点对于需要对检测结果进行后续分析的用户来说尤为有用。

        为了进一步提升个性化体验,系统还允许用户在使用过程中对自己的账户进行管理,包括但不限于更改密码以提升安全性、更新头像以增加个人特色、注销账户以保护隐私。此外,若用户忘记了密码,系统也提供了密码重置的功能,保障了用户账户的可恢复性。

在这里插入图片描述
        通过这一系列细致入微的设计,我们的系统不仅仅是一个技术工具,更是一个用户友好的平台,旨在为用户提供一站式的车型识别和管理解决方案。这样的系统设计让用户无需专业的技术背景,也能够轻松地管理自己的账户、定制化个人设置并高效地完成车型识别任务。在实时目标检测的实用场景中,我们相信这些功能将极大地提高用户满意度和系统的使用频率。


下载链接

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

在这里插入图片描述

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

演示与介绍视频:https://www.bilibili.com/video/BV1KF4m157yY/
在这里插入图片描述

    在文件夹下的资源显示如下,下面的链接中也给出了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. Fang W, Wang L, Ren P. Tinier-YOLO: A real-time object detection method for constrained environments[J]. IEEE Access, 2019, 8: 1935-1944. ↩︎

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

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

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

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

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐