LPRNet: License Plate Recognition via Deep Neural Networks

提出了一种名为LPRNet的实时车牌识别方法,该方法无需预分割字符,适用于中国车牌,识别准确率高达95%。LPRNet采用轻量级卷积神经网络,可在多种硬件上实时运行,包括CPU、GPU和FPGA。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

论文:https://arxiv.org/abs/1806.10447?context=cs
代码:https://github.com/sirius-ai/LPRNet_Pytorch

0 摘要

本文提出了LPRNet - 无需进行初步的字符分割的端到端自动车牌识别方法。我们的方法受到深度神经网络近期突破的启发,对中国车牌识别准确度高达95%,可以实时处理,在NVIDIA GeForce GTX 1080上每个车牌处理时间3 ms,在Intel Core i7-6700K上每个车牌处理时间1.3 ms。

LPRNet由轻量级卷积神经网络组成,因此可以以端到端的方式进行训练。据我们所知,LPRNet是第一个不使用RNN的实时车牌识别系统。因此,LPRNet算法可用于为LPR创建嵌入式解决方案,即使在具有挑战性的中国车牌上也具有高精度。

1 介绍

在这里插入图片描述
自动车牌识别是一项具有挑战性的重要任务,可用于交通管理、数字安全监控、车辆识别、大城市停车管理。这个任务是一个复杂的问题,受很多因素的影响,包括:图像模糊,光照条件差,车牌号码的变化(包括特殊字符,例如中国,日本的标志),物理影响(变形),天气条件(参见图1中的一些例子)。

强大的自动车牌识别系统需要应对各种环境,同时保持高精度,换句话说,该系统应该在自然条件下运行良好。

本文解决了车牌识别问题,并介绍了LPRNet算法,该算法设计用于无需预分割的字符识别。在本文中,我们不考虑车牌检测问题,但是,对于我们在实验中通过LBP级联来完成车牌检测。

LPRNet基于深度卷积神经网络。最近的研究证明了卷积神经网络在许多计算机视觉任务中的有效性和优越性,如图像分类、目标检测和语义分割。但是,在嵌入式设备上运行这些任务应仍然是一个具有挑战性的问题。

LPRNet是一个非常有效的神经网络,只需0.34 GFLops即可进行单次正向传输。此外,我们的模型是英特尔酷睿i7-6700K SkyLake CPU的实时模型,在具有挑战性的中国车牌上具有高识别精度,并且可以进行端到端的训练。此外,LPRNet可以部分移植到FPGA上,可以释放部分CPU资源用于其他操作。我们的主要贡献可归纳如下:

  • LPRNet是一个高质量车牌识别的实时框架,支持模板和字符独立的可变长度牌照,执行LPR而无需预先分割字符,可从头开始端到端地训练不同国家的牌照。
  • LPRNet是第一种不使用回归神经网络的实时方法,足够轻量化可以在各种平台上运行,包括嵌入式设备。
  • LPRNet在实际交通监控视频中的应用表明,我们的方法足够强大,可以处理困难的情况,例如透视和相机相关的失真,照明条件差和视点变化等。

2 相关工作

在早期的一般LP识别工作中,如[1],处理流程包括字符分割和字符分类两个阶段:

  • 字符分割通常使用不同的手工算法,组合投影、连接和基于轮廓的图像组件。它采用二进制图像或中间表示作为输入,因此字符分割质量受输入图像噪声、分辨率、模糊或变形的高度影响。
  • 字符分类通常使用针对LP字符集的光学字符识别(OCR)方法。

由于先进行字符分割后进行分类,因此端到端识别质量在很大程度上取决于应用的分割方法的优劣。为了解决字符分割问题,提出了基于端到端卷积神经网络(CNN)的解决方案,将整个LP图像作为输入并产生输出字符序列。

[2]中的无分割模型基于由临时连接分类(CTC)损失驱动的可变长度序列解码[3,4]。它使用构建在二值化图像上手工设计的LBP特征作为CNN的输入,以产生字符类概率。通过滑动窗口方法应用于所有输入图像位置,将其输出用于基于LSTM[5]的解码器的输入。由于解码器输出和目标字符序列长度不同,因此CTC不需要预分割的端到端训练。

在我们的方法中,我们避免在二值化图像上使用手工制作的特征 - 而是使用原始RGB像素作为CNN输入。处理滑动窗口CNN输出的基于LSTM的序列解码器被全卷积模型替换,该输出被解释为用于CTC损失训练和贪婪或前缀搜索串推断的字符概率序列。为了获得更好的性能,预解码器中间特征图通过[12]中描述的全局上下文嵌入来增强。此外,使用由SqueezeNet Fire Blocks [13]和[14,15,16]的Inception结构设计了低计算成本的基本构建块,主干CNN模型显著减小。批量标准化[17]和Dropout [18]技术用于正则化。

LP图像输入大小影响计算成本和识别质量[19],因此在使用高[6]或中等[7,2]分辨率之间存在折衷。

3 LPRNet

3.1 网络结构

