基于YOLOV8结合LPRNet的复杂道路环境下车牌识别检测系统

  摘要: 本文尝试了利用深度学习技术开发一个先进的车牌检测系统,并附上了完整的实现代码。系统核心采用了强大的YOLOv8及LPRNet算法,包括mAP和F1 Score等关键指标的对比分析。文章深入探讨了YOLOv8的基础理论,并提供了相关的Python代码以及用于训练的数据集,增加了基于PySide6的直观用户界面(UI)以提升用户体验。该检测系统能够高效识别和分类图像中的各类车牌支持从静态图片图片集视频文件以及实时摄像头输入进行检测。特色功能包括目标标注框、类别统计、可调节的置信度和IOU阈值、以及结果的可视化展示。本文目的是为深度学习初学者提供一份实用的指导和资源,文末提供了代码和数据集的下载链接,便于读者进一步探索和实践。

参考视频: 基于YOLOV8结合LPRNet的复杂道路环境下车牌识别检测系统_哔哩哔哩_bilibili

1、背景

  道路车牌检测识别是指利用计算机视觉和图像处理技术,对道路上行驶的车辆进行车牌的自动识别和检测。这项技术的背景源于交通管理、安全监控和智能交通系统的需求,通过自动识别车牌,可以实现交通违章监测、车辆管理、停车场管理等功能。

  随着计算机视觉和深度学习技术的发展,道路车牌检测识别技术取得了长足的进步。传统的基于特征工程的方法逐渐被深度学习方法所取代,深度学习模型如卷积神经网络(CNN)在车牌检测识别领域取得了显著的成果,大大提高了识别的准确性和鲁棒性。

  道路车牌检测识别技术的发展对社会具有重要意义。首先,它可以提高交通管理的效率,减少交通违章行为;其次,可以用于智能交通系统,提升交通流量管理和道路安全;此外,还可以应用于停车场管理、车辆管理等领域,提升管理效率和服务质量。因此,道路车牌检测识别技术在交通管理、安全监控和智能交通系统方面具有重要的应用前景。

  确实,随着深度学习技术的不断进步,车牌检测技术已经取得了显著的成果,并在智能交通系统、城市管理等领域展现出巨大的应用潜力。YOLO系列算法,以其出色的实时性和准确性,成为了车牌检测领域的重要工具。通过不断地引入新的网络结构、改进损失函数和优化特征提取机制,YOLO算法的性能得到了持续提升。YOLOv4和YOLOv5的推出,进一步证明了这一算法系列的强大和灵活性。除了YOLO系列,基于Transformer的模型和CNN与RNN的结合等创新方法也为车牌检测领域带来了新的思路。这些方法能够更好地处理复杂场景下的车牌检测问题,提高检测的准确性和鲁棒性。同时,研究者们也在努力解决实际应用中遇到的挑战,如车牌的遮挡、变形、不同光照条件下的检测问题等。通过引入注意力机制等先进技术,模型能够自动聚焦于图片中的关键部分,提高在复杂环境下的检测准确率。

  展望未来,车牌检测技术将继续向更高精度、更快速度和更强鲁棒性的方向发展。随着技术的不断完善和应用场景的逐渐拓展,车牌检测技术将在智能交通系统、无人驾驶、停车管理等领域发挥更加重要的作用。我们期待着这一领域未来的更多创新和突破。

  本文介绍了基于YOLOv8结合CRNN的道路车牌检测系统的设计与实现,涵盖了从任务定义、数据集处理、算法选择与优化,到用户界面设计、实验结果分析及系统部署等多个方面。通过全面的研究与实践,主要贡献可以概括为以下几点:

  数据集的详细处理方法: 详细介绍了道路车辆车牌数据集,包括数据收集、预处理、增强技术等,确保了模型训练的高效性和准确性。这一部分对于希望在该领域开展研究的学者和工程师具有重要的参考价值。

  先进算法的应用与对比: 文章详尽地介绍了YOLOv8深度学习模型在道路车牌检测系统中的应用,并对这些算法进行了深入的对比分析,展示了各自的优势和局限,为选择最适合的模型提供了科学依据。

  完整的资源分享: 文章提供了完整的数据集和代码资源下载链接,包括模型预测与训练的代码,这为研究人员复现实验结果、进行进一步研究或基于本系统进行扩展提供了便利。

