基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的远距离停车位检测系统(深度学习代码+UI界面+训练数据集)

摘要:开发远距离停车位检测系统对于提高停车效率具有关键作用。本篇博客详细介绍了如何运用深度学习构建一个远距离停车位检测系统,并提供了完整的实现代码。该系统基于强大的YOLOv8算法,并对比了YOLOv7YOLOv6YOLOv5,展示了不同模型间的性能指标,如mAPF1 Score等。文章深入解释了YOLOv8的原理,提供了相应的Python代码训练数据集,并集成了一个基于PySide6的界面。

系统能够精准检测和分类远距离停车位是否有停车或空置,支持通过图片图片文件夹视频文件摄像头进行检测,包含柱状图分析标记框类别类别统计、可调ConfIOU参数结果可视化等功能。还设计了基于SQLite的用户管理界面,支持模型切换UI自定义。本文旨在为深度学习初学者提供实用指导,代码和数据集见文末。本文结构如下:

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


演示与介绍视频:https://www.bilibili.com/video/BV1KZ421Y7bw/
YOLOv8/v7/v6/v5项目合集https://mbd.pub/o/bread/ZZyUmphy
YOLOv8/v5项目完整资源https://mbd.pub/o/bread/ZZubm5xp
YOLOv7项目完整资源https://mbd.pub/o/bread/ZZucm5lt
YOLOv6项目完整资源https://mbd.pub/o/bread/ZZyUlpZy


前言

        在当前快速城市化的背景下,停车难已成为一个全球性问题,尤其是在大型城市中。随着城市车辆数量的不断增加,有效、高效的停车位检测系统成为了城市智能交通系统中不可或缺的一部分。远距离停车位检测系统利用先进的图像识别和深度学习技术,能够实时监测和识别停车场内的空闲停车位,大大减少了驾驶员寻找停车位的时间,不仅提高了停车效率,还有助于减少交通拥堵和汽车尾气排放,具有显著的社会和环境意义。

        随着人工智能技术的飞速发展,特别是深度学习技术在图像识别领域的应用,YOLO[1](You Only Look Once)系列算法因其高效的检测速度和良好的识别性能而被广泛应用于远距离停车位检测系统中。从YOLOv5[2]到最新的YOLOv8,每一代的更新都在追求更高的准确性和更快的处理速度,以应对复杂多变的停车场环境。此外,随着数据集的不断更新和扩充,算法训练的精度和泛化能力也在持续提升,使得停车位检测系统能够更加准确地识别各种不同的停车环境和条件。

        国内外许多研究团队也在持续地探索和优化远距离停车位检测的技术。例如,一些研究聚焦于通过改进算法结构和优化网络模型来提升检测系统的性能。近期的研究包括利用深度学习算法优化的实时停车位检测系统,以及结合卷积神经网络(CNN)和长短期记忆网络(LSTM)的混合模型来提高在复杂场景下的识别率。此外,研究人员还探讨了多传感器融合技术和边缘计算在停车位检测系统中的应用,旨在进一步提升系统的实时性和可靠性。

        在数据集方面,随着研究的深入,越来越多专门用于停车位检测的数据集被开发和发布。这些数据集通常包含从不同角度、不同光照条件下捕获的大量停车场图片,为算法的训练和测试提供了丰富的资源。相比于传统数据集,这些新型数据集在规模、多样性和复杂度上都有显著提升,有效地推动了检测算法的发展。

        尽管技术不断进步,远距离停车位检测系统的研究与实践仍面临着多方面的挑战,如如何有效处理遮挡问题、提高系统在不同光照和天气条件下的准确性和稳定性,以及如何进一步优化算法以适应更加复杂的停车场环境。未来的研究可能会更加侧重于通过算法创新和技术融合来解决这些问题,同时也会探索新的深度学习模型和无监督学习技术在此领域的应用可能。

        在本博客中,我们重点介绍了基于YOLOv8[3]算法的远距离停车位检测系统,这一系统标志着在智能交通管理和智慧城市建设领域中的一大进步。通过采用最先进的目标检测算法——YOLOv8,本系统不仅在检测效率和准确性上超越了前几代YOLO系列算法,而且通过一个友好的用户界面,使得停车位检测更加直观和便捷。以下是本博客的主要贡献:

  1. 采用最先进的YOLOv8算法进行远距离停车位检测:YOLOv8算法作为目前最先进的目标检测算法之一,相比于YOLOv7[4]、YOLOv6[5]和YOLOv5等前代算法,展现出更高的检测速度和更好的准确性。本文深入探讨了YOLOv8算法在远距离停车位检测中的应用,对比分析了其与早期深度学习模型在性能上的显著优势,为读者提供了基于最新技术的研究思路和实践手段。
  2. 利用PySide6实现用户界面友好的检测系统:通过使用Python的PySide6库,我们开发了一个具有良好用户体验的远距离停车位检测系统界面。该界面不仅使用户能够轻松地操作和管理检测过程,还极大地推动了YOLOv8算法在实际应用中的普及。
  3. 包含登录管理功能,提升系统安全性:系统集成了登录管理功能,确保了使用过程的安全性和数据的私密性。这一设计不仅提升了系统的专业度,也为将来添加更多个性化功能奠定了基础。
  4. 对YOLOv8模型的深入研究和性能评估:本博客不仅介绍了YOLOv8算法的基本原理和应用,还对其性能进行了深入的研究和评估,包括精确度、召回率等关键指标的分析,以及模型在不同环境条件下的表现。这些研究为进一步优化YOLOv8算法提供了有价值的参考。
  5. 提供完整的数据集和代码资源包:为了帮助读者更好地理解和实践,本文提供了包括数据集和代码在内的完整资源包。这些资源不仅允许读者直接复现本文的实验结果,还为进一步的研究和应用开发提供了便利。

