APP下载

基于深度学习的高效火车号识别

2020-12-11王志明刘志辉黄洋科邢宇翔

工程科学学报 2020年11期
关键词:剪枝字符校验

王志明,刘志辉,黄洋科,邢宇翔

1) 北京科技大学计算机与通信工程学院,北京 100083 2) 清华大学工程物理系,北京 100084

火车号是一个火车车箱的身份标识,一般喷涂在火车车箱的两侧,在铁路交通运输管理系统中经常需要获取火车号作为每个车箱唯一的标识来确认车箱当前的位置和状态等信息.采用人工记录的方式效率低、成本高,利用图像处理和模式识别技术自动识别火车号不仅可以节省人力,而且可以大大提高铁路运输管理系统的智能化程度.然而,利用火车号图像实现火车号的识别存在很多困难.首先,相对整个车箱,火车号区域占比非常小,要获得清晰可辨识的火车号需要较高的成像分辨率,而这又会导致整个图像像素数巨大,使得图像处理算法难以实时处理;其次,由于户外拍摄环境恶劣会导致对比度低、曝光不足或者过曝光,而且火车号图像背景复杂,存在脏污、锈迹、其他标识等较多干扰因素,导致准确定位火车号区域较为困难;第三,火车号字符本身存在字符粘连、笔画断裂、字符间距和排列规则多变等现象,这些都会导致字符分割和识别比较困难.

在近十多年中,基于深度学习的图像目标检测算法得到了长足的发展,检测精度相比传统方法有了很大的提高.深度学习与传统算法最大的区别在于其利用多层卷积神经网络自动学习图像特征,将特征提取和分类识别融为一体.自从2012年Krizhevsky等[1]使用深度卷积神经网络在大规模视觉识别挑战(Large scale visual recognition challenge, LSVRC)上获得冠军后,深度学习在图像、视频、语音等领域受到了广泛的关注[2].近年来,已有不少学者将深度学习算法应用于火车号识别、汽车牌号识别、集装箱号识别、车辆类型识别等领域[3-8].在廖健[3]提出的货车号识别算法中,通过分割边缘密度图像得到字符所在的候选区域,然后利用深度卷积神经网自动学习图像特征,再由两个softmax分类器分别完成字符检测和识别.这一方法只是在第二阶段采用了深度学习算法,检测火车号区域是传统方法,因此鲁棒性和识别精度会受到一定的影响.Li等[4]提出一种结合目标检测算法和序列串识别算法的车牌号识别算法,首先采用一个4层卷积神经网络检测所有可能的字符,并利用行程长度平滑算法(Run length smoothing algorithm, RLSA)和连通域分析得到候选车牌区;然后利用双向回归神经网络(Bidirectional recurrent neural networks, BRNNs)算法识别车牌号.但其中搜索车牌的过程涉及大量先验知识和基于规则的方法,难以进行整体优化.因此,后来作者又将前端的检测模块改为采用两阶段的目标检测算法[5].

Montazzolli和Jung[6]基于目标检测算法进行巴西车牌号检测与识别,分阶段检测汽车前脸、车牌区域和字符,考虑到速度和精度的折衷,采用了简化的快速目标检测算法,但没有对检测网络本身进行优化.Laroca等[7]在车牌和字符检测中采用了类似的策略,但在字符识别阶段增加了两个独立的网络分别进行数字和字母的识别.

本文采用基于深度学习的目标检测算法进行火车号识别,分别针对火车号图像分辨率高、存在校验位和实时性要求高等特点提出了相应的解决策略.本文的主要创新点包括:

(1)采用分阶段策略,先在低分辨率全局图像中检测火车号区域,再在高分辨局部图像中检测字符并识别火车号,实现实时高精度识别;

(2)字符检测过程中对每个区域输出多个候选类别概率,利用各个字符的概率对整个火车号进行校验纠错,在特定的目标检测精度下进一步提高整体识别正确率;

(3)结合批归一化因子和滤波器权重相关度进行模型通道剪枝,简化网络,提高检测速度和整体识别效率.

本文后续内容安排如下,第一部分介绍相关的深度学习目标检测算法,第二部分介绍整体识别框架,第三部分介绍火车号区域检测方法,第四部分介绍字符检测及校验纠错方法,第五部分介绍结合批归一化因子和滤波器相关度的剪枝算法,第六部分介绍实验数据及实验结果,最后是结论及下一步可能的改进方向.

1 基于深度学习的目标检测算法