最近的研究倾向于使用强大的分类网络的一部分,如VGG,ResNet或GoogLeNet作为他们的任务的“骨干”,通过应用迁移学习完成自己的任务。但是,这不是构建快速轻量级网络的最佳选择,所以在我们的工作中,我们应用了最近发现的架构技巧重新设计了骨干网络。

CNN模型主干的基本构建块(表2)的灵感来自SqueezeNet Fire Blocks [13]和[14,15,16]的inception块。我们还遵循最佳研究实践,在每次卷积操作后使用批量标准化[17]和ReLU激活函数。

简而言之,我们的设计包括:

  • 具有空间变换器层[8]的定位网络(可选)
  • 轻量卷积神经网络(骨干)
  • 每个位置的字符分类头
  • 进一步序列解码的字符概率
  • 后过滤过程

首先,输入图像由空间变换器层预处理,如[8]中所提出的。此步骤是可选的,但允许探索如何将输入图像进行空间变换以具有更好的进行识别。最初的LocNet(参见表1)结构用于估计最佳转换参数。

在这里插入图片描述在这里插入图片描述
骨干网络架构如表3所示。该网络以原始RGB图像作为输入并计算空间分布的丰富特征。最后一层使用了宽卷积(1×13内核)利用了局部字符的上下文信息而不是使用了基于LSTM的RNN。骨干子网络的输出可以被解释为一系列字符概率,其长度对应于输入图像像素宽度。由于解码器输出和目标字符序列长度不同,我们应用CTC损失方法[20] - 用于无需分割的端到端训练。CTC损失是一种众所周知的方法,用于解决输入和输出序列未对齐且长度可变的情况。此外,CTC提供了一种从每个时间步的概率到输出序列概率的有效方法。关于CTC损失的更详细解释在[20]。

为了进一步提高性能,使用[12]中的全局上下文嵌入增强了预解码器中间特征映射。它通过骨干输出上的全连接层计算,平铺到所需大小并与骨干输出连接。为了将特征图的深度调整为字符类编号,应用附加的1×1卷积。

对于推理阶段的解码过程,我们考虑了两个选项:贪婪搜索和beam搜索。虽然贪婪搜索在每个位置获取最大类概率,但是beam搜索最大化输出序列的总概率[3,4]。

对于后期过滤,我们使用面向任务的语言模型作为一组目标国家LP模板实现。请注意,后过滤与Beam Search一起应用。后过滤程序获得通过beam搜索找到的前N个最可能的序列,并返回与预定义模板集合匹配的第一个序列,该模板取决于LP规则。

3.2 训练细节

所有训练实验都是在TensorFlow [21]的帮助下完成的。

我们使用Adam优化器训练我们的模型,批量大小为32,初始学习率为0.001,梯度噪声系数为0.001。我们在每100k次迭代后将学习率降低10倍,并对我们的网络进行总共250k次迭代训练。

在我们的实验中,我们使用随机仿射变换的数据增强,例如,旋转、缩放和平移。

值得一提的是,从训练开始应用LocNet会导致结果退化,因为LocNet无法从识别器中获得合理的梯度,而识别器通常对于前几次迭代来说太弱。因此,在我们的实验中,我们仅在5k次迭代后才开启LocNet。

我们通过目标数据集上的交叉验证来选择所有其他超参数。

4 实验

LPRNet基线网络,我们从不同的架构开始我们的实验,受到[2]的启发。它主要基于Inception模块,然后是双向LSTM(biLSTM)解码器,并使用CTC损失训练。我们首先进行了一些旨在用biGRU块替换biLSTM的实验,但是我们没有观察到使用biGRU比biLSTM有任何明显的好处。

然后,我们专注于消除复杂的biLSTM解码器,因为大多数现代嵌入式设备仍然没有足够的计算和存储来有效地执行biLSTM。重要的是,我们的LSTM应用于空间序列而不是时间序列。因此,所有LSTM输入在训练阶段和推理阶段都是预先知道的。因此,我们认为RNN可以被空间卷积取代而不会显著降低精度。具有一些主干修改的无RNN模型被称为LPRNet基础,并且在第3部分中详细描述。

为了提高运行时性能,我们还通过对所有池层使用2×2步幅来修改基础LPRNet。此修改(LPRNet简化模型)显著减小了中间特征图的大小和总推理计算成本(参见表4的GFLOP表)。

在这里插入图片描述

4.1 中文车牌集

我们在私人数据集上测试了我们的方法,该数据集包含从不同安全和监控摄像机收集的中国车牌的各种图像。该数据集首先通过基于LPB的探测器运行,以获得每个牌照的边界框。然后,手动标记所有车牌。总的来说,数据集包含11696个裁剪的车牌图像,它们按照9:1的比例被分成训练集和验证集。

自动裁剪的车牌图像用于训练,使网络对检测后的车牌图像更加鲁棒,因为在某些情况下,裁剪后的车牌边缘会有一些背景区域,而在其他情况下,它们裁剪得太靠近边缘,根本没有背景区域甚至连车牌的某些部分都有缺失。

4.2 Ablation研究