1. 数据集介绍

        在本博客中,我们将深入探讨一个为远距离停车位检测系统设计的数据集。本数据集包括了高分辨率的航拍图片,共计12415张,其中训练集包含8690张图片,验证集包含2483张图片,测试集包含1242张图片。这样的数据量分布能够确保模型在训练过程中能够学习到丰富的特征,并在验证与测试过程中对模型性能进行有效的评估和调优。

        所有图片都经过了尺寸调整,以保证输入到检测模型中的一致性,统一被重塑至640x640像素的尺寸。通过这种标准化处理,我们能够降低模型处理不同尺寸图片时的计算复杂度,同时确保模型对尺寸敏感度的泛化能力。为了适配这种重塑,原始图片进行了拉伸,这意味着在预处理阶段,我们需要特别注意保持物体的纵横比,以免造成过度的形变,影响模型的检测效果。同时,我们还执行了像素数据的自动定向处理,去除了图片的EXIF方向信息,这确保了图片在输入模型之前的方向一致性,避免了由于设备不同导致的方向偏差问题。

        通过对标注数据的深入分析,我们发现本数据集包含两个主要类别:“空闲”和“占用”的停车位,它们在数据集中的实例数量分布存在显著差异。从提供的数据集分布图中可以看出,空闲停车位的标注实例远多于占用的停车位。这种分布可能反映了实际停车场景的情况,或者是为了让检测模型更重视空闲停车位的检测准确性。这种不平衡的数据分布对于训练过程意味着我们可能需要采取一些策略,如数据重采样或者修改损失函数,以防模型偏向于更频繁出现的类别。

        此外,数据集分布图还展示了停车位在图片中的位置(x,y轴分布)和大小(宽度和高度分布)。这些信息对于理解停车位在视觉场景中的一般位置具有重要意义。位置分布图显示了标注停车位在图像中大致呈现出均匀分布的特征,这有利于模型学习到不同位置的停车位特征。而大小分布图揭示了停车位的尺寸相对集中,这有助于模型对大小相似的对象进行更加精确的检测。博主使用的类别代码如下:

Chinese_name = {'space-empty': "空车位", 'space-occupied': "已泊车"}

        综上所述,我们介绍的数据集是专门为远距离停车位检测设计的,它不仅提供了大量的训练和测试图像,还通过细致的预处理、类别平衡和目标大小分析,为研究者和开发者提供了丰富的资源来训练和优化深度学习模型。

2. 系统界面效果

        系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。

