基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的车牌检测系统(Python+PySide6界面+训练代码)
摘要:本篇博客详细介绍了如何利用深度学习技术开发一个先进的车牌检测系统,并附上了完整的实现代码。系统核心采用了强大的YOLOv8算法,并对前代版本如YOLOv7、YOLOv6、YOLOv5进行了详尽的性能评估,包括mAP和F1 Score等关键指标的对比分析。文章深入探讨了YOLOv8的基础理论,并提供了相关的Python代码以及用于训练的数据集,增加了基于PySide6的直观用户界面(UI)以提升用户体验。
该检测系统能够高效识别和分类图像中的各类车牌,支持从静态图片、图片集、视频文件以及实时摄像头输入进行检测。特色功能包括热力图分析、目标标注框、类别统计、可调节的置信度和IOU阈值、以及结果的可视化展示。系统还整合了一个基于SQLite数据库的用户登录注册界面,使用户能够轻松切换不同的检测模型和自定义UI界面。本文目的是为深度学习初学者提供一份实用的指导和资源,文末提供了代码和数据集的下载链接,便于读者进一步探索和实践。本文结构如下:
演示与介绍视频:https://www.bilibili.com/video/BV1dD42177fi/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/ZZuak5Zp
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZuakp9q
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuakp9r
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZuakp9s
前言
在当今社会,随着机动车辆数量的激增,智能交通系统的建设和发展成为了城市管理的重要组成部分。车牌检测系统作为智能交通系统中的关键技术之一,它能够自动识别和获取行驶车辆的车牌信息,对于交通管理、城市安全、停车场自动化管理等领域具有极其重要的应用价值。例如,通过车牌识别技术可以实现对违章车辆的自动抓拍和识别,极大提高了交通违规的处理效率;在停车场管理系统中,车牌检测技术可以实现无人值守的车辆入出管理,提高车辆流动效率,减少人力成本。此外,车牌信息还可以作为城市交通流量分析、车辆追踪等智能应用的重要数据来源。
YOLO算法的一大优势在于其单次前向传播就能完成目标检测的能力,这对于需要实时处理的车牌检测系统尤为重要。最新版本的YOLO算法通过引入更深更复杂的网络结构、改进的损失函数和更精细的特征提取机制,进一步提升了检测的精度和速度。例如,YOLOv4通过引入CSPDarknet53作为骨干网络,使用了Mish激活函数,以及采用了更多的数据增强技术,显著提高了检测性能[1]。而YOLOv5则在此基础上进一步优化了模型结构和训练流程,使得模型在保持高精度的同时,运行速度更快[2]。
除了YOLO系列,还有其他一些基于深度学习的算法在车牌检测领域也显示出了优异的性能。例如,基于Transformer的模型,利用其强大的全局依赖建模能力,能够更好地处理复杂场景下的车牌检测问题[3]。另外,一些研究通过结合卷积神经网络(CNN)和循环神经网络(RNN)的方法,来更好地处理车牌中的序列信息,进一步提升了车牌识别的准确率[4]。
当前研究不仅关注于算法的性能提升,还致力于解决在实际应用中遇到的挑战,如车牌的遮挡、变形、不同光照条件下的检测问题等。一些研究通过引入注意力机制,使模型能够自动聚焦于图片中的关键部分,从而在复杂环境下也能保持较高的检测准确率[5]。
综上所述,车牌检测技术正处于快速发展之中,基于深度学习的算法,尤其是YOLO系列和其他创新算法,正在不断地推动这一领域的进步。随着技术的不断完善和应用场景的逐渐拓展,未来车牌检测技术将在智能交通系统、城市管理等领域发挥更加重要的作用。
本博客的贡献在于综合运用了最新的深度学习技术,特别是采用了先进的YOLOv8算法,来构建一个高效且用户友好的车牌检测系统。以下是本文的主要贡献点,彰显了我们工作的创新性和实用价值:
- 采用最先进的YOLOv8算法进行车牌检测:本文不仅介绍了YOLOv8算法的应用于车牌检测的全过程,还详细比较了YOLOv7、YOLOv6、YOLOv5等先前版本在车牌检测任务上的性能,展示了YOLOv8在检测速度和准确性方面的显著优势。这为车牌检测领域的研究者和实践者提供了一种更高效、更准确的解决方案。
- 利用PySide6实现车牌检测系统的用户界面:通过采用Python的PySide6库,本文展示了如何开发一个直观、易用的车牌检测系统界面。该界面不仅提升了用户体验,还便于非技术用户快速高效地进行车牌检测,从而推动了YOLOv8算法的广泛应用。
- 集成登录管理功能,提升系统安全性:本系统设计了用户登录管理功能,确保了使用的安全性和个性化。这一设计思路为未来系统功能的扩展提供了基础,同时保障用户数据的安全。
- 对YOLOv8模型进行深入研究与评估:本文不仅应用了YOLOv8算法于车牌检测,还对算法性能进行了全面的分析和评估,包括精确度、召回率以及在不同环境下的表现。这些研究成果不仅增进了我们对YOLOv8算法性能的理解,也为未来该算法的优化提供了宝贵的参考。
- 提供完整的数据集和代码资源包:为了让读者能够更好地复现研究结果,并在此基础上进行进一步的研究和开发,本文提供了一套完整的数据集和实现车牌检测系统的代码资源包。这一资源分享极大地降低了其他研究者和开发者的入门门槛,促进了技术的传播和应用。
1.数据集介绍
在我们的研究中,我们细致构建了一个全面的车牌检测数据集,该数据集是训练和评估我们的目标检测系统的基石。这一数据集包括5555张高质量的图像,其中包括5102张用于训练的图像,432张用于验证的图像,以及21张用于测试的图像。这样丰富的图像库不仅涵盖了多样的真实世界场景,从繁忙的都市街道到偏远的停车场,也确保了车牌检测系统在不同环境下的适应性和鲁棒性。
我们的数据集经过了精心的预处理和增强,以优化模型的学习过程。所有的图像都进行了尺寸归一化和像素值标准化,确保输入到模型中的数据格式是统一的。此外,为了提高模型对不同环境条件的泛化能力,我们还应用了一系列的数据增强技术,例如随机裁剪、旋转、尺寸缩放和色彩变换,这些技术有效地增加了数据集的多样性,并模拟了实际应用中可能遇到的各种变形和光照变化。
进一步分析数据集的分布,我们发现车牌标注主要集中在图像的中心区域。这一发现提示我们在设计目标检测算法时,可能需要对图像中心区域给予更多的关注。同时,我们还注意到,虽然车牌类别的实例数量占据了数据集的绝大多数,但我们也关注到其他交通工具类别,如汽车、摩托车和卡车,尽管它们的实例数量较少。这样的类别分布为我们训练模型提供了一个挑战,即如何确保模型在车牌检测的同时,也能对这些辅助类别进行合理的识别和检测。
此外,我们的分析还包括了对边界框尺寸分布的评估,发现车牌的宽度和高度在数据集中表现出一定的集中趋势,这对于确定模型中的锚框尺寸设置具有指导意义。宽度集中在较小的区间,而高度分布较广,反映了实际场景中车牌尺寸的多样性。
对于图像中的每个车牌,我们还提供了精确的边界框标注,这些标注信息对于训练高精度的目标检测算法至关重要。每张图像都被标记为包含“车牌”,并为辅助类别包括“汽车”,“摩托车”,和“卡车”,确保了算法能够在复杂的交通场景中准确识别和定位车牌。博主使用的类别代码如下:
Chinese_name = {
"License_Plate": "车牌", "cars": "汽车", "motorcyle": "摩托车", "truck": "卡车"
}
综上所述,我们的数据集不仅在数量上满足深度学习训练的需求,而且在质量上也符合严格的标准。通过这个数据集,我们能够训练出适应各种环境条件的车牌检测模型,并确保在实际应用中取得良好的性能。这一数据集的开发和分析,将为车牌检测领域的研究和实践提供宝贵的资源和见解。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行车牌检测的图片或视频,或者启动摄像头进行实时检测。在进行车牌检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
3. YOLOv8算法原理
Ultralytics公司于2023年初发布YOLOv8模型,相较于2020年发布的YOLOv5模型, YOLOv8模型将C3模块(CSP Bottleneck with 3 convolutions)改进成C2f模块(CSP Bottleneck with 2 convolutions)。图中CBS(Convolutions Bn SiLU)模块由基础卷积(Conv)、批量归一化(BN)和激活函数(SiLU)组成。C2f模块采用了多分支流设计,为模型提供了更丰富的梯度信息,强化了模型的特征提取能力,提高网络的学习效率。[1:1]
YOLOv8模型仍然采用anchor free方法,降低检测过程中正样本框数量,并提升处理速度。此外,模型结合了GFL(generalized focal loss)损失计算策略,将Detect模块由YOLOv5中的耦合头改进成解耦头,如图所示。解耦头将分类任务和回归任务分开进行,避免了两个任务之间的干扰,理论上能够提高模型的训练效率。传统的YOLO系列算法的耦合头输出三类信息,而YOLOv8模型中的解耦头仅输出分类和回归信息。分类信息的输出通道数等于类别数,输出的内容综合了分类信息和置信度信息。回归信息的输出通道数等于,输出内容为回归框在最大回归范围上的概率分布。[1:2]
YOLOv8采用了动态标签匹配策略,增加了正样本框选择的灵活度。在损失计算方面,YOLOv8除了计算分类和回归损失外,还引入了DFL(distribution focal loss)损失。DFL损失利用交叉熵的思想,通过将预测框回归至标签框的上下整数范围内,优化模型训练。在此基础上对YOLOv8模型进行改进,将C2f模块改进成GhostC2f模块,并引入空间注意力机制,优化模型的回归预测范围,修改Neck部分第三个Concat部分的输入来源。[1:3]
4. 代码简介
在本节中,我们将详细介绍如何使用YOLOv8进行车牌检测与识别的代码实现。代码主要分为两部分:模型预测和模型训练。
4.1 模型预测
在模型预测部分,首先导入了OpenCV库和YOLO模型。OpenCV库是一个开源的计算机视觉和机器学习软件库,包含了众多的视觉处理函数,使用它来读取和处理图像。YOLO模型则是要用到的目标检测模型。
import cv2
from ultralytics import YOLO
接着,加载自行训练好的YOLO模型。这个模型是在大量的图像上预训练得到的,可以直接用于目标检测任务。
model.load_model(abs_path("weights/ship-yolov8n.pt", path_type="current"))
然后,使用OpenCV读取了一个图像文件,这个图像文件作为要进行目标检测的图像输入。
img_path = abs_path("test_media/t3.jpg")
image = cv_imread(img_path)
在读取了图像文件之后,就可以使用加载的模型对图像进行预测了。下图为预测结果。
pred, superimposed_img = model.predict(pre_img)
4.2 模型训练
这里我们开始训练和测试自己的数据集,在cmd终端或pycharm中运行run_train_model.py进行训练,以下是训练过程中的结果截图。YOLOv8的损失函数是其性能的关键部分,它指导模型学习如何准确地检测和分类对象。
首先,我们的代码导入了必要的Python库,如os和yaml,以及从ultralytics库导入的YOLO类。这些库和类是实现我们目标检测任务的基础。os库允许我们与操作系统交互,而yaml库是用来处理YAML文件,这种文件格式通常用于配置文件,因为它易于读写且结构清晰。
import os
import yaml
from ultralytics import YOLO # 导入YOLO模型
from QtFusion.path import abs_path
接下来,我们确保只有在这段代码作为主程序运行时才执行下面的代码。在准备训练模型之前,我们需要指定数据集的配置文件路径。我们使用自定义函数abs_path来找到vehicle.yaml文件的绝对路径,这个文件包含了训练数据的细节,如类别标签和图像路径等。然后,为了确保路径的兼容性,我们将路径转换为UNIX风格,这是因为不同的操作系统可能使用不同的路径分隔符。
if __name__ == '__main__': # 确保该模块被直接运行时才执行以下代码
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)
# 读取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
data_name = "VehicleType"
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='cpu', # 指定使用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='cpu', # 指定使用CPU进行训练
workers=workers, # 指定使用2个工作进程加载数据
imgsz=640, # 指定输入图像的大小为640x640
epochs=100, # 指定训练100个epoch
batch=batch, # 指定每个批次的大小为8
name='train_v8_' + data_name # 指定训练任务的名称
)
在读取YAML配置文件之后,我们可能需要对其内容进行修改。在这个例子中,我们将配置文件中的path键的值更新为数据集的目录路径。这确保了无论数据集位于何处,YOLO模型都能正确地找到它。最后,我们加载预训练的YOLOv8模型并开始训练过程。我们传递了所有必要的参数到train函数,包括数据集配置、设备类型、工作进程数、图像尺寸、训练周期和批次大小。name参数用于标识训练过程,便于后续分析和比较。
在深度学习中,我们通常通过损失函数下降的曲线来观察模型训练的情况。从图中可以看出,我们注意到训练期间的box_loss(边界框损失),cls_loss(分类损失),和obj_loss(目标损失)都表现出了稳定下降的趋势,这表明模型在学习过程中逐步改善了对目标的定位、识别类别和置信度预测的能力。特别是在训练初期,损失函数值急剧下降,这通常表明模型能够快速从数据中学习。随着迭代次数的增加,损失的下降速度放缓,这是因为模型开始收敛到一个相对稳定的状态
在验证集上,我们同样观察到了box_loss, cls_loss, 和obj_loss的下降趋势,这进一步验证了模型在未见数据上的泛化能力。值得一提的是,验证损失的曲线比训练损失更为平滑,这可能是由于验证数据的分布更加稳定或是批量大小不同所致。
接下来,我们来看性能指标,包括精确度(Precision),召回率(Recall),以及平均精度(mAP)指标。精确度指标显示了模型在预测正类别时的准确性,而召回率则反映了模型识别出所有正类别实例的能力。在我们的分析中,精确度和召回率随着训练的进行呈现出波动上升的趋势,这表明模型在不断优化其预测的同时,也在尝试平衡误报和漏报之间的关系。这种波动可能是由于模型在不同阶段探索参数空间,以寻找最优的权重配置。
至于平均精度,我们可以看到mAP@0.5(预测框与真实框交叉超过50%视为正确的指标)和mAP@0.5-0.95(以0.5到0.95为阈值,步长为0.05计算平均精度的综合指标)随着训练周期增加而稳步上升。mAP@0.5的提升较为平稳,这显示了模型在较为宽松的交叉阈值下的性能增强。mAP@0.5-0.95的增长则更为显著,尤其在训练后期,这意味着模型对各种大小的车牌检测更为准确,即使在较严格的交叉阈值条件下。
值得注意的是,虽然性能指标随训练进程表现出上升趋势,但仍存在一定的波动。这种波动可能是由于训练过程中学习率的调整、训练数据的内在噪声,或者是模型在特定批次的数据上过拟合。然而,整体上模型的性能提升表明了训练过程是有效的,并且模型逐渐适应了车牌检测的任务。
在我们的车牌检测模型评估中,F1分数作为衡量精确度和召回率平衡的关键指标,为我们提供了模型性能的综合视图。F1分数是精确度和召回率的调和平均,其最高值为1,表示完美的精确度和召回率,而最低值为0,则表示两者中至少有一者性能极差。我们通过将F1分数与置信度阈值绘制在同一曲线图中,能够深入理解不同置信度阈值下模型性能的变化。
从F1-置信度曲线图中,我们观察到在置信度阈值大约为0.447时,所有类别的平均F1分数达到了峰值0.88,这表明模型在这一阈值下达到了精确度和召回率之间的最优平衡。这个结果对于实际应用中的阈值设置具有指导意义,因为它能够帮助我们在减少误检和遗漏检测之间找到平衡点。
具体来看各个类别,车牌检测的F1分数表现出色,曲线在大部分置信度区间内保持在较高水平,这反映了模型对车牌检测任务的良好适应性和准确性。相比之下,其他类别如汽车、摩托车和卡车的F1分数在不同置信度阈值下有较大的波动。摩托车类别的F1分数在低置信度阈值下有较大下降,这可能是由于模型在较低置信度时产生了较多的误检测。汽车和卡车的F1分数在高置信度区间下迅速下降,这可能意味着在高置信度阈值时,对这些类别的召回率下降较为显著。
综上所述,通过这些分析,我们得出结论:在置信度约为0.447时,我们的模型对所有类别达到了较高的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.868 | 0.945 | 0.848 | 0.91 |
F1-Score | 0.86 | 0.93 | 0.85 | 0.88 |
(3)实验结果分析:
mAP作为一个综合指标,反映了模型在不同置信度阈值下的平均精确度。在这项指标上,YOLOv8n以0.893的得分表现最为出色,这显示了其在检测精度上的细微优势。这种提升可能归因于YOLOv8n在网络架构上的改进,如更高效的特征提取和更精确的目标定位能力。YOLOv5nu紧随其后,展现出稳定的性能,这也许是由于其均衡的网络设计和适应多变环境能力的结果。而F1-Score作为精确度和召回率的调和平均,提供了对模型准确性的评价。
在我们的实验中,YOLOv6n在这两项指标上都表现出最优性能,其mAP和F1分数分别达到了0.945和0.93,显示出其在车牌检测任务上的出色能力。紧随其后的是YOLOv8n,mAP和F1分数分别为0.91和0.88,与YOLOv6n相比略低,但仍然表现出了很高的检测精度。YOLOv5nu和YOLOv7-tiny的表现相对落后,但也展示了竞争力的结果,YOLOv5nu的mAP为0.868,F1分数为0.86,而经过更正的YOLOv7-tiny的mAP和F1分数分别为0.848和0.85。尽管YOLOv7-tiny是一个轻量级模型,其性能与其他更复杂的模型相比仍具有竞争力。
通过将y轴的显示范围设置在0.84到1的区间,我们确保了即使在性能较为接近的情况下,各模型之间的差异也被清晰地凸显出来。这样的视觉优化使得我们能够更直观地比较不同模型的性能,为研究人员和实践者提供了明确的指导,帮助他们根据自己的需求选择合适的YOLO版本。
4.4 代码实现
在构建任何机器学习应用时,理论与实践的结合至关重要。今天,我们探讨了如何使用YOLOv8模型和PySide6框架创建一个实时的车牌检测系统。这个系统能够从摄像头捕获视频流,并使用深度学习模型识别和标注图像中的车牌。下面,我们将详细介绍这个系统的主要组件和代码实现。
(1)引入必要的库
首先,我们导入必要的库和模块,设置好处理图像和视频流所需的工具。例如,cv2模块是OpenCV库的核心,它提供了一系列功能强大的图像处理功能。我们还需要PySide6中的QtWidgets和QtCore模块来构建用户界面,让用户能够与我们的应用程序进行交互。
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类,用于物体检测
from datasets.VehicleLicense.label_name import Label_list
QF_Config.set_verbose(False)
上述代码段初始化了我们的应用程序所需的所有前提条件。我们通过random模块为每个检测类别生成随机颜色,以便在结果图像中以不同颜色区分不同的车牌类型。
(2)设置主窗口
为了展示检测到的车牌,我们创建了一个名为MainWindow的图形用户界面(GUI)。这个窗口使用PySide6库构建,包括一个QLabel控件,用于显示处理后的视频帧。如果用户按下"Q"键,程序会捕获此键盘事件并关闭窗口,这是通过重写keyPressEvent方法实现的。
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() # 关闭窗口
(3)图像帧处理
实时视频流的处理是通过MediaHandler类进行的。我们将其设置为以每秒30帧的速度从默认摄像头捕获视频。每捕获到一帧,就会调用frame_process函数,该函数首先调整帧的大小以适应GUI窗口,然后将其传递给YOLOv8模型进行预测。
def frame_process(image): # 定义frame_process函数,用于处理每一帧图像
image = cv2.resize(image, (850, 500)) # 调整图像的大小
pre_img = model.preprocess(image) # 对图像进行预处理
t1 = time.time() # 获取当前时间
pred, superimposed_img = 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控件上显示图像
(4)主程序部分
模型预测后,我们计算了预测时间,并打印出来,以便于监控系统的性能。如果模型在帧中检测到车牌,我们将使用drawRectBox函数在图像上绘制一个矩形框,并添加包含类名和置信度的标签。这个矩形框的颜色是通过get_cls_color函数获取的,该函数为每个类别分配了一个独特的颜色。
最后,我们通过dispImage方法将处理后的图像显示在MainWindow的QLabel控件上。整个系统是在Qt的主循环中运行的,这保证了用户界面的响应和视频流的连续处理。
cls_name = Label_list # 定义类名列表
model = YOLOv8Detector() # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/best-yolov8n.pt", path_type="current")) # 加载预训练的YOLOv8模型
colors = get_cls_color(model.names) # 获取类别颜色
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())
通过上述代码,我们构建了一个完整的系统,它结合了YOLOv8的强大检测能力和Qt的灵活GUI功能,提供了一个用户友好的实时车牌检测应用。这不仅展示了深度学习在实际应用中的潜力,也提供了一个有效的模板,供其他研究者和开发者开发自己的目标检测系统。
5. 车牌检测系统实现
在实现一款实时车牌检测与识别与识别系统时,我们遵循了一条清晰的系统设计思路,旨在构建一个高效、直观且用户友好的交互式平台。我们的系统设计以用户体验为核心,力求简化用户操作流程,同时确保检测功能的高效和准确。
5.1 系统设计思路
我们将深入介绍如何构建一个交互式的车牌检测系统。我们的系统设计旨在实现一个用户友好的界面,同时集成强大的媒体处理能力和先进的目标检测模型。为了达成这一目的,我们的设计思路是将界面设计、媒体处理以及模型预测的功能紧密结合在一起,以实现高效的系统运行。
架构设计
为了让用户能够轻松监控和管理车牌穿戴情况,我们设计了一个MainWindow类,这个类不仅作为用户交互的窗口,同时也是多个后端处理器和模型的协调者。这一层次的设计保证了用户界面的响应性,以及后端处理的高性能。
- 处理层(Processing Layer):处理层是系统的核心,由YOLOv8Detector类构成,这是一个利用深度学习进行物体检测的强大模型。这个类封装了从图像预处理、物体检测到后处理的全部流程,确保了高性能和高准确性的检测结果。我们特别关注在低延迟的情况下提供高精度的车牌识别功能,因此选择了YOLOv8,它是目前最先进的目标检测算法之一。
- 界面层(UI Layer):界面层则直接与用户互动,我们设计了Ui_MainWindow类,该类通过PySide6库构建了一个整洁且功能丰富的图形用户界面。界面中不仅包括了视频显示窗口,还设计有按钮和标签,允许用户实时地与检测系统互动,如开始和停止检测、调整设置等。界面的直观性使得即使是没有技术背景的用户也能轻松使用系统。
- 控制层(Control Layer):控制层承担着将用户指令转化为系统响应的任务,它由MainWindow类中的方法和槽函数组成。通过Qt的信号和槽机制,控制层能够响应界面层的用户操作,控制处理层的工作流程。例如,当用户点击界面上的按钮时,控制层会指挥处理层启动或停止视频流的处理。这种设计模式不仅保证了代码的清晰和可维护性,也为未来的功能扩展提供了便利。
综合这三层的设计,我们的车牌检测系统不仅技术上可靠,而且用户体验上友好。通过这样的系统设计思路,我们确保了系统的高效性和易用性,使其不仅适用于技术人员进行复杂任务的处理,也适用于一般用户进行日常的车牌识别需求。这样的设计使得系统可以广泛应用于各种实际场景,如停车场管理、交通监控和安全检查等。
系统流程
在开发面向工业安全的实时监控系统时,我们的目标是构建一个高效、直观且用户友好的应用。我们的车牌检测系统就是在这样的设计理念指导下创建的,它整合了最新的YOLOv8目标检测技术,能够实时处理和分析图像数据,确保工作场所的安全。以下是车牌检测系统的工作流程:
- 当用户启动应用程序时,MainWindow类的实例将被创建。这是整个系统的驱动力,它不仅初始化了应用的图形用户界面,还设定了一系列参数,为用户提供了一个交互的操作平台。界面的设计考虑到了易用性和功能性,允许用户无缝进行操作,无论是专业人士还是一般用户。
- 在用户界面中,提供了选择输入源的选项,用户可以轻松选择摄像头实时图像、视频文件或静态图片作为输入。这提供了灵活性,使得系统可以广泛应用于不同的使用场景和需求。一旦输入源被选定,系统将调用MediaHandler类以及其他必要的方法来配置摄像头、读取视频文件或加载图像文件。
- 随着输入源的准备就绪,系统进入了一个连续的帧处理循环,其中包含了几个关键阶段:
预处理阶段:在这一阶段,系统对每帧图像进行预处理,以符合YOLOv8模型的输入规范。预处理包括调整图像尺寸、转换色彩空间以及归一化等操作,这些步骤对于模型的性能至关重要。
检测与识别阶段:预处理后的图像被送入YOLOv8模型进行车牌检测。模型凭借其深度学习能力,准确地识别图像中的车牌并标注位置。
界面更新阶段:随着检测结果的生成,用户界面将实时更新,展示包含类别标签的检测框。此外,界面上还会显示检测统计数据,使用户可以直观地看到系统的性能和检测结果。
用户交互是系统设计中的关键部分。用户可以通过界面按钮进行多种操作,例如保存检测结果、访问系统信息,以及通过筛选器来细化检测结果的查看。系统也提供了对媒体播放状态的控制,包括启动或停止视频捕获和播放,以及暂停或继续图像分析。
总的来说,这个交互式车牌检测系统展示了如何将复杂的深度学习技术与用户友好的界面设计相结合,提供了一个强大而直观的工具,不仅适用于监控和安全领域,也适用于任何需要车牌识别的场合。通过这种设计,我们期望推动目标检测技术的广泛应用,并不断提升系统的性能和用户体验。
5.2 登录与账户管理
在开发车牌检测系统的过程中,我们不仅关注于算法的准确性和实时处理能力,也十分重视用户体验和数据管理。为了满足用户在实时目标检测场景下的个性化需求,我们在系统中加入了完善的登录与账户管理功能。
当用户启动应用程序时,首先呈现的是一个精心设计的登录界面。这个界面是用户与系统交互的第一站,通过简洁明了的UI设计,用户可以轻松注册新账户或登录到现有账户。注册过程包括设置用户名、密码以及上传头像,而登录过程则要求用户输入正确的用户名和密码组合。一旦验证通过,用户将进入主操作界面,开始进行车牌检测。
这个登录系统的背后是一个安全的数据库,它存储了所有用户的账户信息。我们采用了SQLite,这是一个轻量级的数据库系统,它可以无缝集成到应用程序中,无需复杂的配置或维护工作。数据库不仅保存了用户的基本信息,还保存了用户的操作历史和个性化设置,如检测偏好和界面配置。
在用户成功登录后,系统的主界面将展示实时视频流,并提供多种功能选项。用户可以选择不同的输入源,包括实时摄像头捕获、视频文件播放或静态图片分析。系统后端会根据所选的输入源配置相应的媒体处理器,保证视频或图像数据的流畅处理
随着数据的输入和处理,用户将在主界面上实时看到检测结果。系统利用YOLOv8模型实时检测车牌,并在界面上以边框和标签的形式标注出来。同时,检测的统计数据,如检测频率、类别分布等,也会以图表的形式呈现给用户。用户可以通过操作界面中的按钮和菜单来控制检测流程、保存结果和修改设置。
特别值得一提的是,我们的系统还提供了完整的账户管理功能。用户可以在登录界面修改密码、更新头像、注销账户或重新登录。这些功能不仅提高了系统的安全性,也增强了用户体验。通过这些个性化的服务,用户可以根据自己的需求定制检测设置,保存个人的检测记录,甚至将设置应用到不同的设备上。
总而言之,我们的系统不仅是一个强大的车牌检测工具,还是一个全面的用户体验平台。从后端的技术实现到前端的用户交互,我们的设计考虑到了用户的每一个需求。未来,我们将继续优化系统的功能,增加更多的用户定制选项,以满足更广泛的应用场景,使我们的车牌检测系统成为市场上最受欢迎的选择之一。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1dD42177fi/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/ZZuak5Zp
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZuakp9q
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuakp9r
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZuakp9s
在文件夹下的资源显示如下,下面的链接中也给出了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模型的车牌检测系统。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的车牌检测与识别和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
Bochkovskiy, A., Wang, C. Y., & Liao, H. Y. M. (2020). YOLOv4: Optimal Speed and Accuracy of Object Detection. arXiv preprint arXiv:2004.10934. ↩︎ ↩︎ ↩︎ ↩︎
Ultralytics. (2020). YOLOv5: State of the Art Object Detection at Real-time Speed. [Online] Available: https://github.com/ultralytics/yolov5 ↩︎
Dosovitskiy, A., Beyer, L., Kolesnikov, A., Weissenborn, D., Zhai, X., Unterthiner, T., ... & Uszkoreit, J. (2020). An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale. arXiv preprint arXiv:2010.11929. ↩︎
Shi, B., Bai, X., & Yao, C. (2017). An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition. IEEE Transactions on Pattern Analysis and Machine Intelligence, 39(11), 2298-2304. ↩︎
Wang, Q., Wu, B., Zhu, P., Li, P., Zuo, W., & Hu, Q. (2020). ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks. arXiv preprint arXiv:1910.03151. ↩︎