2. 数据集简介

  在本研究中,详细介绍了用于道路车辆检测的全面数据集。车牌,俗称牌照,也指车辆号牌,是分别悬挂在车子前后的板材,通常使用的材质是铝、铁皮、塑料或纸质。车牌是对各车辆的编号与信息登记,其主要作用是通过车牌可以知道该车辆的所属地区,也可根据车牌查到该车辆的主人以及该车辆的登记信息。具体来说,车牌号共有七位数,第一位汉字是车辆登记的省级行政区的简称;第二位是大写字母,是车辆登记的户口所在地的地级行政区简称;第三到第五位为阿拉伯数字以及英文字母组成。除了普通的车牌,还有一些特殊的车牌,如警车、军车、外交车等,它们的车牌号码格式与普通机动车略有不同,通常以“使”、“领”、“WJ”等字母开头。另外,车牌的颜色也有其特定的含义。例如,蓝底白字车牌主要用于普通小型车,黄底黑字车牌则主要用于大型车辆、摩托车、驾校教练车等,黑底白字车牌主要用于涉外车辆,而白底车牌则主要用于政法部门警车、武警部队车辆、解放军军车等。

  系统检测主要分为两部分,第一部分车牌检测,主要进行道路上的车辆车牌定位,检测到车牌的位置及类型;主要从数据CCPD和CRPD数据集中选取并转换的 数据集格式转换为yolo格式,这里主要分为两类单行车牌和双行车牌;

# yolov8 plate-detect datset
# plate detect single+double
path: /home/test/projects/Projectpractice/车牌检测/yolov8-plate-master/datasets
train: images/train
val: images/valid
test: images/test

nc: 2
names:
  0: single
  1: double

  本文共筛选了16992张训练数据,2124张验证集,2125张测试集,用于数据集总共包含12了中文车牌,单行蓝牌 、单行黄牌、新能源车牌、白色警用车牌、教练车牌、武警车牌、双层黄牌、双层武警、使馆车牌、港澳牌车、双层农用车牌、民航车牌,用于车牌检测模型的训练;第二部分,主要进行检测到合车牌的识别,这里需要识别出车牌的号码,车牌颜色等,此处先进行车牌识别,

之后进行颜色识别,主要包含五种颜色black、blue、green、white、yellow,每一类大概有200张数据集图片,   综上所述,一个高质量且数量充足的数据集对于训练深度学习模型至关重要。在车牌检测领域,这样的数据集能够确保模型在各种环境条件下都能取得良好的性能,无论是晴天、雨天、白天还是夜晚,都能准确地检测和识别车牌。数据集的开发和分析不仅为车牌检测领域的研究提供了宝贵的资源,还为解决实际问题提供了深入的见解。通过分析数据集中的样本和模型的表现,研究人员可以更好地理解车牌检测的挑战和难点,进而改进和优化模型,提高检测的准确性和鲁棒性。随着技术的不断进步和数据的不断积累,我们有理由相信,未来的车牌检测系统将更加智能化和高效化,为智能交通、城市管理和公共安全等领域带来更大的便利和效益。

3.系统界面介绍

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

  (1)首先是主界面,

左边为各功能按钮,图像、视频、菜单栏伸缩按钮、保存、导入模型等功能按钮,中间包含各参数调整、输入输出展示区,检测进度区,结果输出区,右边包含车牌展示区、车牌颜色号码、位置等数据,右下为车牌在图片位置数据。

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

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

4. YOLOv8及LPRNet算法原理
4.1 YOLOV8算法原理

  YOLOv8 是 ultralytics 公司在 2023 年 1月 10 号开源的 YOLOv5 的下一个重大更新版本,目前支持图像分类、物体检测和实例分割任务,鉴于Yolov5的良好表现,Yolov8在还没有开源时就收到了用户的广泛关注YOLOv8是一种先进的深度学习模型,专为实现高效准确的目标检测而设计。其核心思想是将目标检测任务视为一个回归问题,通过单一的前向传播过程直接预测出图像中物体的类别和位置。

