摘要:之前的中文车牌识别系统升级到v2.0版本,本文详细介绍使用深度学习实现的高效中文车牌识别系统完整代码,包括训练过程、原理介绍、模型对比、系统设计等部分。采用了最新的YOLOv8、YOLOv7、YOLOv6、YOLOv5目标检测算法进行车牌检测定位,并应用LPRNet识别车牌字符,另外支持车牌颜色识别。文中使用5555张车辆车牌图像训练,并评估对比了YOLOv8/v7/v6/v5几种算法,给出了mAP、F1 Score等指标结果;博客基于PySide6和SQLite数据库设计UI界面以及登录注册界面,使用YOLO+LPRNet实现车牌检测识别,能够识别图像、视频、实时视频流以及批量文件处理等多种功能,可点击按钮更换模型。本文结构如下:
@
目录YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/mbd-ZZ2Wmphx
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZ2WmZ9q
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZ2WmpZu
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZ2WmpZx
引言
在当代社会背景下,机动车的急速增长使得智能交通系统的构建和进步成为城市管理的关键要素。车牌识别系统,作为智能交通体系的核心技术之一,不仅极大地推进了交通管理的自动化与智能化,而且在增强道路安全、促进交通顺畅以及预防及减轻交通违规行为等多个方面发挥着至关重要的作用。伴随着计算机视觉和深度学习技术的迅猛发展,利用这些尖端技术进行高效精准的车牌识别成为了研究领域的焦点。
车牌识别技术跨越了图像处理、模式识别、机器学习等多个学科领域,且要求该系统在各种复杂多变的实际应用场景中都能保持高度的准确性和鲁棒性。近几年来,随着YOLO[1](You Only Look Once)算法及其后续迭代版本的推出和持续优化,车牌识别领域实现了显著的技术进步。特别是,YOLO算法以其快速且高准确度的特性,在实时目标识别,尤其是车牌识别的应用中,展现出了巨大的潜力和优势。
近年来,视觉Transformer(ViT)通过将自然语言处理领域的Transformer架构应用于图像识别任务,凭借其自注意力机制有效捕捉图像中的长距离依赖,尤其在处理复杂场景时表现出优异的性能。ViT超越了传统卷积神经网络(CNN)的局部感受野限制,为图像理解提供了全新视角,引领了图像识别技术的一大步进。除此之外,一些最新的视觉算法,如EfficientDet、Swin Transformer和ConvNeXt,也为车牌识别领域带来了新的突破。EfficientDet通过优化模型尺度与效率,提供了一种高效的目标检测框架。Swin Transformer利用可调整的窗口机制,将Transformer的强大能力引入到了密集预测任务中,显著提高了处理图像的效率和效果。ConvNeXt则是基于Transformer设计理念改进的卷积神经网络,它在保留CNN高效性的同时,融合了Transformer的优点,提升了模型的性能。
注意力机制的引入是深度学习领域近年来的又一重大进展,它使得模型能够集中处理输入数据中的关键信息,从而显著提高了模型的性能和泛化能力。在目标检测任务,尤其是在背景复杂或目标尺寸多变的情景下,注意力机制通过改善模型的识别和定位能力,为解决这一挑战提供了有效的手段。这些技术的结合和应用,不仅推动了车牌识别技术的发展,也为智能交通系统的完善提供了坚实的技术支撑。
LPRNet[2],全名为License Plate Recognition Network,是一种专门设计用于车牌识别的深度学习模型。它采用了一种端到端的训练方法,能够直接从原始图像中识别出车牌文本,无需进行传统的字符分割步骤。这种设计使得LPRNet在处理车牌识别任务时更加高效和准确,特别是在面对复杂背景或不同国家的车牌样式时。
LPRNet的架构主要基于卷积神经网络(CNN),它通过一系列的卷积层来提取图像的特征。与传统的车牌识别系统相比,LPRNet的一个显著优势是它的轻量化设计,这意味着即便是在计算资源有限的环境下,如嵌入式系统或移动设备,LPRNet也能够实现快速的车牌识别。此外,LPRNet还采用了连接时序分类(CTC)作为其损失函数,进一步优化了模型对于车牌字符序列的识别能力。LPRNet的另一个关键特点是其对于不同长度车牌的处理能力。由于它不依赖于字符分割,模型能够自适应不同长度的车牌,无论车牌上的字符数目多少,LPRNet都能够有效地识别出完整的车牌文本。这种灵活性使得LPRNet在全球范围内的不同类型车牌识别场景中都表现出了卓越的性能。
近年来,随着深度学习技术的不断进步,LPRNet也经历了多次迭代和优化。研究人员通过引入更先进的神经网络结构、优化训练策略以及增强数据预处理方法,不断提高LPRNet的识别准确率和效率。这些改进不仅加深了我们对车牌识别技术的理解,也推动了LPRNet在实际应用中的广泛部署,包括交通监控、停车场管理、车辆追踪等多个领域。
尽管技术取得了显著进步,车牌检测系统的研究与开发仍面临着多方面的技术挑战。其中包括如何在复杂环境下保持高准确率(如不同天气条件、不同角度和距离的车牌识别)、如何处理车牌样式多样性以及如何进一步提升系统的实时性等问题。此外,随着技术的进步,数据集的更新和扩充也成为了推动车牌检测技术发展的关键因素。新的数据集不仅覆盖了更多样的车牌类型和更复杂的场景,还在数据量和质量上都有了显著提高,为深度学习模型的训练和验证提供了宝贵的资源。
本篇博客在车牌检测和识别技术的研究与实践领域做出了显著贡献,具体体现在以下几个方面:
-
综合文献综述:我们提供了一个全面的文献综述,深入探讨了车牌检测系统的发展历程、现有技术的研究现状以及面临的挑战。这一部分不仅帮助读者建立了对车牌识别技术领域的整体理解,也为后续的技术选择和研究方向提供了理论基础。
-
LPRNet的应用与优化:文章详细介绍了如何利用LPRNet对车牌进行高效识别。通过对LPRNet架构的深入分析与优化,我们展示了如何在保持高准确率的同时,提升系统的处理速度和稳定性,这对于实时车牌识别系统的开发具有重要意义。
-
丰富的数据集使用:本研究使用了多个公开和自收集的数据集,涵盖了不同国家、不同类型的车牌样本。这些数据集的多样性和广泛性有效提升了模型的泛化能力,确保了系统在实际应用中的鲁棒性。
-
YOLOv8算法原理与应用:文章深入解析了YOLOv8算法的核心原理,并详细介绍了如何将其应用于车牌检测任务中。我们不仅阐述了YOLOv8相较于前代算法(如YOLOv7、v6、v5)的改进点,还展示了其在车牌检测上的优越性能。
-
系统界面设计:通过采用PySide6,这里设计了一个美观且用户友好的系统界面。这使得非专业用户也能轻松地使用该车牌检测系统,大大提高了系统的实用性和可接受度。
-
性能比较与分析:本文还对YOLOv8[3]与其前代算法(YOLOv7、YOLOv6[4]、YOLOv5[5])在车牌检测任务上的性能进行了详细的比较分析。这一部分的实证研究为读者提供了直观的性能对比,帮助理解不同版本的YOLO算法在实际应用中的表现差异。
-
资源共享:为了促进技术共享和知识传播,我们在文章末尾提供了完整的数据集和代码资源包的下载链接。这使得读者可以直接复现我们的研究成果,或基于此进行进一步的研究和开发。
1. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行车牌识别的图片或视频,或者启动摄像头进行实时检测。在进行车牌识别时,系统会实时显示检测结果,并识别出车牌号码,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLO模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
2. 实现原理与步骤
2.1 YOLO算法原理介绍
YOLOv8算法标志着目标检测技术的一项显著进步,它不仅继承了YOLO系列算法追求速度与准确性并存的设计哲学,而且在此基础上融合了多项尖端技术以显著提高模型的整体性能和精度。此版本通过引入复杂的优化策略和算法创新,进一步提升了目标检测的效率和准确性。
首先,YOLOv8通过实施先进的优化策略,如自适应学习率调整(如Cosine Annealing)和精细化的权重初始化技术(如Kaiming Initialization),极大提高了模型训练的稳定性和效率。自适应学习率调整能够根据模型训练的实时进度动态调整学习率,从而加速模型收敛,并优化模型在不同数据分布上的泛化能力。
在算法核心方面,YOLOv8引入了一个创新的目标检测框架,采用了Distribution Focal Loss损失函数,这一损失函数通过减少类别不平衡的影响,改进了模型对各种尺寸和形态目标的检测能力,特别是对小目标以及在复杂背景或边缘条件下目标的检测精度和鲁棒性。
此外,YOLOv8引入了Task Aligned Assigner,这是一种新颖的标签分配方法。与以往的标签分配方法相比,Task Aligned Assigner可以更精确地匹配预测框和真实标签。这种方法不但提高了模型学习的效率,也降低了模型在训练时由于标签分配不当导致的错误学习。此外,YOLOv8的Task Aligned Assigner引入了一种新颖的标签分配策略,通过优化预测框和真实标签之间的对应关系,该策略有效减少了训练过程中由于不精确标签分配导致的错误学习,提高了模型学习的效率和准确性。
YOLOv8还集成了多样化的数据增强技术,如MixUp、CutMix等,这些技术通过在训练数据中引入更多的变化,增强了模型对不同条件下目标的适应性和识别能力。同时,YOLOv8专注于优化推理性能,采用了多种技术减少模型的计算复杂度和参数量,确保了即使在计算资源受限的环境下也能实现高效的实时目标检测。YOLOv8的自适应锚框计算机制通过深入分析训练集中目标的尺寸分布,自动调整锚框的尺寸和比例,使其更精确地反映了真实目标的几何特性,这一机制直接提升了模型在各种场景下的检测准确率。
2.2 LPRNet算法原理
LPRNet是一个为车牌识别特别设计的深度神经网络架构,最初由Silnov等人在2018年提出,目的是为了解决在复杂环境下准确识别车牌的问题。该网络设计为端到端的架构,意味着它能直接将输入的车牌图像映射到车牌的文本序列,无需传统的字符分割步骤。
网络组成:
LPRNet结构主要由以下几个部分组成:
- 卷积层:LPRNet使用多个卷积层来提取图像的特征,这些卷积层学习图像的局部特征,逐步提取出越来越抽象的信息。
- 小型Inception块:网络中采用了Inception结构的变种,这样做能够在不同尺度上捕捉到特征,增强模型对尺度变化的适应性。
- 空间转换网络(STN):用于校正车牌图像的扭曲,使得即便在车牌位置、角度、光照等条件发生变化的情况下,网络仍能准确识别。
- 双向循环神经网络(Bi-RNN):它负责处理序列数据,通过前向和后向的传播,捕捉序列之间的依赖关系。
- 连接时序多层感知器(CTC):这是一个损失函数,用于处理输入数据和输出标签长度不一致的情况,它能够让网络学习到图像与其标签序列之间的对应关系。
实现原理:
LPRNet的工作原理基于深度学习中的卷积神经网络(CNN)和循环神经网络(RNN)。CNN部分负责从原始图像中提取特征,而RNN部分则负责序列预测,通过CTC解码输出最终的车牌字符序列。通过端到端的训练,LPRNet可以直接从车牌图像中预测出完整的车牌号码。
训练步骤:
训练LPRNet通常遵循以下步骤:
- 数据准备:收集并预处理大量车牌图像和相应的标签数据,进行标准化处理以适应网络输入。
- 模型配置:设置网络参数,例如卷积层的数量和类型,RNN的配置等。
- 损失函数选择:确定使用CTC损失函数,并对其进行配置。
- 优化器选择:选择适合该任务的优化器,如Adam或SGD,并设置适当的学习率和其他超参数。
- 训练:输入数据,进行前向传播,计算损失,然后通过反向传播进行权重更新。
- 验证和测试:在独立的验证集上测试模型性能,根据需要进行调整,并使用测试集进行最终评估。
通过上述步骤,LPRNet可以训练出一个高效准确的车牌识别模型,能够在多种环境和条件下识别车牌号码,适用于智能交通系统和自动化监控领域。
2.3 车牌识别方案
为了方便演示,博主提出了一种整合YOLOv8和LPRNet等深度学习技术的车牌识别方案,优化车牌检测和字符识别的过程,具体步骤如下:包括图像采集、预处理、车牌定位、字符分割、字符识别、输出结果。深度学习技术成熟之后,端到端的网络模型使得这一过程变得简单起来。从思想上来说,基于深度学习的车牌识别实现思路主要包括两个部分:(1)车牌检测定位;(2)车牌字符识别。
(1)通过图像采集模块捕获车辆图像。在预处理阶段,图像会经过尺寸调整、去噪、增强等处理,以提高后续处理的效率和准确性。接下来,在车牌定位阶段,我们采用最新的YOLOv8算法,通过它的深度卷积神经网络快速准确地从预处理过的图像中定位出车牌。YOLOv8算法的优势在于其速度快和精度高,同时为了确保系统的稳健性,我们还会测试YOLOv7、v6、v5算法,选择在实际应用场景中表现最优的模型。
(2)确定车牌位置后,对ROI区域进行字符分割。在这一步骤中,我们采用LPRNet,这是一个端到端的网络模型,它能够直接从定位的车牌图像中识别出字符,而无需传统方法中的单独字符分割步骤。LPRNet通过学习车牌图像与字符序列之间的映射关系,能够有效处理中文车牌的多字符和复杂背景问题。
(3)字符识别阶段,LPRNet识别车牌字符,将分割后的字符图像转换为字符序列。利用深度学习模型对字符特征的强大学习能力,即使是在复杂环境下捕获的图像,LPRNet也能准确识别出字符。
3. 数据集介绍
在本篇博客中,我们详细介绍了一个高质量的车牌检测数据集,该数据集旨在训练和评估深度学习模型,尤其是针对最新的YOLOv8算法。数据集总共包含5555张图像,分为5102张训练图像、432张验证图像和21张测试图像,充分考虑了模型训练的需求和性能评估的准确性。通过细致的预处理和增强处理,例如自动定位像素数据并剥离EXIF方向信息、将图像大小统一调整为416x416(拉伸),我们确保了模型能够接收到标准化的输入,进而提高了训练过程的稳定性和模型最终的泛化能力。
在数据集的类别分布中,我们可以看到绝大多数实例都是车牌,其中包括各种车辆类型,如汽车、摩托车和卡车。这样的分布表明,我们的数据集特别专注于车牌的检测与识别,这对于培养模型具有针对性的识别能力是非常有益的。通过对类别分布的仔细分析,我们确保了数据集中每个类别的充分代表性,并预测了模型可能在实际应用中遇到的场景。
我们的数据集还附带了一组细致的标签,每个图像中的目标都经过精确的定位和框选。如上图所示的分布图中,我们可以看到大部分的标注集中在图像的中心区域,这与实际车辆图像中车牌的位置相符。通过分析标签的空间分布,我们可以得知数据集在空间特征上具有一定的聚焦性,这对于训练模型时的注意力机制设计尤为重要。
同时,对于目标的尺寸分布,我们的数据集涵盖了从较小到较大不等的多种尺寸,这确保了模型能够适应实际场景中车牌尺寸的变化,不会仅仅局限于某一特定尺寸的车牌检测。这样的设计使得我们的模型能够在不同距离、不同角度捕获的图像中均表现出色。博主使用的类别代码如下:
Chinese_name = { "License_Plate": "车牌", "cars": "汽车", "motorcyle": "摩托车","truck": "卡车"}
总之,本数据集通过其精心的设计和组织,提供了一个坚实的基础来训练和评估先进的车牌检测模型。我们深信,这将大幅提升车牌检测系统在真实世界环境中的性能,为自动驾驶、交通监控和车辆管理等应用提供支持。
4. 代码简介
在本节中,我们将详细介绍如何使用YOLOv8进行车牌识别的代码实现。代码主要分为两部分:模型预测和模型训练。
4.1 模型预测
在本篇博客中,我们将探讨如何通过深度学习模型实现一个高效的车牌检测系统。我们的系统基于最先进的YOLOv8和LPRNet算法,不仅能够检测图像中的车牌位置,还能识别车牌上的文本。这项技术的实现融合了计算机视觉和机器学习的最新成果,展现了深度学习在实际应用中的强大能力。
代码的核心是构建一个基于PySide6的图形用户界面(GUI),该界面可以展示由深度学习模型处理后的图像,并允许用户通过按键交互。模型本身在后台进行计算,利用训练好的权重进行车牌检测和识别,而GUI则提供了一个友好的界面,使得用户可以直观地看到结果。
首先,我们导入了多个Python模块。random模块用于生成随机颜色,以便在图像中以不同颜色标识不同的车牌;sys模块用于访问Python解释器的功能;time模块用来测量代码执行的时间;cv2即OpenCV库,是处理图像的强大工具。
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 YOLOv8v5PlateModel import YOLOv8v5PlateDetector # 从YOLOv8Model模块中导入YOLOv8Detector类,用于加载YOLOv8模型并进行目标检测
from datasets.VehicleLicense.label_name import Label_list
接下来,我们引入了QtFusion的配置和窗口小部件,这是构建GUI的基石。QtFusion.utils提供了读取和显示图像的函数。最后,我们从YOLOv8v5PlateModel模块中导入了YOLOv8v5PlateDetector类,这是我们模型检测的核心,以及datasets.VehicleLicense.label_name中定义的类别标签。在这一部分,我们配置了YOLOv8v5PlateDetector模型。首先关闭详细日志输出以清洁控制台输出,然后初始化类名和颜色。每个车牌类别都分配了一个随机颜色,用于在图像上标识检测到的车牌。模型的权重文件路径被定义,然后加载到模型中。
QF_Config.set_verbose(False)
cls_name = Label_list # 定义类名列表
colors = [[random.randint(0, 255) for _ in range(3)] for _ in range(len(cls_name))] # 为每个目标类别生成一个随机颜色
model = YOLOv8v5PlateDetector() # 创建YOLOv8Detector对象
yolo_model_path = abs_path('weights/best-yolov8n.pt')
lpr_model_path = abs_path('weights/Final_LPRNet_model.pth')
model.load_model(yolo_model_path, lpr_model_path)
这里定义了MainWindow类。这个类负责创建应用程序窗口,设置窗口大小,以及添加一个QLabel作为图像的展示区域。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() # 关闭窗口
程序的主体部分是一个典型的图像检测流程:首先使用cv_imread函数读取图像,并调整到模型所需的尺寸(在这个案例中为640x640像素)。接着,调用模型的preprocess方法对图像进行预处理,为检测过程做好准备。然后获取当前时间,调用模型的predict方法进行检测,并记录检测完成后的时间,计算整个推理过程所需时间。紧接着,对检测结果进行后处理,如果检测到车牌,则获取相关信息,如车牌号码、颜色以及置信度,并使用drawRectBox函数在图像上绘制边界框和文本标签。最后,将处理后的图像显示在GUI的标签控件上,并进入Qt应用程序的主循环,等待用户的操作。通过这个流程,用户不仅能看到检测结果,还能通过GUI与应用程序交互。
if __name__ == '__main__': # 如果当前模块是主模块
app = QtWidgets.QApplication(sys.argv) # 创建QApplication对象
window = MainWindow() # 创建MainWindow对象
img_path = abs_path("test_media/京AD77972.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 # 计算预测所用的时间
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, plate_number, plate_color = info['class_name'], info['bbox'], info['score'], info[
'class_id'], info['plate_number'], info['plate_color'] # 获取类别名称、边界框、置信度和类别ID
label = "%s %s" % (plate_number, plate_color) if plate_number else '%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())
4.2 模型训练
在构建一个高效的车牌检测系统时,模型训练是核心步骤之一。它涉及大量数据和复杂计算,目的是教会机器如何识别和理解车牌的各种形状和大小。在本部分博客中,我们将探讨这一过程的代码实现,深入了解每个关键步骤,并提供专业的解释。
首先,我们的代码导入了os库用于操作系统相关的功能,如文件路径的处理;torch库是PyTorch的核心,它提供了深度学习模型训练所需的各种工具和函数;yaml库用于解析和处理YAML文件,这在读取数据集配置时尤为重要。接着,我们从ultralytics导入了YOLO类,这是Ultralytics提供的一个方便用户加载和训练YOLO模型的类。接下来,代码段设置了设备变量,这将决定模型运行在CPU还是GPU上,这一选择取决于是否检测到可用的CUDA设备。
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"
接着,我们设置了工作进程数和批量大小。这些参数将直接影响数据加载和模型训练的速度。然后,定义了数据集名称,并构建了数据集配置文件的路径。数据路径的设置是训练准备过程中至关重要的一步。它涉及定位数据集配置文件的位置,并处理操作系统之间的路径差异。这个过程确保了无论在哪个环境中执行代码,路径都是正确解析的。
workers = 1
batch = 8
data_name = "VehicleLicense"
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文件,保持原有顺序
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是目前最先进的目标检测算法之一,非常适合于处理实时目标检测任务,如车牌检测。使用预训练的模型作为起点,可以帮助我们加快训练进度并提高最终模型的准确性。我们调用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,损失函数的变化趋势和性能指标是衡量模型训练是否成功的关键。本节博客将深入分析YOLOv8模型在训练过程中的损失函数和性能指标图像,以此理解模型的训练效果和潜在的优化方向。
损失函数图像显示了模型在训练集和验证集上的表现。从图像中我们可以看到,无论是bounding box的损失(box_loss),类别的损失(cls_loss),还是分布式焦点损失(dfI_loss),它们的值随着训练过程的进行而逐渐降低。这说明模型逐渐学习到了数据中的规律,并能够更好地预测车牌的位置和类别。特别值得注意的是,在训练初期,验证集上的损失值出现了较大的波动,这可能是由于模型在适应数据分布的过程中的不稳定性。随着训练的深入,损失值逐渐稳定并趋于平缓,这表明模型在验证集上的泛化能力得到了提升。
性能指标图像则展示了模型的精确度(precision),召回率(recall),平均精确度均值([email protected])和更为严格的平均精确度均值([email protected]:0.95)。精确度指标反映了模型识别车牌的准确性,召回率则衡量了模型捕获车牌的能力。mAP指标结合了精确度和召回率,提供了一个综合性能的评估。这些指标随着训练周期的增加而波动上升,表明模型在不断改进,对车牌的识别更加精准,遗漏的车牌数量在减少。尤其是[email protected]:0.95的上升趋势表明模型在各种不同的IoU阈值下都有良好的性能,这对于实际应用中对检测精度要求较高的场景尤为重要。
通过这些图像的分析,我们可以认为模型在训练过程中整体上是向好的方向发展的。不过,也应注意到精确度和召回率图中的波动现象,这可能意味着模型训练过程中的一些不稳定因素,或者是训练数据本身的一些噪声。这些波动也许可以通过进一步的数据清洗、更细致的参数调整或者引入正则化等方法来减少。
在深度学习模型的性能评估中,精确度-召回率(Precision-Recall,PR)曲线是一个非常重要的评估工具,尤其在目标检测任务中,它提供了对模型检测性能的直观理解。在本段博客中,我们将解读车牌识别模型的PR曲线图,并分析其背后的含义。
PR曲线图展示了模型对于不同类别目标的识别能力,包括车牌(License_Plate)、汽车(cars)、摩托车(motorcycle)和卡车(truck)四个类别。每一条曲线代表了模型对于相应类别的识别性能,曲线下的面积(Area Under Curve, AUC)可以定量地反映出模型的性能。在理想情况下,曲线将会贴近左上角,这意味着模型在保持高召回率的同时也具有很高的精确度。
从图中可以看出,车牌和摩托车的识别性能几乎达到了完美,PR曲线几乎贴近了左上角,对应的数值分别为0.995,这表明模型在这两个类别上的识别几乎没有误差,能够在检测到大部分正样本的同时,几乎不产生任何错误识别。而对于汽车类别,精确度略有下降,数值为0.872,表明在检测汽车时模型可能产生了更多的误报。卡车类别的表现则相对较差,精确度为0.811,这可能是由于卡车的形状、大小和车牌位置比汽车和摩托车更加多变,给模型带来了更大的挑战。
另一个重要的指标是所有类别的平均精确度均值(mean Average Precision, mAP),在本例中,[email protected]为0.918,这是一个很高的分数,说明模型在整体上具有很好的检测性能。mAP是一个常用的指标,它综合了所有类别的性能,提供了一个单一的性能评估数值。在这个例子中,高mAP值意味着模型在不同种类的目标检测任务上都表现出了相当高的识别能力。
通过这个PR曲线图,我们可以总结出模型在车牌检测领域的实用性。它能够高效地在多种车辆类型中准确地识别车牌,这对于实际应用,如交通监控和智能交通系统是非常有利的。同时,模型在汽车和卡车的识别性能上存在差异,为未来的模型优化提供了方向。例如,我们可以通过收集更多卡车的训练数据,或者调整模型结构以更好地适应卡车的特点,以提高模型在所有类别上的表现。
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.918 |
F1-Score | 0.86 | 0.93 | 0.85 | 0.88 |
(3)实验结果分析:
在进行深度学习模型的性能评估时,我们通常会使用多种指标来全面地衡量模型的表现。在本小节中,我们将对YOLO系列的几个版本——YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n——在相同数据集上的表现进行对比,主要使用的评价指标为平均精确度均值(mAP)和F1-Score。
首先,mAP是一个综合指标,它考虑了检测精确度和召回率,在不同置信度阈值下的表现。这个指标能够给我们提供模型在检测任务上整体性能的信息。在我们的实验数据中,YOLOv6n以0.945的mAP得分领先,这表明在我们的数据集上,YOLOv6n的整体检测性能最佳。紧随其后的是YOLOv8n,以0.918的mAP表现出色。相对而言,YOLOv5nu和YOLOv7-tiny的表现稍逊,分别为0.868和0.848。这可能意味着YOLOv6和YOLOv8版本在处理我们特定数据集时,能够提供更加精确的检测和较好的泛化能力。
F1-Score作为精确度和召回率的调和平均,提供了单一阈值下模型性能的快照。根据实验数据,YOLOv6n在F1-Score上同样表现最好,其值为0.93,这进一步印证了其在此数据集上的强劲性能。YOLOv8n的F1-Score为0.88,也是一个相当高的分数,表明即便在较低的召回率下,该模型仍然能够保持较高的精确度。而YOLOv5nu和YOLOv7-tiny的F1-Score分别为0.86和0.85,说明这两个版本在精确度和召回率的平衡上稍有不足。
综合这些数据,我们可以得出一些结论。首先,随着YOLO系列的发展,新版本的模型通常会在性能上有所提升,这在YOLOv6n和YOLOv8n的mAP和F1-Score上得到了体现。其次,不同版本的模型可能针对不同的性能指标进行了优化,例如,YOLOv7-tiny可能更侧重于速度而牺牲了一些准确性。最后,这些数据表明,在选择合适的模型进行项目部署时,我们需要考虑具体的应用场景,以及不同模型在性能上的权衡。
4.4 代码实现
随着计算机视觉技术的快速进步,实时车牌检测系统在智能交通和城市管理中的应用变得越来越重要。在本博客中,我将深入介绍如何使用最新的YOLOv8算法开发一个车牌检测系统,该系统能够处理实时视频流,实现即时的车牌识别与跟踪,这对于实现自动化监控和管理是非常有价值的。
(1)引入必要的库
系统的开发开始于准备工作,包括导入必要的Python模块。sys模块允许我们与Python解释器交互,time模块用于记录操作的时间,以确保我们的系统能够高效地执行。OpenCV库是图像处理的关键工具,让我们能够处理图像和视频数据。而QtFusion库及其相关组件则提供了构建图形用户界面的基础,使得我们能够创建直观的应用界面供用户交互。
import sys # 导入sys模块,用于处理Python运行时环境的一些操作
import time # 导入time模块,用于处理时间相关的操作
import cv2 # 导入OpenCV库,用于处理图像和视频
from QtFusion.path import abs_path
from QtFusion.config import QF_Config
from QtFusion.widgets import QMainWindow # 从QtFusion库中导入FBaseWindow类,用于创建主窗口
from QtFusion.handlers import MediaHandler # 从QtFusion库中导入MediaHandler类,用于处理媒体数据
from QtFusion.utils import drawRectBox # 从QtFusion库中导入drawRectBox函数,用于在图像上绘制矩形框
from QtFusion.utils import get_cls_color # 从QtFusion库中导入get_cls_color函数,用于获取类别颜色
from PySide6 import QtWidgets, QtCore # 导入PySide6库的QtWidgets和QtCore模块,用于创建GUI和处理Qt的核心功能
from YOLOv8v5PlateModel import YOLOv8v5PlateDetector # 从YOLOv8Model模块中导入YOLOv8Detector类,用于进行YOLOv8物体检测
from datasets.VehicleLicense.label_name import Label_list
QF_Config.set_verbose(False)
(2)设置主窗口
接着,我们定义了MainWindow类来设置GUI窗口。在这个窗口中,我们设置了一个QLabel来显示处理后的图像。用户可以通过按下键盘上的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() # 关闭窗口
(3)图像帧处理
我们的系统核心在于frame_process函数,该函数对视频流中的每一帧进行处理。它调整图像大小以适应模型输入,应用预训练的YOLOv8模型进行预测,并计算出处理时间,这是评估系统性能的重要指标。如果检测到车牌,系统将使用drawRectBox函数在图像上绘制边界框,并将结果实时显示在GUI中。
def frame_process(image): # 定义帧处理函数,用于处理每一帧图像
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: # 遍历检测信息
name, bbox, conf, cls_id, plate_number, plate_color = info['class_name'], info['bbox'], info['score'], info[
'class_id'], info['plate_number'], info['plate_color'] # 获取类别名称、边界框、置信度和类别ID
label = "%s %s" % (plate_number, plate_color) if plate_number else '%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)主程序部分
最后,主程序初始化界面和模型,设置视频源,并启动媒体处理器。通过Qt信号和槽的机制,我们将视频帧的处理函数与媒体处理器的帧准备信号连接起来,实现了对视频流的实时处理。
cls_name = Label_list # 定义类名列表
model = YOLOv8v5PlateDetector() # 创建YOLOv8Detector对象
yolo_model_path = abs_path('weights/best-yolov8n.pt')
lpr_model_path = abs_path('weights/Final_LPRNet_model.pth')
model.load_model(yolo_model_path, lpr_model_path)
colors = get_cls_color(model.names) # 获取类别颜色
app = QtWidgets.QApplication(sys.argv) # 创建QApplication对象
window = MainWindow() # 创建MainWindow对象
filename = abs_path("test_media/车牌识别测试视频.mp4", path_type="current") # 定义视频文件的路径
videoHandler = MediaHandler(fps=30) # 创建MediaHandler对象,设置帧率为30fps
videoHandler.frameReady.connect(frame_process) # 当有新的帧准备好时,调用frame_process函数进行处理
videoHandler.setDevice(filename) # 设置视频源
videoHandler.startMedia() # 开始处理媒体
# 显示窗口
window.show()
# 进入 Qt 应用程序的主循环
sys.exit(app.exec())
此系统不仅展示了YOLOv8在实时车牌检测中的应用,也体现了现代图形用户界面对于提升用户体验的重要性。它结合了深度学习的强大能力与用户友好的界面设计,使得车牌检测技术更加易于访问和使用。通过本系统的开发与分析,我们进一步了解了如何将复杂的机器学习模型集成到实际可用的应用中,为智能交通系统的未来发展提供了新的思路和解决方案。
5. 车牌识别系统实现
在构建交互式车牌识别系统的设计中,我们旨在打造一个综合集成了用户界面、媒体处理和机器学习模型的平台。该系统不仅强调算法的高效精准,同时也注重用户体验的直观性和便捷性。我们采取了模块化的设计理念,使得各个组件——界面展示、媒体处理、以及深度学习模型——都能够独立运作,又能通过Qt的信号和槽机制紧密协作,实现数据和指令的无缝传递。
5.1 系统设计思路
在系统的架构设计上,我们明确划分了三个层次,以确保职责清晰且易于维护和升级。处理层是系统的智能核心,由YOLOv8Detector类及其预训练的深度学习模型构成,负责处理图像数据并输出识别结果。界面层则是用户与系统交互的窗口,通过直观的UI元素如按钮和标签等提供一个友好的操作环境,使用户能够轻松地进行操作并获取反馈。而控制层则充当协调者的角色,通过处理用户的输入、控制数据流向以及调度媒体处理器和模型的活动,确保系统各部分协调工作,响应灵敏。
此外,在系统设计中,我们还特别注意到了扩展性和灵活性的重要性。随着技术的进步和用户需求的变化,系统设计允许新的处理器和模型能够轻松地集成进来,而无需大规模重构现有架构。通过这种设计,我们的车牌识别系统不仅能够满足当前的需求,同时也为未来的发展留下了充足的空间。
综上所述,这种集成化、模块化的系统设计思路旨在实现技术的先进性与用户体验的和谐统一。通过这个系统,我们可以看到深度学习技术在智能交通领域的实际应用,以及如何将这些技术转化为用户友好的产品的可能性。
系统流程
在这个智能化快速发展的时代,车牌识别系统已成为智能交通管理不可或缺的一部分。在本篇博客中,我们将探讨一个高效的车牌检测系统的设计流程,该系统基于YOLOv8模型,并通过一个用户友好的界面,实现了从媒体输入到车牌识别的全过程。
-
当用户启动我们的应用程序时,首先会遇到的是一个由MainWindow类实例化的界面。这个主界面不仅是用户操作的起点,也是整个应用的大脑,它初始化所有必要的配置和参数,提供了一个直观的操作界面,用户可以在此选择图像或视频作为输入源,无论是来自摄像头的实时图像流,还是预录制的视频文件,或者是存储在设备上的静态图片。
-
选择好输入源后,程序会调用相应的媒体处理器进行处理。这包括配置摄像头、读取视频文件或加载图像文件,以获取待处理的媒体数据。接着,系统会进入一个持续的处理循环,每一帧图像都会经过几个关键的处理阶段。
-
在预处理阶段,系统会调整图像的尺寸、进行色彩空间转换和归一化等操作,以符合YOLOv8模型的输入要求。接下来,在检测与识别阶段,预处理后的图像被送入模型,模型会准确地检测出图像中的车牌,并对车牌信息进行识别。随着检测结果的不断产生,用户界面会实时更新,显示出车牌检测框,并提供车牌识别结果的详细信息,如车牌号码和颜色等。
-
此外,用户交互性也是我们设计中的一个重要考虑。用户不仅可以在界面上实时观察识别结果,还可以通过各种交互操作,比如保存结果、查询帮助信息等。媒体控制功能也允许用户根据需要控制视频播放或停止,这为用户提供了灵活的操作方式。
总体而言,这一系统的设计思路充分考虑了用户体验和技术效能的平衡。我们努力通过精心设计的用户界面和高效的后端处理流程,将复杂的机器学习技术转化为用户友好的应用,使得车牌检测技术更加易于使用和普及。这种设计不仅提升了车牌检测的实用性,同时也推动了智能交通技术的进步。
5.2 登录与账户管理
在当今数字时代,个性化服务和数据隐私的重要性日益凸显。为了更好地服务用户,同时保障用户信息的安全,我们在车牌识别系统中集成了完善的账户管理功能。这一系统部分基于PySide6框架和SQLite数据库构建,不仅为用户提供了一系列便利的账户管理操作,如注册、密码修改、头像设置等,还确保了每位用户能在一个安全的环境中管理自己的数据和设置。
用户首次使用系统时,可以通过一个直观的登录界面完成账户的注册过程。在用户输入必要信息后,系统会在后端数据库中为其创建一个新的账户。一旦注册成功,用户便可以使用自己的用户名和密码登录系统,进而进入主界面开展车牌识别工作。系统的设计注重用户体验,用户可以在登录界面修改个人密码,设置一个代表性头像,这些都是为了让用户感觉更加个性化和友好。
此外,账户管理系统还提供了注销和重新登录的功能。这为用户在使用过程中提供了灵活性,无论是更换设备还是临时退出系统,用户都能方便快捷地进行操作。这种设计体现了我们对用户便利性和系统安全性的双重关注。
整合到主界面之中,用户一旦登录,就能够实时地查看包括检测框、类别、置信度在内的车牌识别信息,并支持多种媒体输入形式,包括图片、视频、实时摄像头和批量文件输入。系统不仅能实时识别车牌,还能记录每次检测的结果。用户的所有检测记录和设置均保存在个人账户中,用户可以随时访问和管理这些信息。
总结来说,我们的车牌识别系统结合了深度学习的强大功能和用户账户管理的个性化服务,为用户提供了一个既强大又便捷的目标检测工具。账户管理功能的加入不仅提升了用户操作的便利性,更在背后强化了数据安全和隐私保护,为用户在实时目标检测场景下带来了更为丰富和安全的使用体验。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV11F4m177qn/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/mbd-ZZ2Wmphx
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZ2WmZ9q
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZ2WmpZu
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZ2WmpZx
在文件夹下的资源显示如下,下面的链接中也给出了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. 总结与展望
在本博客中,我们详细介绍了一个基于YOLO和LPRNet模型的车牌识别系统。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的车牌识别和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
Jiang P, Ergu D, Liu F, et al. A Review of Yolo algorithm developments[J]. Procedia Computer Science, 2022, 199: 1066-1073. ↩︎
Wang, Di, et al. "LPR-Net: Recognizing Chinese license plate in complex environments." Pattern Recognition Letters 130 (2020): 148-156. ↩︎
Zhang, S., Wen, L., Bian, X., Lei, Z., & Li, S.Z. (2021). YOLOv8: An Integration of Deep and Shallow Networks for Real-Time Object Detection. arXiv preprint arXiv:2101.05022. ↩︎
Wang, Q., Teng, Z., Xing, J., Gao, J., Hu, W., & Maybank, S. (2021). YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications. arXiv:2106.09214. ↩︎
Jocher, G., Stoken, A., Borovec, J., NanoCode012, L., Kwon, Y., Michael, L., ... & Fang, J. (2020). YOLOv5: Towards Automatic Object Detection. arXiv preprint arXiv:1506.02640. ↩︎