基于多任务目标检测的条形码倾斜矫正算法研究
2019-10-18李功燕许绍云
易 帆 李功燕 许绍云
1(中国科学院微电子研究所 北京 100029)2(中国科学院大学 北京 100049)
0 引 言
条形码技术在实际生活中已经取得广泛应用,例如在物流快递、医疗、交通、仓储、生产自动化、票务单、商场等场景极大方便了人们的日常工作。通过将条形码图像输入计算机,按照预定的规则解码出条形码信息,不再需要人工手动输入,完全由机器完成,避免人工录入带来的失误,提高了生产效率。然而,实际场景中输入图像内容不全是条形码,还存在很多背景干扰信息,因此在识别条形码内容之前需要检测定位输入图像中条形码的位置。另外,考虑到条形码可能存在倾斜的情况,需要在检测定位条形码位置之后再进行角度矫正,条形码矫正结果的好坏直接影响后续条形码译码的准确率和速度。当前条形码技术研究主要集中在条形码检测定位上,矫正研究较少并与检测分开处理,无法协同发挥促进两者的相互作用。故本文以物流快递包裹自动化分拣场景为背景,基于深度学习中目标检测技术研究条形码倾斜矫正相关算法,以提高最终条形码倾斜矫正的效果。
1 相关工作
随着条形码技术的广泛运用和应用场景的复杂化,越来越多的条形码识别算法被提出,主要分为传统的数字图像处理和深度学习两类算法。
在早期,条形码识别算法主要是基于传统的数字图像处理。文献[1-2]借助边缘检测算子对输入图像进行操作获取梯度特征区域,并通过自适应阈值滤除大部分背景,再通过主梯度及Hough变换获取倾斜方向矫正条形码,最后依据条码特征合并候选区域。文献[3]首先生成输入图像的方向直方图,去除背景区域和杂波,并分析基于局部熵的方向分割出条形码区域,最后分析合并条码区域。文献[4]采用Harris角点检测器和Hough变换算法估计待检测条码区域的旋转角度,再通过条形码区域的连通性和几何特性来直接识别单个视频帧中的多个条形码区域。文献[5-7]通过提取滑动窗口的局部二值模式(Local Binary Pattern,LBP)或者方向梯度直方图(Histogram of Oriented Gradient,HOG)特征,送入支持向量机(Support Vector Machine,SVM)分类器判断所属类别,进而将连通子块合并得到条码区域,最后由Hough变换算法矫正条形码。文献[8]利用主成分分析PCA算法提取条形码主要特征,再通过SVM算法判别条码区域的可能性。以上算法一般需要手工设计特征和规则,无法适应在物流包裹分拣场景下,条形码图片因为光照不均、背景干扰、包裹扭曲形变、模糊、污损等情况造成图片质量下降和特征不明显,进而算法性能大打折扣。
近年来,深度学习技术快速发展,凭借着其强大的拟合和提取特征能力,已经在绝大多数图像领域取得优于传统图像处理算法的效果。文献[9]提出了一种基于双金字塔结构的分割网络BarcodeNet,分割提取条形码区域。文献[10]提出一种基于卷积神经网络的级联条形码检测算法。首先使用Faster-Rcnn[11]目标检测算法获得条形码区域,再借助最大稳定极值区域(Maximally Stable Extremal Regions,MSERs)算法消除背景噪声并检测条码方向,最后通过自适应流形(Adaptive Manifold,AM)滤波器处理模糊条形码区域,整个算法流程由于多阶段处理速度较慢。文献[12]通过YOLO[13]目标检测算法定位条形码区域,之后将条形码区域裁剪放缩至正方形送入一个角度矫正卷积神经网络预测条形码的倾斜角,然而这两部分网络提取特征存在重复冗余,并且直接回归预测倾斜角误差偏大。针对以上条形码检测矫正算法的不足,本文基于深度学习目标检测算法改进条码检测矫正的效果和速度。
2 算法设计
目标检测一直是计算机视觉领域的基础问题,主要关注的是图片中特定目标物体的位置。一个检测任务包含两个子任务:一是输出这一目标的类别信息,属于分类任务;二是输出目标的具体位置信息,属于定位任务。传统的目标检测算法主要通过区域选择、特征提取和分类回归三个步骤组成,然而,区域选择的策略效果差、时间复杂度高,手工设计提取的特征鲁棒性较差。随着深度学习的介入,这三个步骤可由一个端到端的卷积神经网络完成,极大地提高了目标检测的准确率。目前主流的基于卷积神经网络的目标检测算法主要分为两类:一个是以Faster-Rcnn为代表的两阶段检测器,通常先进行前背景分类和回归框粗调,再进行目标分类和回归框精调,检测准确率高但速度偏慢;另一个是以YOLO和SSD[14]为代表的单阶段检测器,直接进行类别预测和位置回归,检测准确率稍低于Faster-Rcnn但速度快。由于实际生产环境中对条形码识别速度要求严格,故本文以单阶段检测器为基础,改进检测器结构,提出一种多任务目标检测的条形码矫正算法。
2.1 单阶段检测器结构
单阶段检测器模型整体上由基础网络(Backbone Network)和检测头部(Detection Head)构成,如图1所示。前者的作用主要是特征提取,给出输入图像不同大小、不同抽象层次的语义特征信息表示;后者则根据这些语义特征表示和监督信息完成待检测目标的分类和定位任务,分类的结果是输出类别标签,定位的结果是输出检测矩形框的位置信息,包含矩形框的中心位置坐标(fx,fy)和宽高(fw,fh)。检测头部网络负责的类别预测和位置回归两个任务一般是并行进行的,构成多任务的损失进行联合训练。
图1 单阶段目标检测结构示意图
2.2 倾斜矫正网络结构设计
式中:m为分类网络输出的象限值。
图2 条形码倾斜角度定义示意图
图3 象限划分示意图
获得倾斜条形码角度值之后,通过仿射变换可以矫正条形码,由于倾斜角是从水平方向开始逆时针旋转定义的,故实际条形码需要逆时针旋转(90-θ)度(若旋转角为负值,顺时针旋转即可),旋转变换矩阵为:
最终,检测头部结构如图4所示。首先从特征提取基础网络中抽取特征图,假设特征图的大小为S×S×D,通过3×3卷积运算获得特征图待检测张量,将张量划分为S×S个格点,每个格点设置B个预设锚框(Anchor),如图5所示,这样每个格点最多可以检测B个中心落在此格点内的目标。每个格点向量中具体值含义为:对于每一个Anchor,输出检测矩形框的4个坐标信息(fx,fy,fw,fh);N个属性类别标签值,其中N-1个值代表实际类别数目,剩下1个代表背景类别;M个象限类别标签值;1个角度回归值。最终每个格点向量的长度为B×(4+N+M+1)。
图4 带倾斜校正的检测头部示意图
图5 Anchor设置示意图
2.3 多任务损失函数
为了训练优化设计的网络结构,需要设定合理的损失函数,最终的损失主要包含三项:分类损失、边界框回归损失和角度矫正损失。
分类损失主要涉及到属性分类损失和象限分类损失,考虑到正负样本比例会影响最终网络的训练效果,故设计一种类别均衡的Softmax交叉熵损失进行计算:
回归输出的位置坐标信息(fx,fy,fw,fh)其实代表一种偏移变换关系,中心点坐标信息的预测值(fx,fy)是相对于Anchor左上角坐标的偏移值,边界框宽高信息的预测值(fw,fh)是相对于Anchor长宽的变化比例,具体计算方式如下:
式中:(xp,yp,wp,hp)、(xa,ya,wa,ha)和(xg,yg,wg,hg)分别是预测回归框、Anchor和真值标记框的中心点坐标和宽高;(tx,ty,tw,th)代表真值标记框相对于Anchor的变换关系。边界框位置回归损失函数选择Smooth-L1:
从Smooth-L1损失函数可以看出,借助Anchor作为中间桥梁,预测回归框不断向真值标记框靠近调整,同时引入偏移量和log变换限定输出量的范围,保证每一个Anchor负责检测周围附近单位以内的目标,使得模型更容易收敛并且损失保持在合理的量级上,可以看作一种标准化操作。
回归角度损失函数若采用常见的L2损失函数,会导致损失函数对角度值偏差大的条形码更加敏感,使得最终网络对于小角度偏差的条形码矫正效果差。采用Smooth-L1损失函数能缓解上述问题,但是并不是针对角度量设计的。故本文采用余弦距离函数归一化角度值,保证网络最终的角度回归效果:
Langle=1-cos(θ-θ*)
式中:θ为预测回归角度;θ*为真值标注角度。
综上,将上述的分类损失、定位回归损失和角度回归损失合并,得到最终的多任务损失函数:
L=Lcls+λ1Lloc+λ2Langle
式中:λ1和λ2为平衡这三者的权重因子,本文通过交叉验证设置λ1值为2,λ2值为10。
3 实 验
3.1 实验准备
本实验标注了5 320张来自物流包裹分拣现场的条形码图片,取出其中20%作为测试集,剩余作为训练集,并通过数据增强如小角度旋转、平移、翻折、缩放和裁剪等操作扩充训练样本集。输入图片大小为512×512,在送入模型网络之前进行去均值归一化等预处理操作。实验的软件环境为Ubuntu 16.04 LTS,使用的深度学习架构是keras;硬件的配置是:CPU为56 Intel(R) Xeon(R) CPU E5-2683 v3 @ 2.00 GHz;GPU为6块NVIDIA TITAN Xp,每块12 GB显存。
3.2 角度矫正评价标准
为了最终衡量条形码倾斜矫正的效果,通过以下角度评价标准进行计算:
J(θ,θ*)=|θ-θ*|
式中:J(θ,θ*)代表预测回归角度θ和真值标注角度θ*之间的绝对值误差;α为角度误差容忍因子;S为整个测试数据集中检测到条形码图片的数量;#()代表满足括号内条件的条形码图片个数;Rα为在某一角度误差容忍因子α下的矫正准确率。除此之外,为实际检验条形码矫正的效果,采用条形码译码开源算法ZXing和ZBar对矫正之后的图片进行识别。
3.3 实验结果与分析
首先,通过实验验证选择合理的角度回归损失函数。实验中单阶段目标检测算法选择YOLOv3和ResNet50-SSD,检测头部中象限分类值M设置为1,实验结果如表1所示。
表1 不同角度回归损失函数的矫正效果 %
从表1中可以看出,L2损失函数在R1下表现远低于Smooth-L1和余弦距离损失函数,表明L2损失函数对于大角度误差更加敏感。另外,在R1、R3和R5所有评价标准下,余弦距离损失函数均取得最优的表现效果,证明其更加适合角度回归相关任务。
表2展示了本文设计的倾斜矫正算法与其他算法的对比结果。文献[10]采用YOLO目标检测算法和角度矫正卷积神经网络完成条码检测矫正,本文设计了YOLO+Ours(M=1)实验与之对比,其象限分类数M为1,即和文献[10]中角度矫正卷积神经网络一样直接回归倾斜角度。从结果可以得出,YOLO+Ours(M=1)不管在矫正准确率、实际译码率和耗时上都优于文献[10],文献[10]设计的角度矫正网络存在冗余,没有充分利用YOLO目标检测算法已经通过卷积网络充分提取到的特征语义信息,卷积计算的共享程度低。因此本文直接将倾斜矫正任务嵌入到YOLO目标算法中取得更优效果。
表2 不同倾斜矫正算法效果对比
作为空白对照,进行了YOLO(No Rotation)和YOLO+GT Rotation两组实验。YOLO(No Rotation)是直接进行条形码检测,不进行倾斜矫正操作,可以看出最终实际译码率非常低,说明倾斜矫正对于提升译码率至关重要。YOLO+GT Rotation是在YOLO算法检测到条形码之后,通过真值标注角度进行矫正,最终得到最高的译码率。除此之外,设计了基于传统数字图像算法Hough变换的实验YOLO+Hough,将YOLO算法检测出的条形码区域送入Hough变换算法进行矫正,YOLO+Hough在矫正准确率和实际译码率均取得不错效果,但是由于耗时237 ms,在实际物流包裹分拣场景下与其他算法相比并不占优。
最后,以YOLOv3检测算法为基础设计了4组实验探究本文设计的倾斜矫正算法中象限分组数M对于最终结果的影响。结果表明,随着象限分组数M的增大,矫正准确率和实际译码率逐步提高,说明在直接回归倾斜角之前进行象限分组有助于降低回归角度的难度,但是在M大于等于3之后,提升效果有限。另外,R1矫正准确率的提升幅度并没有R3和R5大,说明精确回归倾斜角度难度较大。
图6展示了本文设计的倾斜矫正算法的效果示意图,倾斜位置的条形码图片能够很好地被矫正水平,完成了实际物流包裹分拣场景下条形码的矫正任务。
图6 条形码检测矫正结果示意图
4 结 语
针对物流包裹分拣场景下的条形码识别问题,本文提出一种基于多任务目标检测的倾斜矫正算法。该算法以深度学习中的单阶段检测器为基础,嵌入了条形码倾斜角度预测的任务,通过先对条形码倾斜程度分类再回归角度的策略,大大降低了倾斜矫正任务的难度。最终通过实验验证本文算法在效果和速度上都明显优于其他算法,并且象限分组和余弦距离角度损失函数对最后矫正准确率提升明显。