yolov8的整体架构如下:

  YOLOv8继承了YOLO系列算法的设计,优化并改进了网络结构,使其在速度和准确率之间达到更好的平衡。它采用了一个深度卷积神经网络作为其基础架构,通常以类似于Darknet-53的网络作为骨干,这种网络深度和宽度的平衡设计使得模型能够捕捉到丰富的特征信息,同时保持了较快的处理速度。

YOLOV8主要优点有如下:

- 用户友好的API
- 可以同时实现分类、检测、分割和姿态估计任务
- 速度更快、准确率更高
- 全新的结构
- 新的损失函数
- Anchor free

主要改动:

Backbone: 第一层卷积由原本的 6×6 卷积改为 3×3 卷积;参考 YOLOv7 ELAN 设计思想将 C3 模块换成了 C2f 模块,并配合调整了模块的深度。

Neck: 移除了 1×1 卷积的降通道层;同时也将原本的 C3 模块换成了 C2f 模块。

Head: 这部分改动较大,换成了解耦头结构,将分类任务和回归任务解耦;同时也将 Anchor-Based 换成了 Anchor-Free

Loss:使用 BCE Loss 作为分类损失;使用 DFL Loss + CIOU Loss 作为回归损失。

样本匹配策略: 采用了 Task-Aligned Assigner 样本分配策略。

训练策略: 新增加了最后 10 轮关闭 Mosaic 数据增强操作,该操作可以有效的提升精度

  YOLOv8的网络结构通常包括几个关键部分:首先是输入预处理,它将输入图像统一调整至固定的尺寸(例如416x416像素),以保证网络输入的一致性。随后,图像通过多层卷积网络,这一过程中会使用到多种类型的卷积层,包括标准的卷积层、残差连接以及BottleNeck层。这些层次的设计旨在提取图像中的特征,为后续的目标检测任务奠定基础。

  在特征提取过程中,YOLOv8通过使用批量归一化(Batch Normalization, BN)和CBL(Convolution, Batch normalization, Leaky ReLU)模块来加速训练过程并提高模型的稳定性。BN层可以减少内部协变量偏移,提高模型训练过程的稳定性和泛化能力。CBL模块则是YOLOv8网络中重复使用的基本构建块,通过这种模块化的设计,YOLOv8能够以较小的计算成本提取深层次的特征信息。

  YOLOv8的另一个显著特点是它的预测方式。它将图像分割为一个个网格,并在每个网格中预测多个边界框及其对应的置信度和类别概率。这种设计使得YOLOv8能够在图像中的多个位置同时预测多个目标,大幅提高了检测的效率。为了减少重复检测和提高检测准确性,YOLOv8还采用了非极大值抑制(Non-maximum Suppression, NMS)的技术,通过此技术可以筛选出最佳的边界框,并抑制那些重叠较多且置信度较低的边界框。

  总之,YOLOv8通过其创新的网络结构和预测机制,为实时目标检测任务提供了一种既快速又准确的解决方案。它的设计理念和技术细节共同确保了在保持高速处理的同时,也能够准确地识别出图像中的各种目标。这一系列的技术进步使得YOLOv8在目标检测领域中占据了领先地位,并被广泛应用于各种实际场景中。

4.1 代码简介

  在训练阶段,我们使用了预训练模型作为初始模型进行训练,然后通过多次迭代优化网络参数,以达到更好的检测性能。在训练过程中,我们采用了学习率衰减和数据增强等技术,以增强模型的泛化能力和鲁棒性。一个简单的单卡模型训练命令如下。

Device is determined automatically. If a GPU is available then it will be used, otherwise training will start on CPU.

