深度学习实战中国车牌检测与识别【数据集+模型+源码+PyQt5界面】

在这里插入图片描述

AI深度学习车牌识别系统


研究背景

  深度学习在车牌识别领域的研究背景源于计算机视觉和模式识别领域的发展。车牌识别是一种重要的图像处理任务,它在交通
管理、安防监控、停车管理等领域具有广泛的应用价值。传统的车牌识别方法往往依赖于手工设计的特征和规则,但这些方法在复杂场景下容易受到光照、遮挡、角度变化等因素的影响,导致识别率下降。

  深度学习的兴起为车牌识别带来了新的突破。以下是一些推动深度学习在车牌识别中应用的关键因素:

  1. 大规模数据集: 深度学习需要大量的标注数据来训练模型。近年来,大规模的车牌图像数据集被创建和共享,促进了基于深度学习的车牌识别方法的研究和发展。

  2. 卷积神经网络(CNN): 卷积神经网络是深度学习中的重要架构,在图像处理任务中取得了显著的成功。CNN能够自动从数据中学习特征,适应不同的图像变化和噪声。

  3. GPU计算能力: 深度学习训练需要大量的计算资源,特别是图形处理单元(GPU)的广泛应用加速了深度学习模型的训练过程,使得研究人员能够更快地实验和迭代模型。

  4. 深度模型的可扩展性: 深度学习模型在图像识别领域取得了突破,这种成功激发了研究人员将这些技术应用于车牌识别。模型的深度结构可以逐层提取更高级别的特征,从而提高识别性能。

  5. 迁移学习和预训练模型: 预训练的深度学习模型,如在大规模图像数据上预训练的ImageNet模型,可以作为车牌识别任务的初始模型,通过微调进行适应。这种迁移学习减少了在小型数据集上训练深度模型所需的时间和计算资源。

  6. 端到端学习: 深度学习可以实现端到端的训练,从原始图像数据直接学习识别任务,而无需手动设计特征提取步骤。这简化了识别流程并提高了系统的整体效率。


觉得不错的小伙伴,感谢点赞、关注加收藏哦!更多干货内容持续更新…

代码下载链接

关注博主的G Z H【小蜜蜂视觉】,回复【车牌识别】即可获取下载方式


  若您想获得博文中涉及的实现完整全部程序文件(包括测试图片、py文件,模型权重文件,调试说明等),代码获取与技术指导,具体见可参考博客与视频,已将所有涉及的文件同时打包到里面,软件安装调试有具体说明,我们有专业的调试技术人员,将远程协助客户调试,具体请看安装调试说明.txt,完整文件截图如下:
在这里插入图片描述

一、效果演示

  本文构建的AI智能车牌识别系统支持图像、视频以及摄像头三种图像输入。

1.1 图像识别

在这里插入图片描述

1.2 视频识别

在这里插入图片描述

1.3 摄像头识别

在这里插入图片描述

二、技术原理

2.1 整体流程

  深度学习车牌定位技术的目标是从输入图像中准确地定位车牌的位置,通常是通过预测车牌的边界框或四个关键点的位置来实现。以下是一种常见的深度学习车牌定位技术原理,用于获取车牌的四个点位置:

  1. 数据准备: 首先,需要准备一个包含车牌位置信息的训练数据集。这些数据集应该包括车牌图像和对应的标注,可以是车牌的边界框或者四个关键点的位置。标注数据可以通过手动标注或者自动化方法获得,本文采用中科大的CCPD开源数据集。

  2. 网络架构: 选择一个适合车牌定位任务的深度学习网络架构。一种常见的选择是基于卷积神经网络(CNN)的架构,例如Faster R-CNN、YOLO(You Only Look Once)或SSD(Single Shot MultiBox Detector)。这些网络可以同时预测边界框的位置和类别,适用于目标检测任务。

  3. 训练: 使用准备好的训练数据集对所选网络架构进行训练。训练过程涉及将输入图像传递给网络,然后通过反向传播优化网络的权重,使其能够准确地预测车牌位置。训练数据中的每个样本都包括输入图像和相应的车牌位置标注。

  4. 预测: 在训练完成后,将训练得到的网络应用于新的图像。通过将图像输入网络,网络将输出车牌位置的预测结果,这通常是一个边界框或四个关键点的坐标。

  5. 后处理: 根据网络输出的预测结果,可以使用一些后处理技术来提高定位的准确性。例如,可以使用非极大值抑制(NMS)来抑制重叠的边界框,只保留最有可能的车牌位置。

  6. 评估和调优: 对预测结果进行评估,可以使用评价指标如IoU(Intersection over Union)来衡量预测框与真实标注框的重叠程度。根据评估结果,可以对网络架构、训练参数等进行调优,以提高定位的准确性和稳定性。

