1. 引言
近年来随着我国车辆不断的增多,城市路面交通及日常汽车管理的压力也越来越大,伴随着智慧城市建设的不断完善,在复杂环境下对车牌检测及车牌识别的需求也逐步增加。自2012年Hinton和他的学生Alex Krizhevsky提出AlexNet以来,卷积神经网络飞速发展,多年来学者们在深度和结构上不断优化,在目标识别、目标检测取得了巨大的突破。通过将卷积神经网络应用到车牌检测及车牌识别中,使得无论是速度还是精度都取得了非常好的效果。
现阶段主要的目标检测算法大致分为两大类,第一类是基于候选框区域的一阶段方法,例如YOLO [1]、SSD [2] 等,这类方法将图像送入网络,在产生候选区域的同时进行物体的类别和位置预测,其特点是速度快而精度低。第二类是基于回归的二阶段方法,Fast R-CNN [3] 为具有代表性的一种,该方法首先生成侯选区域,再对候选区域进行类别和位置预测,其特点往往是精度很高但是速度较慢。考虑到实际应用,二阶段的方法无论是内存还是计算量消耗都十分巨大,以至于在使用设备的选择上具有极大的局限性,不适合商用产品实际落地,因此在检测时选择一阶段方法,能够在速度和精度上取得一个较好的平衡。
在检测出车牌位置后,下一步的操作是进行车牌识别,传统的车牌识别分为字符分割和字符识别两部分,字符分割算法包括基于模板匹配的字符分割方法 [4]、基于垂直投影的字符分割方法 [5]、基于连通域的字符分割方法 [6] 以及基于聚类分析的分割方法 [7]。通过以上方法将车牌进行分割后下一步对其进行识别,传统的字符识别算法包括基于模板匹配的字符识别算法 [8]、基于特征统计的字符识别算法 [9] 以及基于机器学习的字符识别方法 [10]。
但以上方法都极其复杂繁琐,随着深度学习的发展,大量的车牌识别网络孕育而生,Zhao等人 [11] 提出使用卷积神经网络(Convolution Neural Network, CNN)利用改进后的LeNet-5来自适应的学习特征训练模型从而识别车牌字符;Jain等人 [12] 使用CNN模型从整张车牌图像提取特征,通过11个全连接层将其解码为11个定长序列,然后依次分类来得到指定位置的字符;Li等人 [13] 尝试通过单个神经网络来同时解决车牌检测与车牌识别的问题;Sergey等人 [14] 采用全卷积来取代长短期记忆网络(Long Short-Term Memory, BLSTM),提出了第一个不使用循环神经网络(Recurrent Neural Network, RNN)的实时车牌识别网络。在本文中,我们将介绍基于深度学习的端到端的车牌检测与识别模型,该模型:1) 有效的将字符识别中的分割与识别合成一步进行。2) 自然的处理任意长度的车牌,包括蓝牌和绿牌。3) 快速且准确的输出车牌框位置信息及车牌号码。通过该方法,使得在实际应用中减少了大量的停车等待时间,同时有效的识别了混合车牌,避免了因混合车牌识别错误而造成的不必要的经济损失。
2. 车牌检测与识别算法
2.1. 基于YOLOv4-Tiny的车牌检测方法
2.1.1. YOLOv4-Tiny介绍
本2020年4月在Alexey等人 [15] 的研究下新的目标检测算法YOLOv4被提出,同年6月份,作者推出了YOLOv4简化版的模型YOLOv4-tiny,作为简化版的YOLOv4,YOLOv4-tiny整体的网络结构降低了参数所以相对简单,使之成为在移动和嵌入式开发中可行的算法之一。
YOLOv4-tiny实际使用两个YOLO头取代了YOLOv4中的三个头,并且YOLOv4-tiny在预训练卷积层上使用了29层进行训练,相比较YOLOv4的137个预训练卷积层减少了108层。减少了网络的复杂度,在COCO数据集上进行测试时,精度相比较YOLOv4降低了1/3,但是随之而来的是YOLOv4-tiny中每秒帧数(Frames Per Second, FPS)大约是YOLOv4-tiny的八倍。YOLOv4-tiny模型在RTX 2080Ti上以443FPS的速度实现了22% AP,而通过使用 TensorRT、batch size = 4和FP16-precision,YOLOv4-tiny实现了1774 FPS。
针对本文中涉及的车牌识别的实时性,与YOLOv4相比,YOLOv4-tiny是更好的选择,因为相比较精度或者是准确度来说,更快的检测时间是需要达成的首要目标。
由图1所示,YOLOv4-tiny核心网络(Backbone)中两次CBL块主要是通过步长为2的卷积对输入进来的图像进行两次下采样,CSP模块将特征按照通道划分为两组,其中一组在进行正常的卷积操作的同时采用大残差边和小残差边进行合并,这样进行特征提取的好处在于可以通过两个残差边使网络得到更多的语义信息,进而在减少内存开销的同时可以提高网络整体的检测准确率。其中CBL是由卷积层、批量归一化(Bath-Norm)和非线性激活函数组成。通过CBL避免梯度消失和梯度下降的同时,还可以减少权重初始化的影响,提高网络整体的泛化能力,加快网络训练。
2.1.2. 与注意力机制融合后的车牌检测算法
YOLOv4-tiny算法在多个尺度的融合特征图上分别独立做检测,在Pascal VOC、COCO数据集上检测结果得到很大提升,但在本文车牌检测应用中仍具备优化的潜力,需要对YOLOv4-tiny的算法进行改进来适应特定的检测。

