摘要:开发停车位检测系统对于优化停车资源管理和提升用户体验至关重要。本篇博客详细介绍了如何利用深度学习构建一个停车位检测系统,并提供了完整的实现代码。该系统基于强大的YOLOv8算法,并结合了YOLOv7、YOLOv6、YOLOv5的性能对比,展示了不同模型之间的性能指标如mAP、F1 Score等结果分析。文章深入讲解了YOLOv8算法的底层原理,提供了相应的Python代码、训练数据集,并封装成一个基于PySide6的美观UI界面。
系统能够精准地检测和分类停车场图像中的空闲和占用停车位,支持选择图片、图片文件夹、视频文件以及开启摄像头检测,包含柱状图分析、标记框类别、类别统计、可调Conf、IOU参数、可视化结果显示等功能;另外设计了基于SQLite数据库的用户注册登录管理界面、可点击按钮切换不同模型、可方便修改的UI界面。本文为深度学习领域的新手提供一份实用指导和参考,完整的代码和数据集已在文章结尾提供链接,便于读者下载和使用。本文结构如下:
目录演示与介绍视频:https://www.bilibili.com/video/BV1hi421d77E/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/mbd-ZZuZm55v
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZuZm55s
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuZm55q
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZuZm55r
前言
在当今社会,随着汽车保有量的持续增加,城市停车成为了一个日益严峻的问题。特别是在商业中心、居民区和办公区域,寻找空闲停车位往往耗时耗力,不仅给驾驶者带来了极大的不便,也加剧了城市交通拥堵,增加了环境污染。在这样的背景下,停车位检测系统的研究和开发显得尤为重要。它通过自动化技术实时检测停车场或停车区的空闲停车位,极大地提高了停车效率,减少了寻找停车位的时间,对于缓解城市交通压力、提升城市生活品质具有重要意义。
近年来,随着深度学习技术的快速发展,基于YOLO(You Only Look Once)系列算法的停车位检测系统尤其受到研究者的关注。YOLO算法因其快速且准确的特性,在实时物体检测领域表现出色。从YOLOv5到YOLOv8,每一个版本的迭代都带来了算法性能的显著提升,包括检测精度的提高和处理速度的加快,这对于需要实时反馈的停车位检测系统来说至关重要。此外,结合其他最新类型的算法改进和技术进展,如卷积神经网络的优化、数据增强技术的应用,以及更为丰富和精确的数据集更新,都极大地推动了停车位检测技术的发展。
从最早的YOLO[1],到YOLO9000[2],再到YOLOv4[3],YOLOv5等,这一系列的发展都在推动着目标检测技术的进步。在去年美团发布了YOLOv6[4],然后紧接着YOLOv7[5],到现在的YOLOv8[6],这个最新版本在许多方面都进行了优化与改进,如使用了更复杂的网络架构,更精细的预测机制,以及加入了对小目标的更好处理。
除了YOLO系列,其他算法如SSD和Faster R-CNN也在停车位检测领域中有所应用,但由于YOLO系列在速度和准确度上的优势,更受研究社区的欢迎。近年来,研究者还尝试将YOLO算法与其他技术相结合,如GANs(生成对抗网络)和强化学习,以进一步提高停车位检测系统的准确率和鲁棒性。
当前的研究不仅聚焦于算法本身的改进,还包括数据集的更新和扩充、性能评估标准的完善,以及对特定挑战(如不同光照条件、遮挡情况)的应对策略。这些研究的目的是使停车位检测系统更加准确、可靠和适应多变的环境条件。面对技术挑战,研究者们正致力于解决包括但不限于算法的实时性、在复杂场景下的准确性、以及系统的可扩展性和可维护性等问题。随着技术的进步和新算法的出现,停车位检测系统的性能有望进一步提升,为解决城市停车难题提供更有效的解决方案。
尽管面临挑战,但通过不断的技术创新和跨学科研究,停车位检测系统的发展前景仍然被看好。未来的研究可能会集中在提高系统的泛化能力、减少对大量标注数据的依赖、以及开发更加节能的模型上,以实现更广泛的应用和部署。
本博客通过详细介绍一个基于YOLOv8算法的停车位检测系统的开发和实现,旨在为深度学习和目标检测领域的研究者和从业者提供一个全面的研究和应用示例。本文的贡献可以概括如下:
- 采用最先进的YOLOv8算法进行停车位检测:本文首次在停车位检测系统中引入了YOLOv8算法,并详细介绍了其实现过程和原理。通过与YOLOv7、YOLOv6、YOLOv5等早期版本的对比分析,展示了YOLOv8在效率和精确度上的显著优势。这一工作不仅为停车位检测提供了一个更为高效和准确的技术方案,也为后续研究者提供了宝贵的参考和启示。
- 利用PySide6实现友好的用户界面:本文展示了如何运用PySide6库开发出一个既美观又易于操作的停车位检测系统界面。该界面设计考虑了用户的操作习惯和体验,使得停车位检测变得更加直观和便捷。这一创新不仅提升了用户体验,也促进了YOLOv8算法在实际应用场景中的广泛应用。
- 集成登录管理功能以提升系统安全性:系统中新增的登录管理功能,增强了系统的安全性,同时为将来添加更多个性化功能留出了空间。这表明本研究不仅关注于算法的性能优化,也重视用户体验和系统的实用性。
- 对YOLOv8模型的深入分析与评估:本文不仅介绍了YOLOv8算法的应用,还对模型的性能进行了全面的分析和评估,包括精确度、召回率等关键性能指标,以及模型在不同环境条件下的适应性。这些深入的分析为进一步优化YOLOv8算法,提升停车位检测的准确性和鲁棒性提供了坚实的基础。
- 提供完整的数据集和代码资源包:为了便于读者更好地理解、复现和进一步研究,本文提供了一套完整的数据集和代码资源包。这些资源的分享,不仅降低了读者进行相关研究的门槛,也有助于促进技术的开放交流和快速迭代。
1.数据集介绍
在构建一个高效且准确的停车位检测系统时,一个精心设计的数据集是至关重要的。我们的数据集共包含7801张图像,其中6017张用于模型训练,726张用于模型测试,以及1058张用于模型验证。这种划分确保了我们的模型在不同数据子集上都有良好的表现,并且可以公正地评估其泛化能力。我们的数据集不仅在数量上可观,而且在多样性上也具备优势。它包含了各种不同的停车环境,如室内外、不同的光照条件以及各种角度拍摄的停车场景。这些多样化的场景对于训练一个鲁棒的停车位检测模型至关重要,因为它们使得模型能够适应现实世界中的各种条件。
在预处理阶段,所有图像均经过自动方向调整,并剥离了EXIF信息中的方向标签,以确保所有图像的方向一致。此外,每张图像都被统一调整到了640x640像素的大小,这不仅有利于减少模型训练和推断过程中的计算负担,而且保证了不同图像在尺度上的统一。这些预处理步骤为模型训练提供了一致和标准化的输入,是高效学习的前提。
在数据集的标注方面,我们采用了精确的标注框来标识每个停车位的位置,并对其进行了“empty”(空闲)和“occupied”(占用)的分类。这种详细的标注为训练深度学习模型提供了必要的真实世界情境,允许模型学习如何区分不同状态的停车位。值得注意的是,数据集中“occupied”状态的停车位数量多于“empty”状态,这可能需要在模型训练时采用类别平衡技术以避免偏差。
进一步分析数据集的标注框分布,我们发现大多数停车位标注集中在图像的中心区域,这反映了摄影时的一致性以及停车位在空间上的规律性。同时,停车位标注的大小分布相对集中,这说明我们可以在模型的锚框设计中利用这一特性,选择合适的尺度和比例来更好地匹配实际的停车位尺寸。博主使用的类别代码如下:
Chinese_name = {'empty': "空车位", 'occupied': "已泊车"}
综上所述,我们的数据集在规模、多样性、预处理、标注质量和详细程度方面都经过了精心设计和优化,以支持开发和评估先进的停车位检测系统。通过提供这些详细的介绍,我们希望能够帮助研究人员和开发者更好地理解和利用我们的数据集,进而在停车位检测这一关键领域中取得突破。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行停车位检测的图片或视频,或者启动摄像头进行实时检测。在进行停车位检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8/v5模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。3. YOLOv8算法原理
YOLOv8算法继承并发展了其前辈YOLO系列算法的优点,是一种高效的实时目标检测算法。这一版本在架构上做了多项创新,进一步提升了检测速度和准确性,使其在实际应用中更加强大和灵活。YOLOv8的架构采用了CSP Bottleneck with 3 convolutions结构,这是其前身YOLOv5结构的进一步演变。CSP即Cross Stage Partial networks,它的设计理念是将网络的层次分割成多个部分,从而减少计算量和提高信息流的速度。在YOLOv8中,CSP结构通过三个卷积层来实现,这三个卷积层分别负责提取特征图的不同部分,然后将这些部分再次合并,这样做的好处是可以在保持高性能的同时减少模型的参数数量,从而减轻了计算负担,加速了训练和推理过程。
此外,YOLOv8还采用了CSP Bottleneck with 2 convolutions结构,在这个结构中,Bottleneck部分由两个卷积层组成。这种设计有效地提升了网络的特征提取能力,并且在降低计算量的同时提高了特征的利用率。
在卷积层后,YOLOv8继续采用了批量归一化(Batch Normalization, BN)和SILU激活函数。批量归一化有助于网络训练过程中的稳定性,通过规范化层的输入,可以加快训练速度,提高模型的收敛速度。SILU激活函数(也称为SiLU或者Swish),是一种非线性激活函数,它比传统的ReLU函数有更好的性能,因为它能够在负输入值时仍然提供一定的输出,这有助于保持网络中信息的流动,避免了梯度消失的问题。
在损失函数方面,YOLOv8采用了GFL(Generalized Focal Loss)。这种损失函数是对传统的Focal Loss的泛化,它对正负样本的分类问题进行动态调整,有助于模型更加聚焦于困难样本,即那些模型预测不确定性较高的样本。这有助于提高模型对小目标和在复杂背景中目标的检测能力。另外,YOLOv8还引入了DFL(Distribution Focal Loss),这是一种新的损失函数,专门针对目标检测中的分类问题。DFL关注于概率分布,帮助模型在预测时考虑到每个类别的概率分布,从而提高分类的准确性。
最后,YOLOv8通过Ghost模块进一步优化网络,这种模块通过在计算过程中生成更多的特征图副本(即"ghost"特征图),有效减少了计算量并提高了信息的多样性。这种技术使得网络能够在不显著增加计算成本的情况下,提供更丰富的特征表示,从而提高了检测性能。
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库,包括操作系统交互(os),解析YAML文件(yaml),以及Ultralytics的YOLO模型。YAML文件通常用于存储配置信息,如数据集路径、类别信息等。
import os
import yaml
from ultralytics import YOLO # 导入YOLO模型
from QtFusion.path import abs_path
接下来,代码确保只有当该模块作为主程序运行时,才执行训练代码。然后,它定义了数据集的名称,并使用abs_path函数获得YAML配置文件的绝对路径。unix_style_path用于确保路径格式在不同操作系统间兼容。在读取YAML文件之前,代码首先获取了YAML文件所在的目录路径。通过打开并读取YAML文件,代码能够加载数据集的配置。为了确保路径的正确性,如果path项存在于YAML文件中,代码将其更新为目录路径。所有这些步骤都是为了确保模型训练时数据的正确加载。
if __name__ == '__main__': # 确保该模块被直接运行时才执行以下代码
data_name = "ParkingSpacesv2"
data_path = abs_path('datasets/ParkingSpacesv2/parkingv2.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)
workers = 1
batch = 8
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='0', # 指定使用CPU进行训练
workers=workers, # 指定使用2个工作进程加载数据
imgsz=640, # 指定输入图像的大小为640x640
epochs=100, # 指定训练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='0', # 指定使用CPU进行训练
workers=workers, # 指定使用2个工作进程加载数据
imgsz=640, # 指定输入图像的大小为640x640
epochs=100, # 指定训练100个epoch
batch=batch, # 指定每个批次的大小为8
name='train_v8_' + data_name # 指定训练任务的名称
)
在配置了数据路径后,代码继续设置训练参数。workers定义了数据加载时使用的进程数,而batch定义了每批次训练的图像数量。之后,代码加载了预训练的YOLOv8模型并开始了训练过程,设置了设备、工作进程、图像大小、训练周期和批次大小等参数。代码还展示了如何加载另一个预训练模型YOLOv8并进行训练,这显示了如何灵活地在不同版本的YOLO模型之间进行切换。
损失函数图显示了训练集和验证集上的三种损失:box_loss、cls_loss和dfl_loss。box_loss表示边框回归损失,即模型预测的边框与真实边框之间的差异;cls_loss是分类损失,指模型对于停车位状态(空闲或占用)分类的准确性;dfl_loss是分布式焦点损失,它是YOLOv8特有的,用于处理分类不平衡的问题。从图中可以看出,随着训练过程的进行,所有三种损失都呈现出明显的下降趋势,这表明模型在逐渐学习并改进其对停车位的定位和分类能力。值得注意的是,训练集和验证集上的损失趋势保持一致,这说明模型没有出现过拟合现象,具有较好的泛化能力。
评价指标图包括了precision(精确率)、recall(召回率)、mAP50(在IoU阈值为0.5时的平均精度)和mAP50-95(在IoU阈值从0.5到0.95的平均精度)。这些指标反映了模型检测性能的不同方面。精确率显示了模型正确检测到的停车位占所有模型检测到的停车位的比例,而召回率则显示了模型正确检测到的停车位占所有实际停车位的比例。mAP50和mAP50-95则提供了更全面的性能评估,其中mAP50-95考虑了更严格的IoU阈值,因此更能体现模型的整体性能。从图中我们可以看到,随着训练的进行,精确率和召回率都逐渐上升,表明模型在不断提高其检测的准确性和完整性。mAP指标同样显示出上升趋势,尤其是mAP50-95的提升,表明模型对于不同大小和形态的停车位都有良好的检测能力。
YOLOv8模型在停车位检测任务上展现出了优秀的训练效果。损失函数的下降和评价指标的提升充分证明了模型的有效性和稳健性。通过这些图表的详尽分析,我们可以更加自信地将YOLOv8模型应用于实际的停车位检测场景中,以期望获得高准确率和高稳定性的检测结果。
F1分数是精确率和召回率的调和平均,是评估模型性能的重要指标,尤其是在分类任务中。它的最佳值为1,最差值为0。从提供的F1分数曲线图中,我们可以看到两个类别:'empty'(空闲)和'occupied'(占用),以及所有类别的综合F1分数。这种曲线图帮助我们理解在不同置信度阈值下模型性能的变化。
在图中可以观察到,随着置信度阈值的提高,两个类别的F1分数曲线先是上升然后开始下降。'empty'类别和'occupied'类别的曲线在大部分置信度区间内都非常接近,这表明模型对于检测空闲和占用的停车位具有相似的性能。此外,当置信度阈值在0.5左右时,两个类别的F1分数达到高峰,表明这是模型判断空闲和占用状态的最佳置信度区间。
对于所有类别的综合F1分数,在置信度约为0.488时达到了0.96的高值。这个结果非常出色,意味着模型在这一置信度阈值下能够非常好地平衡精确率和召回率,实现了对停车位状态的准确检测。然而,随着置信度阈值的继续提高,F1分数开始急剧下降,这可能是由于模型对于部分样本过于自信,导致了较高的假正例(false positives)或假负例(false negatives)。
这些观察结果对于模型的实际应用至关重要。它们表明,在部署模型前,我们需要仔细选择置信度阈值,以确保模型在实际使用时能够保持高准确率。同时,这也提示我们可能需要对模型进行进一步的调整或后处理,比如在置信度较低时采取一些策略来降低假负例,或在置信度较高时降低假正例。
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.980 | 0.953 | 0.832 | 0.981 |
F1-Score | 0.95 | 0.91 | 0.77 | 0.96 |
(3)实验结果分析:
在此实验中,我们选择了YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n四个模型进行比较。每个模型都在同一数据集上进行训练和测试,以确保结果的可比性。我们使用了两个关键的度量指标:mAP和F1-Score。
首先,让我们看看mAP值。YOLOv5nu和YOLOv8n在这个指标上表现相当,分别达到了0.980和0.981的高分,这表明两者在目标检测任务上具有出色的精度和鲁棒性。YOLOv6n的表现略低于这两者,mAP为0.953,虽然略低,但仍然表现出较高的检测能力。而YOLOv7-tiny的表现最低,mAP为0.832,这可能是因为"tiny"版本的模型更轻量级,虽然速度较快,但在检测精度上有所牺牲。
对于F1分数,这是一个综合考量精确率和召回率的指标,YOLOv8n以0.96的得分领先,这意味着在精确地识别正类实例和最小化错误识别上,YOLOv8n的平衡性最好。YOLOv5nu紧随其后,F1分数为0.95,仍然显示出极强的性能。而YOLOv6n和YOLOv7-tiny的F1分数分别为0.91和0.77,显示出在保持较高精确率和召回率的平衡上有所挑战,尤其是YOLOv7-tiny,在这个指标上可能受到其简化网络结构的影响。
这些数据揭示了不同YOLO版本在性能上的差异。YOLOv8n的最新架构和优化,在这个实验中显示出了最优的性能。尽管YOLOv5nu紧随其后,但YOLOv8n在细微的性能提升上显现出了其架构改进的成果。YOLOv6n作为这个系列中的一个中间版本,展现了均衡的性能。而YOLOv7-tiny,作为一种为速度优化的轻量级模型,虽然在速度上有优势,但在精度上有所牺牲,这在需要高精度检测的场景下是一个需要考量的权衡。
在选择适合自己应用场景的模型时,我们需要根据性能指标以及实际应用的需求(如速度、准确度和计算资源)来做出决策。例如,如果实时性要求不是特别高,可以考虑使用YOLOv5nu或YOLOv8n。如果对速度有极致要求,而可以接受一定程度上精度的牺牲,则YOLOv7-tiny可能是一个不错的选择。而在一个资源限制且需要较高准确度的环境下,YOLOv6n可能是一个折中的选择。通过这样的对比分析,我们可以更好地理解各个模型的性能和适用场景,为实际应用中的模型选择提供指导。
4.4 代码实现
在这篇博客中,我们将深入探讨如何利用Python和一系列强大的库来实现一个基于YOLOv8的实时物体检测系统。整个系统构建在强大的计算机视觉库OpenCV和先进的深度学习模型YOLOv8上,同时融合了Qt框架来创建用户界面。
在实时停车位检测系统中,需要结合YOLOv8模型和一系列开源库,如OpenCV、QtFusion和PySide6等,来实现主窗口的展示、摄像头帧的处理以及停车位的检测和标注等功能。
(1)导入必要的模块和配置
首先,我们引入必要的Python库。sys库提供对解释器相关功能的访问,而time库则用于跟踪模型推理的时间。OpenCV库作为图像处理的核心,PySide6则从Qt库中引入,用于搭建图形用户界面。此外,我们还导入了QtFusion库,它是基于Qt的一个工具集,用于简化多媒体处理和窗口管理。
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)
这一部分主要负责导入各种模块。random用于随机颜色生成,sys和time分别用于系统操作和时间处理。cv2是图像处理的核心,而QtFusion和PySide6则用于构建用户界面。
(2)定义类别和模型
在这段代码中,我们定义了两个类别名称:空车位和已泊车。每个类别对应的颜色是随机生成的,以便在图像上以不同的颜色标识不同类别的检测结果。然后创建了YOLOv8Detector对象并加载了模型权重。
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/parking-yolov8n.pt", path_type="current")) # 加载预训练的YOLOv8模型
(3)创建主窗口
我们定义了MainWindow类,它是基于PySide6的QtWidgets中的QMainWindow类。这个窗口将用于显示检测后的图像。我们还定义了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)主程序流程
在主函数的实现中,我们首先创建一个Qt应用程序实例和主窗口实例。然后,我们从指定路径加载图像,并进行大小调整和预处理。接着,模型对预处理后的图像进行预测,并计算推理时间。
if __name__ == '__main__': # 如果当前模块是主模块
app = QtWidgets.QApplication(sys.argv) # 创建QApplication对象
window = MainWindow() # 创建MainWindow对象
img_path = abs_path("test_media/ParkingSpacesv2_SIXU_A_00320.jpg") # 定义图像文件的路径
image = cv_imread(img_path) # 使用cv_imread函数读取图像
image = cv2.resize(image, (640, 640)) # 将图像大小调整为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: # 遍历检测信息
# 获取类别名称、边界框、置信度和类别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]) # 在图像上绘制边界框和标签
window.dispImage(window.label, image) # 在窗口的label上显示图像
# 显示窗口
window.show()
# 进入 Qt 应用程序的主循环
sys.exit(app.exec())
在最后一部分,我们检查预测结果,并对每个检测到的对象绘制边界框和标签。这些检测框和标签将直接在主窗口中的标签上显示。
5. 停车位检测系统实现
在构建我们的交互式停车位检测与识别系统时,我们追求的是一个整合了高性能目标检测算法与用户交互界面的解决方案。该系统旨在提供一种直观的方式,以实时监控和识别视频流中的多个目标,适用于安全监控、自动化监测以及互动媒体等场景。为了实现这一目标,系统设计采取了模块化的思路,将界面、媒体处理和深度学习模型紧密集成,以确保高效和灵活的操作。
5.1 系统设计思路
在我们的系统设计中,我们的设计理念是构建一个高效、直观且用户友好的界面,使用户能够无缝地与系统交互。整个系统被设计为一个紧密集成的框架,其中每个组件都旨在提升整体性能和用户体验。
(1)架构设计
在系统的架构设计中,我们采用了分层的方法来确保各个组件的独立性和模块化。这样的设计不仅有助于代码的维护和更新,而且使得系统各部分能够高效协同工作。
- 处理层(Processing Layer):处理层是整个系统的核心,它使用由YOLOv8Detector类实现的高精度预训练模型来执行图像中停车位的实时检测和识别任务。这一层的算法优化确保了检测过程的准确性和速度,以满足实时应用的需求。
- 界面层(UI Layer):界面层则是用户与系统互动的前端,我们通过精心设计的UI元素,如按钮、标签和图像显示框等,为用户提供了直观的操作方式。这个层面上,界面的布局和设计考虑了易用性和美观性,确保用户能够快速理解并使用系统,无需深入了解背后的技术细节。
- 控制层(Control Layer):控制层充当用户指令和系统响应之间的桥梁,它负责处理用户的输入,如按钮点击和键盘操作,并通过槽函数调用适当的处理逻辑。此外,控制层还管理着界面与处理层之间的数据流动,使用事件驱动的编程模型来响应用户交互,并将处理结果实时反馈到界面层,实现了一个响应迅速的用户体验。
通过这种三层架构设计,我们的停车位检测系统将高效的机器视觉技术与易于操作的用户界面相结合,旨在为用户提供一个无缝的交互体验。用户可以直观地观察检测结果,并可以通过简单的操作来控制系统,如开始和停止检测,查看历史检测结果等。在实际应用中,这样的设计思路能够大幅度提高用户的工作效率,同时也降低了操作错误的可能性,使得停车位检测变得更加便捷和准确。
(2)系统流程
在本博客中,我们将详细介绍一个高度交互式的停车位检测与识别系统的设计流程。该系统以其直观的操作界面和强大的后端计算能力,为用户提供了一个无缝的使用体验。我们的目标是让用户能够轻松操控高级的计算机视觉技术,并能够实时接收和分析来自不同输入源的数据。
-
当用户进入应用程序后,首先面临的是选择输入源的界面。我们的系统灵活设计,支持多种输入源,包括实时摄像头捕捉、视频流或者静态图像文件,以适应不同用户的需求。用户可以通过简洁明了的界面轻松选择或切换输入源,系统后台将自动处理与之相关的配置和加载过程,确保输入数据的无缝接入和处理。
-
选择好输入源后,系统进入连续帧处理流程,这是整个应用程序的核心部分。在预处理阶段,系统会对输入的每一帧图像进行诸如缩放、色彩空间转换等一系列操作,确保图像数据满足YOLOv8模型的输入标准。接下来,在检测与识别阶段,经过预处理的图像将被送入精确训练的YOLOv8模型中,模型负责识别图像中的空闲和占用的停车位,并给出具体的检测结果。
-
为了让用户可以实时地观察到检测的结果,我们设计了界面更新机制。随着检测数据的生成,系统界面将即时反映出新的检测框和识别信息,并且通过表格或图表的形式动态展示统计数据,让用户能够直观地理解当前停车场的状态。此外,系统还提供了丰富的交互操作,用户可以通过按钮进行如保存结果、访问系统信息等操作,通过下拉菜单进行检测结果的筛选和分析,这大大增强了用户使用系统的灵活性和深度。
-
最后,系统还考虑到了用户对于媒体播放控制的需求。无论是摄像头实时图像的捕捉、视频文件的播放还是图像文件的分析,用户都可以轻松控制媒体的播放状态,如开始、暂停或停止,这些功能的集成保证了用户对于整个检测过程的完全掌控。
总之,本系统的设计思路围绕着用户体验和操作效率展开,从直观的输入选择到实时的检测展示,再到灵活的用户交互,每一环节都经过精心设计,以确保用户在使用停车位检测系统时能够享受到顺畅、高效且功能强大的服务。
5.2 登录与账户管理
在今天这个信息化快速发展的时代,为了提供一个安全、个性化的用户体验,我们的停车位检测系统引入了全面的登录与账户管理功能。利用PySide6强大的GUI能力和SQLite的数据库支持,我们构建了一个用户友好的登录界面,不仅仅是为了验证身份,更是为了提供一个私人定制的操作环境。
当用户第一次使用系统时,会被引导完成账户的注册过程,创建一个属于自己的账户。用户信息将被安全地存储在SQLite数据库中,这其中包括了用户名、加密后的密码和个性化的头像等。用户可以随时更新自己的个人资料,包括修改密码和更换头像,确保账户信息的及时更新和个人隐私的保护。如果用户忘记了密码,系统还提供了密码重置的功能,保障了用户能够顺利地恢复访问权限。
进入系统后,用户将来到主界面,这里是停车位检测任务的操作中心。用户可以通过这个界面访问和管理自己的检测记录,包括历史检测结果的查询和管理。每个用户的检测结果都是私密的,并且与账户绑定,保证了数据的个人化和安全性。
系统不仅支持个人用户的操作,还为管理者提供了账户注销和管理的功能。管理者可以对用户账户进行管理,包括注销不活跃的账户,确保系统的高效运行和资源的合理分配。
通过这些丰富的账户管理功能,我们的停车位检测系统为用户提供了一个既安全又便捷的使用环境。无论是初次注册,还是日常的账户维护,用户都能在系统中得到一个流畅和愉快的体验。同时,这种设计还为用户提供了个性化的操作空间,使他们能够在一个安全的环境中管理和回顾自己的检测数据,从而更好地利用停车位检测系统,增强了用户对系统的粘性和满意度。下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1hi421d77E/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/mbd-ZZuZm55v
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZuZm55s
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuZm55q
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZuZm55r
在文件夹下的资源显示如下,下面的链接中也给出了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等模型。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的停车位检测和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
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. ↩︎
Redmon J, Farhadi A. YOLO9000: better, faster, stronger[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2017: 7263-7271. ↩︎
Bochkovskiy A, Wang C Y, Liao H Y M. Yolov4: Optimal speed and accuracy of object detection[J]. arXiv preprint arXiv:2004.10934, 2020. ↩︎
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. ↩︎
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. ↩︎
Terven J, Cordova-Esparza D. A comprehensive review of YOLO: From YOLOv1 to YOLOv8 and beyond[J]. arXiv preprint arXiv:2304.00501, 2023. ↩︎