# Build a new model from YAML and start training from scratch
yolo detect train data=coco128.yaml model=yolov8n.yaml epochs=100 imgsz=640
# Start training from a pretrained *.pt model
yolo detect train data=coco128.yaml model=yolov8n.pt epochs=100 imgsz=640
# Build a new model from YAML, transfer pretrained weights to it and start training
yolo detect train data=coco128.yaml model=yolov8n.yaml pretrained=yolov8n.pt epochs=100 imgsz=640

To train with 2 GPUs, CUDA devices 0 and 1 use the following commands. Expand to additional GPUs as required.

# Start training from a pretrained *.pt model using GPUs 0 and 1
yolo detect train data=coco128.yaml model=yolov8n.pt epochs=100 imgsz=640 device=0,1

训练时可指定更多的参数,如下:

ArgumentDefaultDescription
modelNone模型或者模型配置文件
dataNone数据集配置文件
epochs100训练的轮次
patience100准确率为提升停止的轮次
batch16训练的批次大小
imgsz640图像的尺寸
saveTrue是否需要保存训练的结果与模型
deviceNone训练设备
workers8多线程数据集加载
projectNone项目名称
exist_okFalse是否覆盖现有试验
pretrainedTrue是否使用预训练模型
optimizer'auto'优化器选择
verboseFalse是否详细输出
seed0种子数
deterministicTrue是否启动确定性模式
rectFalse单类别模型训练
cos_lrFalse是否使用余弦学习率调度器
resumeFalse是否从最近的训练断掉权重继续训练
ampTrue是否开启混合精度训练

  本文中我们将深入探讨如何通过Python脚本使用YOLOv8算法与PySide6库来构建一个多目标检测和跟踪的图形用户界面(GUI)应用。这段代码展示了从图像读取、模型加载、预测执行到结果展示整个流程的实现。

  首先,我们引入了必要的Python模块,包括random、sys、time以及图像处理和GUI设计相关的库。通过这些库,我们可以处理图像数据、创建窗口界面,并接受用户输入。代码首先设置QF_Config以关闭冗余输出,保持GUI输出的整洁。

# 界面入口
import sys
import os
import logging
# 禁止标准输出
sys.stdout = open(os.devnull, 'w')
logging.disable(logging.CRITICAL)  # 禁用所有级别的日志
from PySide6.QtGui import QIcon
from PySide6.QtWidgets import QApplication
from utils import glo

from yoloshow import *

  我们定义了一个MainWindow类,它继承自QMainWindow,用于创建主窗口。在窗口中,我们添加了一个标签(QLabel),它将用来展示目标检测后的图像。

# 多套一个类 为了实现MouseLabel方法
class MyWindow(YOLOshow):
    # 定义关闭信号
    closed = Signal()
    def __init__(self):
        super(MyWindow, self).__init__()
        self.center()
        # --- 拖动窗口 改变窗口大小 --- #

            event.ignore()
        else:
            self.setWindowOpacity(1.0)
            self.closed.emit()

  在代码的核心部分,我们首先记录了预测开始的时间,调用模型的predict函数进行预测,并记录结束时间,以计算整个推理过程所需时间。使用postprocess函数对检测结果进行后处理,然后遍历每个检测到的对象信息,包括类别名称、边界框、置信度和类别ID。这些信息将用来在图像上绘制代表检测对象的矩形框,并显示类别和置信度。最后,我们在GUI的标签上显示处理后的图像,并启动Qt应用程序的主循环。通过这样的实现,用户可以直观地看到每个检测对象,以及模型预测的准确性和效率。