2.2 CCPD数据集介绍

  CCPD是一个大型的、多样化的、经过仔细标注的中国城市车牌开源数据集。CCPD数据集主要分为CCPD2019数据集和CCPD2020(CCPD-Green)数据集。CCPD2019数据集车牌类型仅有普通车牌(蓝色车牌),CCPD2020数据集车牌类型仅有新能源车牌(绿色车牌)。

  在CCPD数据集中,每张图片仅包含一张车牌,车牌的车牌省份主要为皖。CCPD中的每幅图像都包含大量的标注信息,但是CCPD数据集没有专门的标注文件,每张图像的文件名就是该图像对应的数据标注。

  标注最困难的部分是注释四个顶点的位置。为了完成这项任务,数据发布者首先在10k图像上手动标记四个顶点的位置。然后设计了一个基于深度学习的检测模型,在对该网络进行良好训练后,对每幅图像的四个顶点位置进行自动标注。最后,数据发布者雇用了7名兼职工人在两周内纠正这些标注。CCPD提供了超过250k个独特的车牌图像和详细的注释。每张图像的分辨率为720(宽度)× 1160(高)× 3(通道)。实际上,这种分辨率足以保证每张图像中的车牌清晰可辨,但是该数据有些图片标注可能不准。不过总的来说CCPD数据集非常推荐研究车牌识别算法的人员学习使用。

  CCPD2019数据集主要采集于合肥市停车场,采集时间为上午7:30到晚上10:00,停车场采集人员手持Android POS机对停车场的车辆拍照进行数据采集。所拍摄的车牌照片涉及多种复杂环境,包括模糊、倾斜、雨天、雪天等。CCPD2019数据集包含了25万多幅中国城市车牌图像和车牌检测与识别信息的标注。主要介绍如下:

类别 描述 图像数量
CCPD-Base 通用车牌图片 200k
CCPD-FN 车牌离摄像头拍摄位置相对较近或较远 20k
CCPD-DB 车牌区域亮度较亮、较暗或者不均匀 20k
CCPD-Rotate 车牌水平倾斜20到50度,竖直倾斜-10到10度 10k
CCPD-Tilt 车牌水平倾斜15到45度,竖直倾斜15到45度 10k
CCPD-Weather 车牌在雨雪雾天气拍摄得到 10k
CCPD-Challenge 在车牌检测识别任务中较有挑战性的图片 10k
CCPD-Blur 由于摄像机镜头抖动导致的模糊车牌图片 5k
CCPD-NP c没有安装车牌的新车图片 5k

CCPD图像样例如下
在这里插入图片描述

2.3 车牌定位

在这里插入图片描述

    def predict(self, img):
        img0 = copy.deepcopy(img)
        # 检测前处理
        img, r, left, top = self.detect_pre_precessing(img)
        y_onnx = self.session_det.run([self.session_det.get_outputs()[0].name],
                                      {
    
    self.session_det.get_inputs()[0].name: img})[0]
        # 检测后处理
        outputs = self.post_precessing(y_onnx, r, left, top)
        result_list = self.rec_plate(outputs, img0)

        return result_list

2.4 车牌矫正

  车牌矫正技术是指对于倾斜、变形或者在图像中有不同角度的车牌进行校正,使其在图像中呈现出水平且形状规整的状态。这