(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。

(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行远距离停车位检测的图片或视频,或者启动摄像头进行实时检测。在进行检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。

(3)此外,系统还提供了一键更换YOLOv8模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。

(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。


3. YOLOv8算法原理

        YOLO(You Only Look Once)系列是目前最先进的目标检测算法之一,以其高效的检测速度和准确率被广泛应用于各种实时场景。YOLOv8作为该系列的最新进展,进一步优化了检测的速度与准确度。YOLOv8算法的设计思想继承了YOLO系列的核心特点,即整合了目标检测任务的多个步骤到一个单一的神经网络中,实现一步到位的检测。这意味着在处理图像时,YOLOv8只需一次前向传播就能预测出图像中的所有目标及其类别和位置信息,这与其他算法需要多次传播或者分步处理的方式形成了鲜明对比。

        YOLOv8的网络结构主要分为三个关键部分:Backbone(主干网络)、Neck(连接网络)和Head。在Backbone部分,YOLOv8采用了CSP(Cross Stage Partial networks)结构,该结构通过部分地跨阶段连接,增强了特征的传递并减少了计算量。CSP结构使得主干网络能够在降低计算成本的同时,保持或甚至增强特征的表达能力,这对于提升模型的性能至关重要。

        在Neck部分的设计中,YOLOv8融合了SPP(Spatial Pyramid Pooling)和FPN(Feature Pyramid Networks)的策略。SPP能够有效地增加感受野,保留更多的背景信息,而FPN通过建立一个多尺度的特征金字塔,允许网络在不同的尺度上进行有效学习,这对于检测大小不一的目标非常有用。YOLOv8的Neck部分还优化了特征融合的方法。传统的特征融合可能会导致信息的冗余或丢失,但YOLOv8通过更加精细的融合策略,能够更好地维持和传递关键的特征信息,这对于提升检测的性能至关重要。

        在Head部分,YOLOv8采用了自适应标签分配(adaptive label assignment)策略。这意味着标签不再是静态分配的,而是根据模型的预测性能动态调整,提升了对目标位置的预测准确性。传统的标签分配方法可能会造成标签与目标不匹配的问题,但自适应标签分配能够使得标签分配过程更加精确,减少了此类不匹配的问题。

        YOLOv8还引入了AutoML技术,这种技术可以自动优化网络的结构和超参数。这意味着网络可以在训练过程中自我改进,而不是依赖于研究人员的经验和直觉。这对于YOLOv8的发展来说是一个巨大的进步,因为它可以自动适应各种检测场景,从而提升了模型的普适性和鲁棒性。

        YOLOv8在训练过程中采用的正则化技术也值得关注。通过更为高级的正则化方法,YOLOv8在防止过拟合的同时,保证了模型对于真实世界数据的泛化能力。高级的正则化技术使得YOLOv8在面对多变的实际场景时,仍然能够维持较高的准确率和稳定性。

        总而言之,YOLOv8通过这些技术创新,不仅延续了YOLO系列的高速检测优势,而且在准确性和泛化能力上都取得了显著提升。这些技术的结合,使得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/aaa1.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 模型训练

        在本博客中,我们将探索如何使用最新的YOLOv8算法来训练一个远距离停车位检测模型。PyTorch是当前深度学习研究中最流行的框架之一,而YOLOv8作为一种先进的目标检测算法,可以通过PyTorch进行有效地训练和部署。

        首先,代码导入了必要的Python模块,并设定了训练将要运行的设备。这一步骤决定了模型是在GPU上进行加速训练还是在没有GPU时使用CPU。

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"

        接着,我们设置了工作进程数量和批次大小,这两个参数对于数据加载和模型训练效率至关重要。更多的工作进程可以加快数据的预处理和加载速度,而适当的批次大小可以平衡训练效率和内存消耗。随后,代码确定了训练用的数据集名称,并获取了对应的YAML配置文件的路径。YAML文件包含了训练过程中需要的所有数据路径和设置,这是训练任务配置的关键。

workers = 1
batch = 8

data_name = "ParkingSpaces"
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.load来加载配置文件,并通过yaml.safe_dump将任何更新写回原文件。

# 读取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)

        现在准备好了数据,我们加载预训练的YOLOv8模型。通过指定预训练模型的权重文件和任务类型,我们初始化了YOLO对象。最后,我们启动了训练过程。通过调用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,  # 指定输入图像的大小为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  # 指定训练任务的名称
)

        在本博客中,我们将分析在训练YOLOv8模型期间损失函数和性能指标的变化情况。这些图表是模型训练过程中的关键反馈,它们为我们提供了模型学习的直观展示,并有助于我们评估模型的性能以及调整训练策略。

        损失函数通常包括几个部分:框损失(box_loss),类别损失(cls_loss),以及目标定位损失(obj_loss)。框损失负责度量预测的边界框与真实框之间的差异,类别损失用于评估预测类别的准确性,而目标定位损失则是指模型预测目标存在与否的准确性。从训练和验证的损失图中可以看出,所有的损失值都显示了从高到低的下降趋势,说明模型随着时间的学习在不断改进其预测能力。

        box_loss的下降意味着模型越来越好地学会了如何准确定位目标的边界框;cls_loss的降低表明类别识别的准确性在提高;而obj_loss的减少则表示模型在判定目标是否存在方面变得更加精确。图中所示的平滑曲线进一步表明了这一趋势的稳定性。

        除了损失函数,图像中还展示了几个关键的性能指标,包括精确度(precision),召回率(recall),以及平均精度(mAP)。精确度表示的是模型预测为正的样本中实际为正的比例;召回率则衡量了模型捕捉到的正样本占所有实际正样本的比例;mAP是模型整体性能的度量,结合了精确度和召回率的信息,并且在多个阈值上进行了平均,是目标检测领域中最常用的评价指标。

        从图中我们可以看出,随着训练的进行,精确度和召回率都逐步上升,趋于稳定。这意味着模型对于检测出的目标越来越“自信”,并且在“自信”的同时保持了较高的正确性。同时,mAP的提高也显示了模型对各种大小的目标都有很好的识别能力,这对于远距离停车位检测来说是极其重要的。最后,mAP在IOU(交并比)阈值为0.5到0.95的不同水平上都得到了改善,这表明模型具有良好的泛化能力和鲁棒性。

        F1得分是精确度和召回率的调和平均,它是一个衡量模型准确性的重要指标,尤其在类别不平衡的数据集中,它提供了对模型性能一个综合的视角。

        如上图所示的F1得分曲线清晰地表明,对于“空闲”(space-empty)和“占用”(space-occupied)这两个类别,模型都达到了非常高的F1得分,几乎接近完美的1.0。这意味着模型在检测空闲和占用的停车位上表现出了高度的准确性与可靠性。特别是当置信度阈值(Confidence)设置得较高时,模型能够以极高的标准识别和分类停车位状态。

        随着置信度阈值的增加,F1得分呈现出一种先平稳后急剧下降的趋势。在置信度阈值很低时,F1得分就已经非常高,这显示了模型具有较强的识别能力。然而,一旦置信度超过某个点(在图中大约是0.7附近),F1得分迅速下降,这可能是因为高置信度阈值导致模型错过了一些真正的正样本,从而影响了召回率。

         整个模型对所有类别的平均F1得分(all classes)达到了0.692的置信度时保持在1.0的高位。这表明模型对于不同类别的停车位具有一致的高识别能力,并且能够保持一个相对较高的置信度水平,这对于实际应用来说是非常有利的,因为它意味着模型的预测结果非常可信。

         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.995 0.995 0.998 0.995
F1-Score 1.00 1.00 1.00 1.00

(3)实验结果分析

        在深度学习领域,持续的算法迭代和更新是提升模型性能的关键途径。我们将深入探讨四种不同版本的YOLO模型在同一数据集上的性能对比。这次的实验重点对比的是YOLOv5nu、YOLOv6n、YOLOv7-tiny以及YOLOv8n,通过mAP(平均精度均值)和F1-Score两个关键性能指标进行评估。

        首先,我们来看mAP,它是衡量目标检测模型性能的重要指标,考虑了不同置信度阈值下的精确度和召回率。在我们的实验结果中,YOLOv5nu、YOLOv6n和YOLOv8n都达到了0.995的mAP,而YOLOv7-tiny略高一些,为0.998。这表明所有模型都表现出了非常高的识别精度,尤其是YOLOv7-tiny,在此次对比中略占优势。尽管如此,这四种模型在mAP上的表现非常接近,都可以认为在实际应用中具有极高的可靠性和准确性。

        接下来,让我们讨论F1-Score。F1-Score是精确度和召回率的调和平均,这是一个非常均衡的性能指标,特别适用于那些对精确度和召回率同等重视的场景。实验显示,所有模型在这一指标上都达到了完美的1.00,这意味着在精确度和召回率之间实现了最佳的平衡。实际上,一个F1-Score为1.00的模型在识别正确的目标方面几乎没有犯任何错误。

        通过综合比较这些实验数据,我们可以看出,尽管YOLO系列随着版本更新持续在算法层面进行优化,但在这一特定数据集上,从YOLOv5到YOLOv8的所有模型都展现出了极其优秀的性能。YOLOv7-tiny在mAP上的微小领先可能归因于其特定的网络架构优化,或是在处理该数据集特有特征方面的一些细微优势。然而,整体来看,这些模型在目标检测的任务上均能达到业界顶尖水平,而选择哪一个模型可能需要根据具体的应用场景、计算资源和实时性要求来决定。

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模型并进行目标检测
from datasets.ParkingSpaces.label_name import Label_list

QF_Config.set_verbose(False)

(2)初始化模型
        接下来的代码段,我们为每一个类别分配了一个随机颜色并初始化了YOLOv8检测器,这一步骤对于之后的目标识别和边界框的可视化至关重要。我们加载了预训练的YOLOv8模型,这是执行目标检测的关键步骤。有了这个模型,我们可以对输入的图像进行分析,并识别出图中的不同目标。

cls_name = Label_list  # 定义类名列表
colors = [[random.randint(0, 255) for _ in range(3)] for _ in range(len(cls_name))]  # 为每个目标类别生成一个随机颜色

model = YOLOv8Detector()  # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/best-yolov8n.pt", path_type="current"))  # 加载预训练的YOLOv8模型

(3)设置主窗口
        为了让用户能够直观地看到目标检测的结果,我们创建了一个图形用户界面(GUI)。MainWindow类继承自QMainWindow,用于构建主窗口。它具备基本的界面功能,比如显示图像的标签和响应键盘事件。

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/2012-09-14_11_51_18_jpg.rf.9ae536e5200c523b8c4c010036587332.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:  # 遍历检测信息
        # 获取类别名称、边界框、置信度和类别ID
        name, 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. 远距离停车位检测系统实现

        在我们的设计理念中,交互式远距离停车位检测系统的目标是将高效的目标检测能力与直观的用户界面相结合,从而提供一个易于使用且响应迅速的系统。我们的系统设计思路聚焦于实现一个能够即时反馈检测结果的应用,为用户提供一个可靠的远距离停车位监控工具。

5.1 系统设计思路

        MainWindow类的主要目标是提供一个用户友好的交互式远距离停车位检测系统。为了实现这个目标,采取了将界面、媒体处理和模型集成在一起的设计思路。

架构设计
        为了构建这样一个系统,我们将复杂的问题拆分为几个独立的模块,每个模块针对特定的任务进行优化。通过这种模块化的方法,我们能够提高系统的可维护性和可扩展性。

  • 处理层(Processing Layer):YOLOv8检测器作为核心处理器,是系统的大脑,它使用深度学习算法分析图像并识别停车位的状态。该检测器不仅需要准确性高,还需要快速处理图像,以便于实时反馈。
  • 界面层(UI Layer):在用户界面层,我们致力于创建一个直观的界面,用户可以轻松地理解系统的工作状态和检测结果。界面不仅需要展示结果,还要提供简单的操作,比如开始或停止检测,调整参数等。这就要求我们的设计不仅要美观,还要功能性强。
  • 控制层(Control Layer):控制层则是联系处理层和界面层的纽带,它负责接收用户命令,并将这些命令转化为检测器的操作。同时,当检测器完成检测任务后,控制层还需负责将结果传递回界面层,以更新界面上的信息。我们通过设计高效的事件处理逻辑来确保控制层能够快速响应用户的操作,而不会影响检测任务的执行。

        综合来看,我们的系统设计不仅要确保技术的先进性,还要保证用户体验的友好性。通过细致的层次划分和模块间清晰的交互定义,我们的系统旨在为用户提供一个无缝的使用体验,无论用户的技术背景如何,都能轻松掌握并利用我们的系统进行远距离停车位监控。

系统流程
        在本博客中,我们将深入探究一款交互式远距离停车位检测系统的设计思路和流程实现。我们设计了一个名为MainWindow的类,它不仅作为用户界面的承载体,也协调着后端处理逻辑与前端的交互,从而实现一个集成化的应用程序。该系统的目标是利用深度学习算法为用户实时识别远距离的停车位状态,包括它们是空闲还是已被占用。

        为了实现这一目标,我们将系统的设计分为三个核心层次:处理层,负责图像的接收与预处理,利用YOLOv8模型进行实时检测;界面层,通过用户友好的图形界面展示处理结果,提供交互操作的接口;控制层,处理用户的指令,将用户行为转化为对系统的控制信号。

  1. 用户在启动应用程序后,将看到由MainWindow类生成的界面。这个界面允许用户选择多种图像输入源,无论是实时视频流、录制的视频文件,还是静态图片,系统都能通过内部媒体处理器灵活处理。这意味着无论用户的具体需求如何,系统都能够提供适当的输入解决方案。
  2. 当输入源被确定之后,我们的系统开始了持续的图像处理循环。这个循环首先通过缩放和标准化等一系列预处理步骤,调整图像数据格式以适配YOLOv8模型。随后,在检测与识别阶段,预处理后的图像将被喂入模型进行分析,以检测停车位的状态,并在界面上标记出空闲或占用的停车位。
  3. 随着模型运行产生结果,界面实时更新,将检测框绘制在图像上,并显示相关的状态信息。用户不仅可以在界面上看到实时的检测结果,还可以通过界面控件进行如保存结果、查看帮助或调整设置等操作。
  4. 用户还能够控制媒体播放的状态。例如,他们可以开始或停止视频流的捕捉,控制视频的播放,或者暂停和继续静态图像的分析。通过这样的交互设计,我们确保了用户能够在各个环节上与系统进行有效的互动,从而提高了用户体验和系统的实用性。

        通过这种综合的设计思路,我们的远距离停车位检测系统不仅技术先进,界面友好,而且操作直观,满足了用户在不同情境下对停车位检测需求的同时,也提供了灵活的操作方式。这种系统设计充分展示了现代计算机视觉技术与人机交互设计的结合,反映了智能系统发展的新趋势。

5.2 登录与账户管理

        在本博客中,我们将探讨远距离停车位检测系统中至关重要的一个环节:用户账户管理。系统的设计不仅重视检测技术的实现,更强调为用户提供完整的个性化体验,包括账户管理、设置保存和结果记录等方面的功能。

        用户体验的核心始于一个定制的登录界面,它是用户与系统沟通的第一道门户。基于PySide6的强大功能和SQLite的便捷存储能力,我们构建了一个简洁且直观的界面,用户可以在这里注册新账户、登录现有账户,以及进行密码修改和头像设置。这不仅提升了界面的美观度,也提高了用户操作的便捷性。

        账户管理功能为每个用户提供了一个独立的工作空间。在这个空间内,用户可以保存他们的个人设置和停车位检测记录,这对于那些需要频繁使用系统进行车位监测的用户来说尤为重要。通过这样的设计,每个用户的偏好设置和历史数据都得到了妥善的管理和存储,保证了用户体验的连贯性和私密性。

        一旦登录,用户即可进入主界面,开始使用我们强大的远距离停车位检测功能。主界面不仅实时展示了检测框和识别出的车位类别,还精确显示了每个检测对象的置信度。此外,系统支持多种输入形式,包括静态图片、视频文件、实时摄像头捕捉和批量文件处理。无论用户是希望监控一个停车场,还是批量分析视频资料,系统都能提供强大的支持。

        同时,用户界面还允许用户进行诸如账户注销和重新登录等操作。账户注销功能为用户提供了一种安全退出的方式,而重新登录功能则保证了即便在退出后,用户也能轻松回到他们的个性化环境中。

        通过整合先进的目标检测技术与细致的用户账户管理,我们的远距离停车位检测系统在满足技术性能的同时,也兼顾了用户的操作习惯和个性化需求。这种设计理念反映了我们对用户体验的深刻理解,以及对技术实现和人性化设计同等重视的态度。

下载链接

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

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

演示与介绍视频:https://www.bilibili.com/video/BV1KZ421Y7bw/
YOLOv8/v7/v6/v5项目合集https://mbd.pub/o/bread/ZZyUmphy
YOLOv8/v5项目完整资源https://mbd.pub/o/bread/ZZubm5xp
YOLOv7项目完整资源https://mbd.pub/o/bread/ZZucm5lt
YOLOv6项目完整资源https://mbd.pub/o/bread/ZZyUlpZy

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

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


结束语

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


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

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

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

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

posted @ 2024-03-15 17:31  思绪无限  阅读(226)  评论(0编辑  收藏  举报