目标检测算法是对图像内给定的一组目标进行定位和分类,一般用矩形框来标记目标位置.基于深度学习的目标检测算法可分为两类[9]:一类是二阶段方法,遵循传统的目标检测流程,先产生候选区域(Region proposal),然后对每个候选区域进行分类;另一类是一阶段方法,将目标检测视为一个回归和分类问题,采用统一的框架直接实现定位和分类.典型的二阶段方法有Faster R-CNN[10]、FPN[11]、Mask R-CNN[12]、Grid R-CNN[13]、Cascade R-CNN[14]等;典型的一阶段方法有SSD[15]、YOLO[16]及改进其损失函数的GIOU[17]和DIOU[18]、RetinaNet[19]、DSOD[20]等.近两年还涌现出一些不依赖于锚点(Anchor free)的方法,如 CornerNet[21]、CenterNet[22]、MatrixNets[23]等,旨在进一步改进对目标的定位精度.二阶段方法具有较高的准确率,但是检测流程复杂,因此相对速度比较慢;一阶段方法在检测速度和内存效率上有很大的优势,在实际工程中得到广泛的应用.综合考虑后,本文选择速度和精度都比较好的YOLOv3[24]进行火车号识别.

为了能检测不同大小的目标,YOLOv3算法在三个不同尺度的特征层上进行预测.YOLOv3算法采用网格化的思想,将每个特征层划分成固定大小的网格,每个网格设置3个锚框(Anchor)作为预定义的形状来预测目标.锚框可使用k-means聚类算法根据训练集上目标的形状分布计算聚类得到,从而减少预测误差并加速训练过程的收敛速度.

网络对每一个锚框预测四个坐标值:tx、ty、tw、th,其中tx和ty是目标中心点的偏移量,tw和th是目标宽高相对于锚框的偏移量.中心点偏移量是相对于网格单元左上角的坐标,算法采用逻辑回归函数将预测值tx和ty限制值在[0, 1]区间内;宽高偏移量是相对锚框的比例,采用指数函数将 [-∞, +∞]区间映射到 [0, +∞]区间.

假设某个网格单元相对于图像左上角的偏移是(cx,cy),锚框的宽和高是pw和ph,那么包围框(Bounding box)的预测值如下:

目标检测算法在定位的同时进行识别,除位置信息外还会同时预测这一包围框属于每个类别的概率Pi,0≤i<C(C为目标类别数).对于一般目标检测应用,取概率最高的类别作为识别结果即可.但对于具有校验位的火车号识别,其他次要类别概率信息也具有应用价值.当由于噪声造成单个字符可能识别错误时,可以利用后续的选项进行校验纠错.因此,在应用中本文修改网络输出部分的结构,对每一个检测位置输出多个可能的目标类别及相应的概率.

2 整体识别框架

本文的火车号图像采用线阵相机拍摄,即在固定位置放置由多个光学传感纵向排列组成的拍摄装置,每次曝光获取一列图像,当火车通过时采用固定的曝光频率不断拍摄,最终所有列组成一个二维图像.图像的高度由传感器数量决定,是一个固定的值;图像的宽度由曝光频率和拍摄时间来确定,当曝光频率固定时,由火车车体长度和运行速度来决定,宽度不固定.在本文的火车号识别中,图像高度固定为2048像素,宽度范围为5000~11000像素.图1是一个典型的火车号图像,其分辨率为2048像素×7168像素,图中红框所标为火车号位置,在全图中占比非常小.

整个车箱图像的分辨率很高,直接利用目标检测算法进行检测和识别计算量巨大,难以满足实时应用的需求.因此,本文提出一种由粗到细的两阶段识别策略.第一阶段,根据火车号分布的统计热力图从高分辨率完整图像中提取固定大小为1200像素×2400像素的区域,再降低分辨率缩小至288像素×576像素进行火车号区域检测;第二阶段,根据第一阶段检测结果从原始高分辨图像中提取出火车号区域图像,并缩放至288像素×416像素大小进行字符检测与识别.得到字符检测结果后,根据位置排列搜索完整火车号,并根据字符识别概率进行校验纠错.最后,对训练好的检测模型运用剪枝算法进行剪枝,并对简化的网络进行再次精调训练得到最终的高效检测模型.

整个识别流程如图2所示.

图1 火车号图像示例Fig.1 Example of a wagon number image

图2 火车号识别流程Fig.2 Pipeline of the wagon number recognition

3 火车号区域检测

