1 算法概述
1.1 算法功能
基于深度学习DTS的算法模型用于识别集装箱号和集装箱型。算法整合了文本检测和识别于一体,形成一个端到端的训练框架。这种利用单模型的检测识别方式,可加快整体的识别进程。其中文字检测使用YOLOv2和RPN算法获取候选文字区域。并采用双线性采样方式将文字区域变换为高度一致的变长特征序列,之后使用RNN和CTC算法进行识别,并通过识别结果的情况反作用于调整检测步骤中获选的文字方框,通过这种优化方式可进一步增加检测和识别的准确率。模型的训练方式为分别先训练检测模型和识别模型,之后再合并两个模型为一个模型继续训练并将此作为最终识别模型。所提算法在图片识别应用中可在高准确率下实现快速识别。
1.2 算法实现的目标
所提算法实现的功能为识别集装箱号和集装箱型,根据使用者拍摄的集装箱图片,通过模型可自动识别相应的箱号和箱型并以显示,支持的箱号类型可为1至4行,以及竖列的情况。可在各类箱型背景下,少于1秒内完成识别,且识别准确率达95%以上。
1.3 术语及缩写
YOLOv2(You Only Look Once) 为目标检测的一种模型,v2为此模型的第二版本
RPN(Region Proposal Networks) 候选区域网络
RNN(Recurrent Neural Network) 用于处理序列数据的神经网络
CTC(Connectionist Temporal Classification) 一种顺序识别模型
2 算法实现
2.1 算法流程图
2.1.1 整体流程
2,1,2 检测+识别流程图
2,2 算法及接口说明
2,2.1 算法说明
该方法将文字检测和识别整合到一个端到端的网络中。检测使用YOLOv2+RPN,并利用双线性采样将文字区域统一为高度一致的变长特征序列,再使用RNN+CTC进行识别。
2.2.2 接口说明
def container_ocr(file_name, pts):
输入参数:file_name:图片所在的路径
Pts:透视变换的预留参数
输出参数:text:集装箱号识别结果
Text_95:箱形代码识别结果
2.3 主要流程介绍
1.检测的FCN网络:使用YOLOv2的前18个convolution layer和5个max pool layer,去掉了最后的全连接层,最后输出的feature map是:W/32 * H/32 * 1024
2.Region Proposals:采用类似于RPN的anchor机制,回归参数5个,除了正常的RPN回归的x, y, w, h的相对值,还有角度ɵÎ[-pi/2, pi/2], 每个anchor点有14个anchor box,这14个anchor box的scale、aspects(angle范围怎么设?)通过在训练集上用k-means聚类得到正负样本选择,IOU最大为正anchor box,其他均为负样本
3. NMS使用:利用识别结果对检测结果进行反馈调整(取识别分数大于阈值的所有框进行nms)
4. Bilinear Sampling:将前面detection得到的大小不同的region proposal对应的feature统一成固定高度的feature(为了输入到识别的CNN中,识别的CNN有recurrent network,需要固定高度,但宽度可以变长),并且保持特征不会形变太多;
Bilinear Sampling特征映射公式如下:
κ(v) = max(0, 1 – |v|)是一个bilinear sampling kernel,T即为学出来的网格,实际上是一个坐标变换(就是一个矩阵)。
5.识别:传统的变长word识别思路
一个超大类分类器(每一个单词就是一类)
多个二类分类器(每一个位置预测一下是哪一类,类数=字符的总类数,例如英文就是62类)
识别流程:识别FCN(带RNN的)+ CTC(Connectionist Temporal Classification)
识别FCN:一堆conv + pool + recurrent conv + batch norm,最后接一个softmax,如下图:
6.CTC(Connectionist Temporal Classification):CTC的功能在于可以根据一个概率矩阵得到最可能的序列结果。这个输入的概率矩阵设为A(i, j),i Î[1, m],jÎ[1, n],m表示字符的类别总数(包括背景类,英文即为63类),是一个固定值,n与输入的图像长度相关(本文n=w/4)。A(i, j)可以理解为在水平位置i的滑窗里包含第j个字符的概率大小。输出的序列结果例如“text”等即为最终的识别结果。
CTC操作首先去掉空格和重复的字符(即为化简),然后对化简之后得到同一个单词的串概率求和,最后取总概率最大的字符串即为最终的识别结果。
7.对于多行的处理:先判断出前面4个字母所在的位置,再向下遍历每个文本块,对于符合条件的文本块进行合并,并且判断是否校验成功,由于没有进行多角度识别,所以识别率会比较低一点。
8.对于竖直类型的箱号的做法是对箱号区域进行二值化,二值化完后根据连通域进行切割,把每个字符都切出来在放到识别引擎进行识别,最后判断是否能验证通过。
3 算法不足及改进方向
1:算法对竖直的集装箱号上识别不了的,现在采用的是传统算法进行切割,这样对图片的要求会比较高。
2:对多行集装箱号识别会比较差一些,改进的方向是多训练多行的集装箱。
3:对倾斜严重的图片适应性不好,改进的方向:做透视变换或训练大量的倾斜图片进去。
4:由于箱型没办法做验证,所以识别率较集装箱号会比较低一点,只能进行大批量的训练效果才能好一些。