进行消融研究以确定各种增强之间的相关性以及各自的准确性/性能改进是至关重要的。这有助于其他研究人员采用本文的想法,并重用最有前途的架构方法。表5显示了体系结构方法及其对准确性的影响的。

在这里插入图片描述
可以看出,使用全局纹理获得了最大的准确度增益(36%)。数据增强技术也有助于显着提高准确性(28.6%)。在不使用数据扩充和全局上下文的情况下,我们无法从头开始训练模型。

基于STN的对齐网络提供了2.8 - 5.2%的显著改进。具有后过滤的Beam搜索进一步将识别准确度提高了0.4 - 0.6%。

4.3 性能分析

LPRNet简化模型被移植到各种硬件平台,包括CPU,GPU和FPGA。结果列于表6中。

在这里插入图片描述这里的GPU是nVIDIA GeForce 1080,CPU是Intel Core i7-6700K SkyLake,FPGA是Intel Arria 10,IE是来自Intel OpenVINO的推理引擎。

5 结论和后续工作

在这项工作中,我们已经表明,对于车牌识别,可以使用相当小的卷积神经网络。引入了LPRNet模型,可用于有挑战的数据集,实现高达95%的识别准确率。本文进行了架构细节、动机和消融研究。

我们展示了LPRNet可以在各种硬件架构上实时进行推理,包括CPU、GPU和FPGA。我们毫不怀疑LPRNet即使在更专业的嵌入式低功耗设备上也能实现实时性能。

LPRNet很可能可以使用现代修剪和量化技术进行压缩,这可能有助于进一步降低计算复杂性。

作为未来的研究方向,可以通过将基于CNN的检测部分合并到我们的算法中来扩展LPRNet工作,从而将检测和识别任务作为单个网络进行评估,以便优于基于LBP的级联检测器的质量。

### LPRNet 架构 Diagram 及其网络结构可视化 LPRNetLicense Plate Recognition Network)是一种专门用于车牌识别的人工神经网络。为了理解并展示这种网络的具体架构,可以从多个角度进行探讨。 在网络的基本概念方面,任何复杂的神经网络都可以被视作一种特殊的图结构,在这里节点代表不同的层或操作单元而边则表示数据流的方向[^1]。对于像LPRNet这样的卷积神经网络(CNN),通常由输入层、若干隐藏层(包括但不限于卷积层、池化层)、以及最终的全连接输出层组成。 针对具体的LPRNet架构而言,虽然没有直接提供关于此特定模型的邻接矩阵形式描述,但是可以根据已知的信息构建相应的diagram。这类CNN一般会包含以下几个主要部分: - **输入层**:接收图像作为输入。 - **特征提取模块**:通过一系列卷积层和激活函数组合而成,负责自动学习到有助于区分不同类别的视觉模式。 - **字符分割与序列建模组件**:这部分设计用来处理车牌上各个字符的空间排列特性,并将其转换成适合分类的形式。 - **输出层**:给出预测结果,可能是概率分布或者是直接的类别标签。 要创建这样一个架构图,可以利用Python中的`matplotlib`库或者其他专业的绘图软件来进行可视化工作。下面是一个简化版的例子,展示了如何用代码生成类似的图表: ```python import matplotlib.pyplot as plt from matplotlib.patches import Rectangle, ConnectionPatch fig, ax = plt.subplots(figsize=(8, 6)) # Define positions and dimensions for rectangles representing layers. input_rect = Rectangle((0.1, 0.7), width=0.15, height=0.2, edgecolor='black', facecolor='lightblue') conv_pool_rects = [ Rectangle((0.3 + i * 0.15, 0.7), width=0.15, height=0.2, edgecolor='black', facecolor='lightgreen') for i in range(4)] output_rect = Rectangle((0.9, 0.7), width=0.15, height=0.2, edgecolor='black', facecolor='salmon') # Add all shapes to plot. for rect in [input_rect] + conv_pool_rects + [output_rect]: ax.add_patch(rect) # Draw connections between layers using arrows or lines. for i in range(len(conv_pool_rects)): con = ConnectionPatch(xyA=(0.1+0.15, 0.8), coordsA=ax.transData, xyB=(0.3+i*0.15, 0.8), coordsB=ax.transData, arrowstyle="<|-|>", mutation_scale=20) ax.add_artist(con) con_final = ConnectionPatch(xyA=(0.3+(len(conv_pool_rects)-1)*0.15, 0.8), coordsA=ax.transData, xyB=(0.9, 0.8), coordsB=ax.transData, arrowstyle="<|-|>", mutation_scale=20) ax.add_artist(con_final) plt.text(0.1, 0.6, 'Input Layer\n(Image)', ha='center', va='top') plt.text(0.6, 0.6, 'Convolutional &\nPooling Layers', ha='center', va='top') plt.text(0.9, 0.6, 'Output Layer\n(Predictions)', ha='center', va='top') plt.axis('off') plt.show() ``` 上述脚本仅作为一个示意性的例子来说明如何绘制一个简单的神经网络架构图;实际应用中可能还需要考虑更多细节,比如每层的确切参数配置等信息。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值