由于原始火车车箱图像分辨率较高,火车号区域仅占很小的一部分,直接采用原图计算量太大,难以实时处理;如果直接缩小图像,又会使得火车号区域太小难以检测.因此,本文根据火车号的位置统计分布采用滑动窗口方式进行检测.

3.1 图像裁剪

本文将所有的火车号图像左上角设为原点,统计所有火车号出现的位置得到了火车号分布的热力图,如图3所示,其中红色对应于较高的频次,蓝色对应于较低频次.从图中可以看出火车号大部分都分布在图像靠左的位置,越往后火车号出现的频率就越小,另外垂直方向小于600像素和大于1800像素的区域几乎没有火车号出现(只有一处火车号出现在了1800像素以外的区域).因此,本文裁剪图像时在图像垂直方向取600~1800像素位置,从左到右依次截取分辨率为1200像素×2400像素大小的局部图像进行检测.如果检测成功,则进行下一步的字符检测和识别;如果检测失败(未检测到火车号区域),则向右滑动到下一个1200像素×2400像素的窗口进行检测.考虑到火车号区域可能位于截取图像的边缘,因此在裁剪时预留了一定的重叠区域来保证裁剪时火车号区域的完整性.图4为截取的局部图像示例.

图3 火车号分布的热力图Fig.3 Heatmap of the wagon number distribution

图4 火车号区域检测图像Fig.4 Images for the wagon number region detection

3.2 区域检测

对于剪裁得到的局部图像,直接进行检测还是计算量过大,将其按比例缩小至288像素×576像素大小.然后训练包含三个尺度的YOLOv3网络进行火车号区域检测.根据火车号的排列规则,将火车号区域分为三行和一行两种类型.

图5为三行和一行火车号区域检测结果及提取出的局部图像.所有局部图像区域归一化到固定大小,并对一行排列进行了边界填充,以保持和三行火车号相近的字符宽高比.从图5(b)可以看出,即便经过归一化,字符的大小相差还是非常大,因此需进行多个尺度的字符检测.

4 火车号识别

得到火车号区域图像后,下一步的任务是从图像中检测到所有构成火车号的字符,并根据先验知识搜索得到火车号.最后,进行校验计算,如果校验通过则输出火车号,否则根据每个字符的识别概率和候选类别进行纠错,直到校验通过或输出识别失败信号.

4.1 字符检测

对于上一阶段剪裁得到的火车号区域图像,统一缩放为288像素×416像素大小进行字符检测.组成火车号的12位数字通常有两种排列方式:一种为单行排列,另一种为三行排布,三行排列的火车号由每一行前2、2、8个数字组成.对于一行排列的火车号,从左到右依次搜索12个字符;对于三行排列的火车号,从上到下、从左到右依次搜索包含2、2、8个字符的字符行.

为保证检测效果,对一行排列方式采用宽高等比例缩放方式,不足区域补充为中等灰度值128.检测模型同样采用包含三个尺度的YOLOv3算法,但输出类别数为10,对应10个数字.图6为字符检测结果示例,从图中可以看出,YOLOv3算法可以很好地检测颜色、亮度、尺度差异非常大的字符.

对于网络检测得到的所有字符,根据火车号排列规则从上到下(三行排列)、从左到右依次找到组成火车号的12个字符.记录网络输出的每个字符按概率从大到小8个可能的类别及相应概率,即得到一个12×8的类别和概率矩阵,每个字符的候选类别按概率进行降序排序,作为下一步搜索最终火车号的输入信息.

4.2 火车号校验与纠错

图5 火车号区域检测结果.(a)区域检测结果;(b)提取到的局部区域图Fig.5 Wagon number region detection results: (a) region detection results; (b) extracted region image

图6 火车号字符检测结果示例Fig.6 Examples of wagon number character detection results

根据火车号编码的国际标准,火车号由12位数字组成,其中最后1位为校验位,它可以由前11位Luhn算法计算得来,校验位可以用来判断识别的火车号是否正确.第12位校验数字的生成方式如式(3)所示.

其中,ki为加权系数,对奇数位为2,对偶数位为1,di表示第i位火车号数字,“/”表示整除,“%”表示模运算.计算各位数字乘以权重后得到数字的个位和十位相加之和,并取距离下一个最近的10的整数倍的差值作为校验结果.