Figure 1. YOLOv4-tiny network diagram
图1. YOLOv4-tiny网络图
1) 改进初始框参数
YOLOv4-tiny可以将输入的416 × 416大小的图像分成若干个网络,其中每一个网络都对应着三个先验框,最终将这三个先验框通过网络参数进行调整得到预测的目标框。因此这三个先验框在实际使用中越接近真实框的大小,那么网络整体的误差就越小,收敛也会更快。在YOLOv4-tiny中,先验框作者是根据COCO数据集,以IOU作为距离,通过K-means [16] 算法计算得来的,取值为10,14,23,27,37,58,81,82,135,169,344,319。
如图2所示,对于本文的车牌数据来说,原始的锚框参数由公共数据集COCO聚类而成。但是COCO数据集类别十分丰富,实际的尺寸太大,所以对应的先验框参数值具有普遍性,不适用于本文的实验要求,所以需要重新进行维度聚类,从而使得本文的模型进行更好的车牌预测。
由于YOLO系列自v3开始加入了类似于FPN上采样和融合的做法,融合了不同尺度的特征图,YOLOv4对此又进一步改进了PAN层使得特征图尺寸发生了变化。但是本次实验采用的数据集中拍摄的图片距离相近,导致车牌的宽高十分相近,在使用K-means聚类后的候选框尺寸集中,为了使得多尺度输出发挥更好的作用,对聚类后的候选框进一步做了线性尺度放缩的方式,将锚框尺寸向两边拉伸,具体拉伸依据如下:
(1)
(2)
(3)
(4)
在完成K-means聚类和线性拉伸后,先验框为50,10,168,33,266,53,375,71,498,90,696,123。
2) 引入注意力机制
为了使得网络专注于目标特征,并且忽略非目标特征,研究者在神经网络中加入注意力机制,目前注意力机制依靠其优势已经被广泛应用于自然语言处理、图像处理等任务中,其优势在于只增加少量的计算量的情况下,可以使网络能自动学习到图像或文字中需要注意的地方。注意力机制主要分为:空间注意力机制、通道注意力机制、空间和通道混合注意力机制。针对本文数据多为复杂场景下的车牌检测,注意力机制能够有效的学习车牌中的目标特征,并且抑制其他非目标特征,强调车牌信息,抑制背景信息,提高检验精度。
Woo等人 [17] 于2018年提出卷积块注意力模型(Convolution Block Attention Module, CBAM),他们认为目前大多数神经网络主要针对三个因素进行性能提升的方向,分别是深度、宽度和基数,但他们关注的是另一个方面:注意力。它是人类视觉系统的一个有趣的方面。他们将学习通道注意力和空间注意力的过程进行分解,使得注意力生成过程具有更少的计算量和模型参数。因此可以作为已存在的基础卷积架构的即插即用模块。同时,Hu等人 [18] 与Woo等人的工作非常接近,但是Hu等人使用全局池化特征来计算通道上的注意力,并且他们忽略空间注意力的影响。Woo等人提出空间注意力在决定注意力的位置方面起着重要的作用,在Woo等人提出的CBAM中,他们基于一种有效的架构同时利用了空间注意力和通道注意力,并且最后效果优于使用全局池化特征的只计算通道注意力的架构。这里我们选择代表空间和通道混合注意力机制的轻量级的通用模块CBAM。其结构如下图3所示:
CBAM模块是一个轻量级和通用的模块,所以CBAM模块可以插入到整个网络的卷积模块中,实现端到端的同步训练。如图3通道注意力模块所示,特征输入后,分别经过最大池化操作(Max Pooling)和平均池化(Average pooling)后共享全连接层,将输出特征进行加和操作,再经过非线性激活,最终形成通道注意力模块。将通道注意力机制输出结果和原输入的特征图做乘法操作,形成空间注意力模块需要的输入特征。
从另一个角度来看通道注意力机制,其实是将特征图(feature map)在两个维度上做压缩,压缩成一维矢量后再进行后续的卷积等操作。此处卷积使用了最大池化和平均池化两种。两种池化的使用可以解决特征映射不聚合的问题,其中平均池化对特征图中每一个特征点都有相应的反馈,而最大池化在进行反向传播的时候,只响应特征图中最大的梯度。通道注意力机制可以用表达式表达为:
(5)
如上图3所示空间注意力机制。在处理完通道注意力模块后将通道注意力模块的输出作为空间注意力模块的输入。与通道注意力机制不同的是,空间注意力机制先做一个基于通道的最大池化和平均池化,再将结果基于通道做一个连接(Contact)操作,然后通过卷积将其降为一个通道后继续经过非线性激活生成空间注意力模块。最后将该输出结果与通道注意力机制的输出进行乘法运算,最终生成想要的特征。
(6)
其中,
为sigmoid操作,7 × 7表示卷积核的大小,7 × 7的卷积核比3 × 3的卷积核效果更好。所以CBAM的整个处理过程如下式所示:
(7)
其中,
表示对应元素逐个相乘。即上述所说输入特征图先进入通道注意力模块生成通道注意力权重的特征图后并与原始输入特征图对应元素相乘得到新的特征图
,新的特征图
送入空间注意力模块生成空间注意力权重的特征图
,最终与
逐元素相乘得到特征图
完成注意力模块。
改进前CSP结构如图4所示:
改进后CSP结构如图5所示:
2.2. 基于CRNN的车牌识别方法
2.2.1. CRNN介绍
Shi等人 [19] 在2015年提出卷积循环神经网络(Convolution Recurrent Neural Network, CRNN),该方法提出了一种将特征提取、序列建模和转录整合到统一框架中的新型神经网络。该网络结构基于端到端训练;可以自然的处理任意长度的序列,不涉及字符分割或水平尺度归一化;不限于任何预定义的词汇,在无词典和基于词典的场景文本识别任务中都取得显著的表现;产生一个有效且小的多的模型,对于现实场景更为使用。CRNN由深度卷积神经网络(Deep Convolution Neural Network, DCNN)和循环神经网络(Recurrent Neural Network, RNN)组成。在CRNN的底部,卷积层自动从每个输入图像中提取特征序列,然后在循环层使用stack形深层双向长短期记忆网络(Bidirectional Long Short-Term Memory, BLSTM)对特征序列的每一帧进行预测,即输入图像在通过LSTM后将文字的时序序列进行编码,然后将该编码送入连接时序分类算法(Connectionist Temporal Classification, CTC) [20] 进行解码。CTC作为经典的OCR解码算法,假设CRNN的循环层的输出维度是
,令
,表示该字符串有25个时序;n表示每个时序有n种可能的字符类型结果,其中包含blank字符(用
表示),对输出结果的每个时序进行归一化指数函数(Soft Max)操作从而得到该时序概率最大的字符;最后在得到的序列中去除重复的字符以及blank字符。假设最终序列字符为
,在去重合并后所得到的字符序列就是state。通过应用该算法我们能够有效的解决车牌字符中相邻位置相同字符的识别问题,不会产生车牌字符缺漏的情况。
2.2.2. 与注意力机制融合后的车牌识别算法
在将车牌送入识别模型前,由于识别过程中可能遇到不同类型的车牌,包含蓝牌、绿牌、黄牌等。首先将车牌原始图像调整为1 × 32 × 100的灰度图,这样在统一车牌图像尺寸的同时,去掉车牌中的颜色信息,只保留字符信息,有利于在特征提取的过程中不会因为颜色的影响而改变卷积层本该提取的车牌字符区域特征。值得注意的是,通过不断的完善我们的数据集,本文提出的模型能够识别变长车牌,这对于车牌识别的实际应用无疑是迈出了一大步。
1) 引入STN
这里将CRNN作为车牌识别的基本框架,仍有些不足,首先是CRNN在识别中需要将特征图送入长短期记忆网络(Long Short-Term Memory, LSTM)进行上下文的时序关联,但在通过卷积层进行特征提取时,输入车牌由于拍摄角度以及拍摄距离等因素的影响,容易出现车牌倾斜,当车牌倾斜后在送入特征提取器中容易得到不准确的特征,为了输出完美的特征,这里引入空间变换网络 [21] (Spatial Transformer Networks, STN)网络,其主要由三部分组成,首先通过定位网络生成输入与输出特征的映射关系
;再由网格生成器利用映射关系进行相应的空间变换,生成输入图像对应于输出图像的每个像素值;最后通过采样器将输入图像中的像素值复制到输出图像中,从而得到不改变尺寸的矫正图像。
2) 引入残差学习与注意力机制
其次在于CRNN的卷积层过于简单,在卷积过程中不能充分的提取所需要的特征。从经验上来说,卷积网络的深度对于提高模型的性能是相当重要的,当增加网络层数后,网络可以进行更加复杂的特征提取。但是单纯的增加深度又会产生另一个问题,即当网络的深度增加时,网络的准确度出现饱和,更甚者会下降,产生这些情况的原因便是出现了梯度消失或者爆炸。He等人 [22] 在2015年提出残差学习,他们认为深层网络即使什么都不做,只单纯的复制之前层的特征,那么得到的特征图就算不会变好,也至少不会变差,这样深层网络的性能便能保证至少和浅层网络性能一样,这也称作恒等映射。那么怎么才能实现恒等映射呢?He等人提出当初始输入特征为x时,记下一层学习之后得到的特征为
,现在我们不直接学习
,而是通过学习两者的残差
,然后将初始特征与残差相加,则得到我们想要的特征
。通过这样的方式我们每步学习到的特征即使在最坏的情况下(残差为0)也是上一层的特征,即网络性能始终不会下降。这里我们使用的残差模块如下图6所示:

Figure 6. Residual learning: A building block
图6. 残差学习:构建模块
通过引入残差模块,我们解决了深度问题,但只有深度往往并不能有效的提取特征,这里我们考虑用检测阶段所使用的空间和通道的混合注意力机制与残差模块进行融合来作为本文中的特征提取层。这里的输入特征是经过STN后的大小不变的图像
,首先将F进行一次卷积核为3,填充(padding)和步长(stride)为1,通道数变化的卷积层得到特征图
,利用
生成权重Mc,然后将Mc与特征图
进行相乘后得到特征图
,在学习的过程中通过通道注意力机制让模型在通道的层面知道应该关注哪里,同时也不断的提高感兴趣区域的权重,最后得到通道上最优模型。然后利用空间注意力机制再次学习权重Ms,同样的将Ms与特征图
相乘得到新的特征图
,在经过通道和空间的混合注意力机制后我们的模型已经能够自动的学习特征图中重要的区域并且不断的提高这个区域的权重。在注意力机制后再加上一个卷积层得到
,该卷积层的卷积核、步长与填充与上一个卷积层相同,不会更改特征图的大小,不同的是这里的输出通道数与输入通道数相同。最后将残差
与F相加得到新的特征图,从而完成一轮残差学习。融合后的模块如下图7所示。
在本文中的特征提取阶段总共使用了8次残差模块,每隔一次残差模块输出通道数翻倍,通过每两次残差模块后进行的最大池化操作,将所得到的特征图尺寸进行缩放,由于残差模块中特征图尺寸并不改变,所以最后得到的特征图尺寸完全由最大池化层的个数决定。该模型特征提取阶段的卷积操作具体如下图8所示。