种矫正有助于提高车牌识别系统的准确性,使后续的识别算法能够更好地处理车牌图像。以下是一种常见的车牌矫正技术原理:

  1. 角度估计: 首先,需要对图像中的车牌进行角度估计,确定车牌相对于水平方向的倾斜角度。这可以通过计算车牌边界框的角度、车牌区域内文字的倾斜情况,或者其他特定的角度检测方法来实现。

  2. 透视变换: 一旦估计出角度,就可以应用透视变换(也称为仿射变换)来矫正车牌。透视变换是一种图像处理技术,可以将图像中的物体从一个视角投影到另一个视角,从而使其呈现出不同的形状和角度。

    在车牌矫正中,透视变换可以通过以下步骤实现:

    • 找到车牌的四个角点:可以使用边缘检测、轮廓检测或者角点检测算法来找到车牌的四个角点。
    • 定义目标形状:确定一个目标矩形,表示矫正后的车牌应该具有的形状和大小。
    • 计算透视变换矩阵:使用车牌的四个角点和目标矩形的四个对应点来计算透视变换矩阵。
    • 应用透视变换:将透视变换矩阵应用到原始图像上,使车牌区域变形为目标矩形的形状。
    # 透视变换得到矫正后的图像,方便识别
    def four_point_transform(self, image, pts):
        rect = self.order_points(pts)
        (tl, tr, br, bl) = rect
        widthA = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2))
        widthB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2))
        maxWidth = max(int(widthA), int(widthB))
        heightA = np.sqrt(((tr[0] - br[0]) ** 2) + ((tr[1] - br[1]) ** 2))
        heightB = np.sqrt(((tl[0] - bl[0]) ** 2) + ((tl[1] - bl[1]) ** 2))
        maxHeight = max(int(heightA), int(heightB))
        dst = np.array([
            [0, 0],
            [maxWidth - 1, 0],
            [maxWidth - 1, maxHeight - 1],
            [0, maxHeight - 1]], dtype="float32")
        M = cv2.getPerspectiveTransform(rect, dst)
        warped = cv2.warpPerspective(image, M, (maxWidth, maxHeight))

        # return the warped image
        return warped

觉得不错的小伙伴,感谢点赞、关注加收藏哦!更多干货内容持续更新…

2.5 车牌识别

在这里插入图片描述

2.5.1 CRNN概述

  CRNN是一种深度学习算法,用于文字识别任务,其能够同时处理图像的空间特征和序列信息,使得文字识别变得更加高效和准确,CRNN整体流程如下图所示,CRNN算法的原理如下:

  首先,特征提取,输入的文字图像经过卷积层的特征提取。

  序列建模(Recurrent Sequence Modeling):提取的特征被输入到循环神经网络(RNN)中进行序列建模。

  序列分类(Sequence Classification):在CRNN的最后一步,通过全连接层将RNN输出的特征映射到文本的概率分布。

  CRNN算法的优点在于它能够同时捕捉到图像的局部特征和序列的上下文信息。卷积层能够提取图像的低级特征,如边缘、纹
理等,而循环神经网络则能够对特征序列进行建模,捕捉到文字的语义和上下文信息。

在这里插入图片描述

2.5.2 CRNN网络架构实现

  CRNN整体处理逻辑流程如下图所示
在这里插入图片描述