对上一步得到的字符与概率矩阵,首先选择每一位最大概率的数字进行校验,如果校验通过,则输出这些数字作为火车号的识别结果;如果校验错误,则需根据概率矩阵进行替换纠错.替换的策略是:将每个位置的最大概率排除后,在其他的概率值中寻找最大的概率值,用对应的类别替代当前位置最大概率所对应的类别,然后再对新的数字串进行校验,如果通过则视为纠正正确,输出新的火车号;否则,恢复交换前位置,再接着寻找下一个最大的概率值,如此迭代进行直到校验正确,或尝试的次数超过10次为止.

如图7是一个校验纠错的例子.图中每一行对应一个位置的检测结果,包含依概率排列的8个可能的类别号及其相应概率,一共12行对应搜索到的构成火车号的12个字符.如果取第一列概率最大的结果,则会发现校验错误.原因是第10位字符错误地将数字“8”识别为数字“9”,可以看出排除第一列最大概率后,第10位字符为“8”的概率要比其他所有的概率都要大,因此将第10位的“9”替换为“8”(图中红框所示),此时校验通过,得到正确的火车号.

5 检测模型优化

在实际工程应用中,除识别准确率外,识别速度也是一个影响使用效果的关键因素.深度神经网络的计算量主要消耗在卷积层特征提取阶段,随着网络中各个卷积层中通道数的增加计算量急剧增加.通道数一般都是人工根据经验设定,但不同应用所需要提取的特征数可能不同.因此,可以通过一定的剪枝技术去除多余的通道,从而降低计算量,提高检测速度.

图7 每个字符对应的前8个最大概率类别、概率值及校验纠错位Fig.7 Top 8 class and corresponding probabilities of every character and correction by verification

本文采用“静态剪枝+精细调节”的方式进行网络剪枝,参考基于批归一化(Batch norm)因子剪枝算法[25]并进行改进,综合考虑滤波器权重之间的相关性和批归一化因子生成通道重要性因子,然后根据这一重要性因子对YOLOv3网络的各个卷积层进行剪枝,最后对剪枝过的网络进行精调训练,得到优化后的检测模型.

批归一化层的输入与输出关系如式(4)所示.

其中,µB和 σB分别为当前层输入的均值和标准差,ε为一个小的正数,防止出现除零现象.γ和β分别为批归一化层的归一化因子和偏置值,通过网络学习得到,其中 γ在一定程度上代表了各个通道的重要性.但这种剪枝方法没有考虑到滤波器之间的相似度,在剪枝过程中可能会把两个 γ值较大、但相关性较高的通道同时保存下来.因此,本文综合考虑批归一化因子和相关性计算一个滤波器的重要性.设某一卷积层的卷积核大小为r×r,输入通道数为m,输出通道数为n,则该层共有n个r×r×m的三维滤波器,对应于每个输出通道.将每个滤波器中所有权重看作一个一维向量wi,则第i个滤波器与第j个滤波器之间的相关度可由下式得到:

其中,Cov(·,·)表示协方差,Var(·)表示方差.由相关度产生的重要性因子记为1减去每个滤波器与其他所有滤波器相关度的和(经归一化处理),如式(6)所示.

如果记由批归一化因子产生的重要性为:

每个滤波器的最终重要性因子定义为:

其中,α1和α2为两个正系数,分别代表批归一化因子和相关性的加权系数,实验中取α1=α2=0.5.

得到重要性因子后,根据重要性因子从大到小对滤波器进行排序,剪枝一定比例的滤波器(实验中取50%),降低平均输出通道数(特征维度).再经过精调训练,在保证检测准确率的条件下简化网络,提高检测效率.

6 实验结果及分析

6.1 数据集介绍

本文实验用的火车号图像采用线阵相机拍摄,每张图像都包含需要识别的12位符合火车号编码国际标准的火车号,一共采集了5397幅原始图像,其中只有单行排列火车号的1678幅,只有三行火车号的2054幅,既包含单行火车号又包含三行火车号的1665张图像(两个号码相同).

由于原始的火车号图像分辨率太大,根据火车号分布热力图从每一个原始图像上裁剪分辨率为1200像素×2400像素的图像用于训练火车号区域检测模型,裁剪时保证每张图像都包含火车号,且火车号在图像上分布的位置随机.然后在每个图中标注其中的火车号字符,根据字符标注可以生成用于训练火车号区域检测的区域标记,同时提取火车区域及相应的字符标注作为训练字符检测的样本.从所有数据集中随机提取1072个样本作为测试集,其余4325个作为训练样本.

6.2 评价指标及结果

对于两个阶段的检测模型,采用目标检测常用的综合评价指标平均精度均值(Mean average precision,mAP)进行评价.另外,在一个带有Nvidia GTX 1060显卡的笔记本电脑上测试了平均检测时间和显存占用量,以衡量算法的计算效率.