Figure 7. The convolution model based on CBAM and RES block
图7. 基于残差模块与注意力机制的卷积模型

Figure 8. Convolution model of license plate recognition
图8. 车牌识别中卷积模型
在经过残差模块和注意力卷积模块的共同作用下,车牌图像变成了
的特征图,随后将其送入双向长短期记忆网络(Bidirectional Long Short-Term Memory, BLSTM)中,在经过两个隐藏层为512层的双向BLSTM后预测出了具体的车牌字符,然后利用连接时序分类算法(Connectionist Temporal Classification, CTC)进行函数的拟合。传统的解码操作是每个时序对应一个字符,如果出现相同的字符,在解码过程中只留下一个字符。这样的坏处是一个单词中可能存在相邻的两个或多个相同的字符,如果按照传统的对齐操作,最后的结果是该单词中相邻的多个字符只会留下一个,结果是出现了字符丢失的现象。连接时序分类算法引入一个特殊的占位符
,不对应任何字符,如果一个单词中存在相邻的多个相同字符,则在他们间加入
进行分隔,最后仍然将相同字符去掉,这样得到的就是一个完整的单词,具体的转录过程如下图9所示:

Figure 9. The process of CTC decoding the license plate characters
图9. CTC对车牌字符进行解码的过程
3. 实验结果与分析
3.1. 数据集及其标注
本文的车牌数据由两部分组成,一部分来自于CCPD数据集 [23],其余部分来自网络车牌。由于检测阶段不需要考虑数据分布不均匀的问题,因此检测阶段所有数据皆使用已经完全标注好的CCPD数据集共计11,776张;在识别阶段的数据处理上,由于CCPD数据集的车牌基本都是安徽车牌,省份比较单一,容易造成数据分布不均衡,车牌省份识别不准确。所以这里只取用2961张,其他大部分车牌数据来自于网络车牌图片,基本涵盖各个省份,共计4502张。但由于网络车牌并未标注,在取到这部分车牌后首先需要将其进行手工标注,与CCPD数据集中标注不同的是我们的标注信息只有一个,即将车牌号码标注成图像名,然后利用已经训练好的检测模型将车牌框信息进行识别,最后将车牌框裁剪出来形成只有单个车牌不含后景图像的车牌。对于CCPD数据集中的2961张车牌同样进行裁剪留下只包含车牌框的前景图像,这样就得到识别阶段所使用的车牌数据集7463张。将这些数据集按照7:3的比例分成训练集和测试集,其中训练集包括5220张,测试集包括2243张。
3.2. 模型训练与测试
本文采用基于pytorch的深度学习框架进行训练和测试,并通过上文所示的网络结构对车牌进行检测与识别,在GPU的选择方面,采用NVIDIA GeForce RTX 1080Ti,CUDA10,内存为16 GB,使用的编程语言为python,在训练之前,需要对训练超参数进行初始化,具体超参数设置如下表1所示。