# 定义CRNN模型
class CRNN(nn.Layer):
    def __init__(self, num_classes):
        super(CRNN, self).__init__()

        self.cnn = nn.Sequential(
            nn.Conv2D(1, 64, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.MaxPool2D(kernel_size=2, stride=2),
            nn.Conv2D(64, 128, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.MaxPool2D(kernel_size=2, stride=2),
            nn.Conv2D(128, 256, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2D(256),
            nn.ReLU(),
            nn.Conv2D(256, 256, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.MaxPool2D(kernel_size=(2, 1), stride=(2, 1)),
            nn.Conv2D(256, 512, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2D(512),
            nn.ReLU(),
            nn.Conv2D(512, 512, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.MaxPool2D(kernel_size=(2, 1), stride=(2, 1)),
            nn.Conv2D(512, 512, kernel_size=2, stride=1),
            nn.ReLU()
        )

2.5.3 CNN结构

  在CRNN框架中,CNN(Convolutional Neural Network)用于文字图像的特征提取。CNN通过卷积操作对输入的文字图像进行
滤波和特征提取,以捕捉图像中的局部信息和纹理特征,CRNN框架中CNN整体流程如下图所示。

在这里插入图片描述
  通过CNN的特征提取,CRNN能够从原始的文字图像中学习到具有语义和区分能力的特征表示,为后续的序列建模和文字识别

提供有用的输入。在CRNN框架中,CNN的参数通常是通过端到端的训练方式进行学习,以最大程度地提取和表示输入图像中的文字特征。

2.5.4 RNN结构

  在CRNN框架中,RNN(Recurrent Neural Network)用于对CNN提取的特征进行序列建模。RNN能够捕捉到序列数据中的上
下文信息,并通过时间步长的迭代来处理不定长度的输入序列,CRNN框架中RNN整体流程如下图所示。
在这里插入图片描述

  以下是CRNN框架中RNN实现的基本原理:

  特征序列:在CRNN中,CNN提取的特征图被转换成一个特征序列,以便RNN能够逐步处理序列数据。

  RNN单元:RNN单元是RNN的基本组成部分,它通过一个循环结构来处理序列数据。

  隐藏状态传递:RNN的隐藏状态在每个时间步之间传递。隐藏状态包含了序列数据的上下文信息,能够记忆之前时间步的信息,并影响后续时间步的计算。

  循环迭代:CRNN中的RNN单元会根据序列的长度进行多次循环迭代。

  序列特征建模:通过RNN的循环迭代,将序列数据中的上下文信息进行建模。

  在CRNN框架中,RNN的参数通常是通过端到端的训练方式进行学习,以最大程度地提取和表示序列数据中的文字特征。

觉得不错的小伙伴,感谢点赞、关注加收藏哦!更多干货内容持续更新…

代码下载链接

关注博主的G Z H【小蜜蜂视觉】,回复【车牌识别】即可获取下载方式

参考文献

[1] 基于挤压激励的轻量化注意力机制模块. 吕振虎;许新征;张芳艳.计算机应用,2022
[2] 基于深度学习的模糊车牌字符识别算法. 张彩珍;李颖;康斌龙;常元.激光与光电子学进展,2021
[3] 基于改进Faster R-CNN的核桃识别和定位. 樊湘鹏;许燕;周建平;刘新德;汤嘉盛.燕山大学学报,2021
[4] 自然场景下变形车牌检测模型DLPD-Net. 余烨;付源梓;陈维笑;刘海涛.中国图象图形学报,2021
[5] 基于深度学习技术的停车场收费管理系统设计与实现. 张立立;张振坤;刘明钊;沙毅.电子器件,2021
[6] 基于灰狼优化算法的车牌字符识别研究. 陈科全;吴耀光;陈一铭;穆协乐;张铁异.物联网技术,2021
[7] 车牌识别系统算法综述. 张松兰.电子技术与软件工程,2021
[8] 基于BP神经网络的智能车牌识别系统. 顾秀秀;朱明亮;吴琼;史洪玮.电脑知识与技术,2021
[9] 基于CNN的车牌识别精定位算法研究. 陈冬英;曾淦雄.福建江夏学院学报,2020
[10] 复杂场景下基于改进YOLOv3的车牌定位检测算法. 马巧梅;王明俊;梁昊然.计算机工程与应用,2021
[11] 复杂场景下的车牌识别算法研究. 王明俊.中北大学,2021
[12] 基于CNN卷积神经网络的车牌识别研究. 彭鹏.山东大学,2020
[13] 移动终端下基于联合学习的车牌识别系统. 郝欣宇.大连理工大学,2020
[14] 基于深度学习的车牌检测识别研究. 王潇凡.南京邮电大学,2019
[15] 基于深度学习的车牌识别的研究与应用. 刘珊珊.广东工业大学,2019
[16] 基于深度学习的车牌识别技术的研究与应用. 赵英彬.东华大学,2019
[17] 车载视频流车牌识别技术研究. 山显响.长春理工大学,2018

猜你喜欢

转载自blog.csdn.net/weixin_40280870/article/details/132507704