除YOLOv3外,同时基于MMDetection目标检测算法框架[26],比较了经典的目标检测模型Faster-RCNN[10](主干网络为 ResNet50)和 SSD[15](主干网络为VGG16).每个模型都经过充分训练后,选择最优结果.表1为火车号区域检测和字符检测的实验结果.

从表1可以看出,两个阶段的检测都具有较高的mAP,且YOLOv3的性能和Faster-RCNN及SSD基本相当.区域检测比字符检测具有更高的mAP,可能是由于区域类别少、面积大,检测相对更为容易.另外,经过剪枝和再训练的模型具有更高的精度,这可能是因为样本数量相对较少,在模型简化后在一定程度中抑制了训练过程中的过拟合现象.剪枝后模型的大小只有原来1/3左右,显存占用率节约30%左右,计算时间节省1/3左右.与Faster-RCNN相比,模型较小,虽然显存占用较多,但平均处理时间有很大的优势;与SSD相比,剪枝前模型较大,剪枝后模型较小,显存占用较多,但平均处理时间也有较大的优势.考虑到应用现场对识别速度的苛刻要求,本文选择采用YOLOv3并结合模型剪枝实现整个识别系统.

表1 火车号区域检测和字符检测的实验结果Table 1 Results of wagon number region detection and character detection

基于C++程序语言设计实现了一个完整火车号识别系统,集成两个阶段的检测结果完成完整的火车号识别功能,并在第二阶段按字符概率进行火车号校验纠错.识别效果在包含1072张原始火车号图像的测试集上评价,所有12位火车号全部识别正确视为结果正确.

在第一阶段检测中,有的图像中会包含两个排列方式不同但号码相同的火车号.因此,在整个系统识别流程中,当第一阶段检测到图像中存在不止一个火车号时,先对识别置信度大的火车号区域进行字符检测和火车号识别,若检测到足够多的字符且校验正确,则完成识别;否则,对下一个候选火车号区域进行字符检测和识别.另外,在识别过程中可能出现识别的火车号字符位数小于12位,这种情况一般是由于火车号区域定位不准确导致包围框未能包含所有的火车号字符,此时将包围框的左右边界各向外扩大宽度的10%进行再次检测.实验结果表明,这一处理可以进一步提高识别正确率.

为验证校验纠错的有效性,以及模型剪枝后对整体识别性能的影响,对比了有无校验纠错和有无模型剪枝的整体识别效果,结果如表2所示.从表中可以看出,校验纠错过程在平均时间提高极少的条件下可将整体识别正确率提高2.80%.通过对两个阶段目标检测模型的剪枝简化,在平均处理时间减少约15%的同时,识别正确率提高了0.56%,从而可以更好地满足实际工程应用的需求.

7 结论

火车号在整个车箱上只占很小的一部分,为准确识别需要采用较高的分辨率,而高分辨率又造成图像像素数巨大,现有的深度学习算法和硬件条件难以进行实时处理.本文提出一种由粗到细、分阶段进行目标检测的火车号识别算法,较好地解决了在高分辨大图中检测和识别相对很小的火车号目标的问题.

表2 校验和模型剪枝对识别结果的影响Table 2 Influence of model pruning and verification on the recognition results

基于火车号编码所包含校验位的先验知识,本文在第二阶段的检测中输出多个候选类别概率,从而可以依照概率对个别位识别错误的结果进行校验纠错,在同样的目标检测精度下提高了整体识别正确率.

针对实际应用中对实时处理的要求,本文提出一种结合批归一化因子和滤波器相关性的通道剪枝方法,经过对两个阶段检测模型的剪枝和优化训练,在提高处理速度的同时使得整体识别正确率略有提高.

下一步的可能的研究方向包括:采用更为高效的目标检测算法以提高识别正确率;在模型剪枝过程中采用更为合理的滤波器重要性度量,以实现更高比例的模型压缩,从而进一步提高处理速度.

猜你喜欢

剪枝字符校验
人到晚年宜“剪枝”
使用Excel朗读功能校验工作表中的数据
基于YOLOv4-Tiny模型剪枝算法
基于激活-熵的分层迭代剪枝策略的CNN模型压缩
字符代表几
一种USB接口字符液晶控制器设计
图片轻松变身ASCⅡ艺术画
HBM电子称与西门子S7-200系列PLC自由口通讯
炉温均匀性校验在铸锻企业的应用
电子式互感器校验方式研究