Table 1. Hyper parameter setting during the training
表1. 训练过程中超参数设置
在训练时,我们根据平均精度(Average Precision, AP),识别准确率(Accuracy),训练参数量(Params)以及内存访问成本(Memory access cost, MACs)来判断模型性能。其中平均精度表示检测阶段PR曲线(Precision-Recall)上的Precision值取平均值;识别准确率表示识别阶段该模型对训练集和测试集数据上正确识别的车牌号码的比例;而训练参数量表示该模型中需要训练的参数总和,其计算公式为:
(8)
这里的h和w表示输入图像的高度和宽度,
和
分别表示输入图像的通道数以及经过该网络层输出图像的通道数;内存访问成本表示该模型的计算量大小,其计算公式为:
(9)
这里的
所表示的和上式相同,唯一不同的是K表示卷积核的大小。
3.3. 实验结果与分析
本次实验在车牌检测时将多种注意力机制通过聚类、放缩等做了对比实验,具体结果如下表2所示:

Table 2. Comparison of the influence of different modules on the test results
表2. 不同模块对检测结果的影响对比
通过观察及分析实验结果发现,在本次实验中加入的K-means并没有得到应得的结果,本文在算法改进阶段分析了K-means起反作用的原因,并加入了线性变化,将框进行了线性双方向的延伸,结果比单纯的使用K-means效果要好,对于本次实验来说,车牌大小几乎固定,即便是线性变化后的框也没有得到最优的结果。但是证明将先验框进行线性变换是有效的,日后是值得其他实验进行参考的。通过对比各个模型的结果,我们发现在Yolo-tiny中加入CBAM注意力机制得到的检测结果是最优的,AP值达到了93.60%。
在识别时,我们通过消融实验来对各个模块所带来的影响进行分析。这里将测试分为三类,第一类不包含STN网络,只经过残差学习和注意力机制的卷积模块提取特征,然后送入BLSTM和CTC进行识别;第二类不使用特殊卷积层,在经过STN后将特征图送入普通卷积,然后直接送入BLSTM和CTC中识别;第三类将使用所有的模块进行训练。最终得到的结果如下表3所示:

