李世伟
(上海建桥学院 上海市 201306)
YOLOv5 目标检测算法是将物体的定位和分类在一起完成,在一个输出层回归bounding box 的位置和所属类别,在场景复杂的地方,误检会相对较多,而LPRNet[1]由轻量级的卷积神经网络组成,它采用端到端[2]的方法来进行训练,并且创建嵌入式部署的解决方案,以此来提高车牌识别的准确率和运算效率。
在车辆目标检测与车牌识别过程中,通过使用构成YOLOv5 模型的骨干网络CSPDarknet5 与LPRNet 的Backbone 来提取车辆图片信息的特征。然后,利用这些特征对LPRNET 和YOLOv5 的Neck 与Head 部分进行训练,最后,利用训练好的模型对车辆与车牌进行目标检测。图1显示了使用YOLOv5 模型进行车辆目标检测与LPRNET 模型进行车牌识别的框架。一般来说,该方法分为模型训练过程和模型推理两部分。在训练过程中,利用标注好的数据进行提取特征,支持目标检测与车牌识别任务的训练。在识别过程中,将车辆图片信息输入给训练好的混合模型进行识别。
图1:Yolov5 模型车辆目标检测与LPRNET 模型车牌识别框架
2.1.1 输入端
YOLOv5 模型的输入端采用了和YOLOv4[3]模型一样的数据增强的方式,即Mosaic 数据增强,利用随机缩放、随机裁剪、随机排布的方式进行拼接,对于小目标的检测效果具有明显提升。YOLOv5 算法针对不同的数据集,都会有初始设定长宽的锚框。在网络训练中,网络在初始锚框的基础上输出预测框,进而和真实框Ground Truth 进行比对,计算两者差距,再反向更新,迭代网络参数。在常用的目标检测算法中,不同的图片长宽都不相同,因此常用的方式是将原始图片统一缩放到一个标准尺寸,再送入检测网络中。比如YOLO 算法中常用416×416,608×608 等尺寸。
YOLOv5 代码中对此进行了改进,也是YOLOv5 推理速度能够很快的一个不错的技巧。在实际的应用场景中,很多图片的长宽比不同,所以通过缩放填充后,两端的黑边大小不一致,并且填充的比较多,则会导致信息冗余,影响模型推理速度,只要在原图像自适应地添加最少黑边,在推理时,计算量减少,目标检测速度就能得到提升。
2.1.2 骨干网络
该层的Focus 结构,从高分辨率图像中,周期性的抽出像素点重构到低分辨率图像中,即将图像相邻的四个位置进行堆叠,聚焦wh(width&&height)维度信息到C(channel)通道空间,提高每个点感受野,并减少原始信息的丢失,该模块的设计主要是减少计算量加快速度。YOLOv5 默认3×640×640 的输入,先复制四份,然后通过切片操作将这个四个图片切成了四个3×320×320 的切片,接下来使用concat从深度上连接这四个切片,输出为12×320×320,之后再通过卷积核数为64 的卷积层,生成64×320×320 的输出,最后经过batch_borm 处理和Leaky_ReLU 激活处理将结果输入到下一个卷积层。
该层的BottleneckCSP 模块主要包括Bottleneck 和CSP两部分,YOLOv5 模型中的的Cross Stage Partial(CSP)结构,其初衷是减少计算量并且增强梯度的表现。主要思想是:在输入Dense_block 之前,将输入分为两个部分,其中一部分通过block 进行计算,另一部分直接通过一个shortcut 进行concatenate。模型采用CSP 结构的有加强卷积神经网络的学习能力,减少计算算力与内存消耗的优点,现在的网络大多计算算力成本昂贵,不利于深度学习的工业落地。
该层的SPP 模块(空间金字塔池化模块),其作用就是将不同的特征图转化为固定的特征图,通过分别采用5/9/13的最大池化,再进行concat 融合,提高感受野。SPP 的输入是512×20×20,经过1x1 的卷积层后输出256×20×20,然后经过并列的三个MaxPool 进行下采样,将结果与其初始特征相加,输出1024×20×20,最后用512 的卷积核将其恢复到512×20×20。
2.1.3 Neck 层
YOLOv5 的Neck 层采用PAN+FPN 的结构,PANET 基于Mask R-CNN 和FPN 框架,加强了信息传播,具有准确保留空间信息的能力,可以对像素进行适当的定位以形成掩模。
2.1.4 输出层
YOLOv5 中采用其中的GIoU_Loss 做Bounding box 的损失函数。GIoU 的全称为通用交并比,对于任意的两个A、B 框,首先找到一个能够包住它们的最小方框C。然后计算C (A ∪ B) 的面积与C 的面积的比值,再用A、B 的IoU 值减去这个比值得到GIoU,所以GIoU_loss=1-GIoU。注:C (A ∪ B) 的面积为C 的面积减去A∪B 的面积。GIoU 损失函数计算如下:
LGIOU=1-IOU(A,B)+|C-A ∪ B|/|C|
2.1.5 训练
本设计目标检测模型是基于Windows10 操作系统,python3.7,torch1.20,cuda11 以及torchvision0.40 的环境进行训练。本论文目标检测部分使用VOC 格式数据集进行训练。训练前将标签文件放在VOCdevkit 文件夹下的VOC2007 文件夹下的Annotation 中,训练前将图片文件放在VOCdevkit 文件夹下的VOC2007 文件夹下的JPEGImages中。
在配置参数上,可通过pytorch 提供的API 进行训练参数修改,方便修改训练模型的超参数与文件配置。对于模型存放路径,可通过init_logger 函数,进行对模型的进行实时保存到目标文件夹,同时生成日志文件,可观测模型训练时的epoch、loss、accuracy 等模型训练指标。在环境配置好与数据集准备存放好后的情况下,最后直接运行python train.py 就可直接训练。
2.2.1 输入端
LPRNet 在输入端采用STN(Spatial Transformer Network)网络对输入图像进行处理,STN 处理是可选的过程,STN的出现使我们完成如何变换图像来获得优秀的车牌识别输入图像。我们选择LocNet 网络结构用于产出最佳的转换参数来实现。如表1 所示。
表1: LOCNET 结构
2.2.2 骨干网络
LPRNet 采用轻量级的CNN[4]骨干网络,LPRNet 骨干网络输入原生RGB 图像,使用CNN 来提取图像特征。骨干子网络的输出可认为是一个代表对应字符概率的序列,它的长度与输入图像的宽度相关。主干结构如表2 所示。
表2:主干结构
2.2.3 训练
本设计车牌识别模型是基于Windows10 操作系统,python3.7,torch1.20,cuda11 以及torchvision0.40 的环境进行训练。可通过pytorch 提供的API 进行训练参数修改,方便修改训练模型的超参数与文件配置。可通过pytorch 提供的API 进行训练参数修改,方便修改训练模型的超参数与文件配置。如图2 所示。
图2:配置参数
在环境配置好与数据集准备存放好后的情况下,最后直接运行python train_LPRNet.py
就可直接训练。
2.2.4 实验结果
本LPRNet 网络设计在CCPD[5]中文车牌数据集进行实验,车牌通过YOLOv5 车牌检测方法获得,数据集按照9:1的比例分为测试集和训练集,本文使用开源出来的模型权重进行实现识别车牌的下游任务。LPRNet 在不同设备上的表现如表3 所示,可以看出LPRNet 可以用于需要实时处理的任务。
表3:性能分析
本设计的目标检测数据集使用VOC2007 标注好的数据集,总数为9963 张图片,其中包括训练数据集5011 张和测试数据集4952 张。
车牌检测与识别数据集来源于标注好的CCPD 数据集,CCPD 数据集一共包含超多25 万张图片,每种图片大小720x1160x3,选取部分CCPD 数据集作为本设计中的车牌检测与识别的数据集,总共包含9 项,占比如图3 所示。
图3:车牌检测与识别数据集占比
每项占比的意义如表4 所示。
表4:CCPD 数据集占比及其意义
本设计在识别精确度、模型推理速度与可视化呈现结果上都取得了良好的效果。现有的车辆与车牌检测和车牌识别方法大多集中在车辆的颜色、大小和形状上,受天气和光照,相机拍摄等因素的影响很大。通过对YOLOv5Net 与LPRNet 提取的特征进行了分析,利用与视觉任务强相关的测试样本集对目标检测模型与车牌识别模型进行测试。实验结果表明[6],当测试样本场景与视觉任务相关度越高,得到的目标检测模型与车牌识别模型的效果越好,能够为交通车辆识别与管理等作业提供可靠、高效的车辆信息。
该设计在实际应用中,还存在着一些不足,如在模型推理的速度上还需要精进,为了模型的实际部署应用还需要模型蒸馏方便部署在各种硬件设备。