4.2 LPRNet网络

  LPRNet是一种非常高效的神经网络,它只需要0.34 GFLops就可以进行一次前向传播。

  此外,模型在运行时在保证实时性的同时,准确率也有保证。面对中文车牌,LPRNet可进行端到端的训练。LPRNet的优点有LPRNet不需要字符预先分割,车牌识别的准确率高、算法实时性强、支持可变长字符车牌识别。

  对于字符差异比较大的各国不同车牌均能够端到端进行训练, LPRNet是第一个没使用RNN的实时轻量级算法,能够在包括嵌入式设备在内的各式设备上运行,LPRNet在实际交通监控视频中的应用表明,该算法在视角和摄像畸变、光照条件恶劣、视角变化等复杂的情况下仍表现出很好的识别效果。

  网络特点/优点:

  (1)不需要对字符进行预分割,是一个端到端的轻量化字符识别模型,速度快,精度还不错;这里主要是因为仿照squeezenet和inception的思想设计了一个轻量化的卷积模块。

  (2)仿照的还是经典的CRNN+CTC的思路,不过LPRNet首次将RNN删除了,整个网络只有CNN+CTC Loss。但是也不是说不要上下文信息,只是舍弃了BiLSTM那样的RNN提取上下文,而是在backbone的末尾使用了一个13x1的卷积模块提取序列方向(w)的上下文信息。而且在backbone外还额外使用一个全连接层进行全局上下文特征提取,提取之后再和backbone进行concat特征融合,再输入head。

  (3)损失使用的CTC Loss、推理应用了贪心算法,搜索取每个位置上类概率的最大值。

LPRNet的整个网络可以概括如下:可选的STN定位网络、轻量级的CNN骨干网络、每个位置的字符分类头、用于序列解码的字符分类概率、后过滤处理过程。

5. 系统实现

  在构建交互式道路车牌检测系统设计中,我们的核心目标是开发一个既直观又易于操作的用户界面,它能够实时显示多目标检测的结果。为了达到这一目标,采取了模块化的设计思路,整合界面、媒体处理和深度学习模型,实现了一个既高效又灵活的系统。

5.1 设计思路

  在这一系统中,我们设计了MainWindow类作为架构的核心。这个类不仅是用户交互的主体,还起到了将处理逻辑和界面逻辑紧密联系起来的桥梁作用。通过精心设计的界面,用户能够轻松地管理和观察到从视频流中检测和跟踪的对象。此外,通过实时更新的视觉元素,比如标签和图像框,用户可以直观地看到模型的检测结果。

  MainWindow类的设计巧妙地融合了处理层、界面层和控制层,使得整个系统既有良好的用户体验,又保持了强大的功能性:

  • 处理层是系统的智能核心,利用先进的YOLOv8模型,它负责处理输入的视频流,并进行对象检测与跟踪。这层不仅需要高效地执行深度学习模型的推理,还要对检测到的对象信息进行实时更新和管理。

  • 界面层是与用户直接交互的前端,通过PySide6构建的GUI元素,提供了一个清晰、响应迅速的界面。用户可以通过这个界面实时查看检测结果,以及各种统计信息和系统状态。

  • 控制层承担着指挥和协调的角色,它通过连接处理层的逻辑和界面层的表现,将用户的操作转化为系统的响应。例如,用户的一次点击操作可能会触发一个槽函数,该函数会告诉模型开始处理下一帧视频或停止当前任务。

  在此架构下,各层之间通过信号和槽机制进行高效通信。当处理层完成一帧的检测时,会发出一个信号,界面层的相应部件会捕捉这个信号,并更新显示的内容,如图像框中的对象位置和标签。这种机制使得我们的系统能够流畅地在用户操作和复杂的后端处理之间过渡,确保用户获得连贯和实时的体验。

  通过这样的设计,我们不仅使得系统易于使用和扩展,而且还确保了它能够高效地处理复杂的多目标检测任务,并在动态环境下提供稳定的性能。这种架构设计使得我们的系统不仅适用于研究和学术领域,也能够满足应用的需要。

下载链接

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

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

基于YOLOV8结合LPRNet的复杂道路环境下车牌识别检测系统_哔哩哔哩_bilibili

6.结束

  本文详细介绍了一个基于YOLOv8及LPRNet模型的道路车牌检测系统。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的多目标检测计数与跟踪和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。

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

  非常感谢大家的支持!支出需要改进的地方,以便后续更改,共同追求更完美、更严谨的知识分享!

可订阅微信公众号获取相关内容

微信公众号: AI算法爱好者角落

知乎: https://zhuanlan.zhihu.com/p/709108729

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值