Table 3. Recognition accuracy and parameter comparison under the ablation experiment
表3. 消融实验下识别准确率及参数对比
同时将训练过程中的各个损失进行记录,结果如下图10所示:
我们在图10中可以清晰的看到残差学习与注意力机制对于识别过程中损失的下降具有明显的加速作用,当采用普通的卷积层时,损失在前面几轮中下降速度较慢,效果不好。而在本次实验中是否采用STN对于损失的下降影响不大,然后通过上表3所示,我们可以看到STN对于最后结果中的识别准确率甚至更好,我们分析认为是因为本文的数据集不够完善,对于倾斜车牌的数量不够多,数据集中大部分车牌都是平整的,甚至不需要空间变换,因此STN对于整个网络的效果可能出现了副作用。但是考虑到之后我们将继续完善数据,待完善后再次进行分析观察是否需要STN,并且由表3中的参数量可知添加STN后的网络参数基本不变,不会对该模型的计算量造成过大的影响,因此我们这里暂时加上空间变换网络。同时,由表3所示,我们明显看到残差学习和注意力机制相结合的卷积模块能够大幅度的提升车牌识别的准确率,对于车牌识别的效果最是明显。

Figure 10. Comparison of ablation experiment on the loss
图10. 消融实验损失对比图
4. 结论
在车牌检测阶段本文在YOLOv4-tiny算法的基础上,通过精简网络结构优化参数解决了现实场景下的车牌定位困难等问题,此外,通过实验分析了先验框K-means和线性的拉伸未发挥出相应优势的具体原因,最后通过引入注意力机制使得检测结果的AP值达到93.60%,极大的提高了检测精度。在车牌识别阶段通过STN和残差模块以及注意力机制的融合,使得车牌识别不用再依靠繁琐的字符分割与字符识别,而是直接进行端到端的识别。最主要的一点是该方法能够进行混合车牌的识别,同时识别准确率达到了92.15%,有效的解决了混合车牌下需要不同算法的现实问题,使得车牌识别在实际项目中得以更好的应用。但由于车牌数据较难采集,若要更加准确的识别车牌省份的汉字则还需要大量的数据进行训练,而我们这里搜集的数据还不够完善。我们下一步计划是:1) 进一步完善我们的数据集,通过收集更多的全国省份的车牌来提高汉字识别率,并采集多种场景下的数据,比如雨天、雾霾以及严重的灰尘覆盖车牌和在这些场景下的倾斜以及远距离和近距离的车牌数据集。借此来提高在实际生活我们进行车牌识别的鲁棒性以及泛化性;2) 继续优化模型内的结构,优化识别网络中所用到的循环层,寻找一种比BLSTM与CTC更为高效的结构来进行识别;3) 验证STN在全面的数据集上是否有作用。
基金项目
本文得到山东省重大科技创新工程项目(No. 2019JZZY020102);江苏省重点研发计划项目(No. BE2018084);2019年工信部工业互联网创新发展工程项目——工业互联网标识解析二级节点平台项目(综合型应用服务平台)分包1项目(No. TC190A3X8-1);2019年工信部项目:国产数据库数据与应用迁移支撑验证关键技术攻关;2021年工业互联网创新发展工程——标识解析数据网关项目(No. TC210A02M);2021年工业互联网创新发展工程——工业实时数据库(No. TC210804D)的资助。。
NOTES
*通讯作者。