CRNN笔记以及数字检测识别实践

本站访问次数:

主流的OCR识别分为两个部分:先检测出文字区域再识别文字。检测可采用通用的目标检测方法以及针对于文本检测的网络,识别主要是CRNN及其变体。在上文中针对EAST做场景文字检测定位,现在针对OCR的第二部分–识别,以最早的CRNN为例子。然后整合了AavancedEAST以及CRNN,实现场景数字号码检测与识别。

CRNN论文笔记

论文主要创新点

  • 提出卷积循环神经网络(CRNN),组合DCNN和RNN,其网络架构设计专门用于识别图像中的类序列对象。
  • CRNN与传统神经网络模型相比具有一些独特的优点:1)可以直接从序列标签(例如单词)学习,不需要详细的标注(例如字符);2)直接从图像数据学习信息表示时具有与DCNN相同的性质,既不需要手工特征也不需要预处理步骤,包括二值化/分割,组件定位等;3)具有与RNN相同的性质,能够产生一系列标签;4)对类序列对象的长度无约束,只需要在训练阶段和测试阶段对高度进行归一化。

网络结构

网络架构。架构包括三部分:

  • 卷积层: 从输入图像中提取特征序列;
  • 循环层: 预测每一帧的标签分布;
  • 转录层: 将每一帧的预测变为最终的标签序列。

在CRNN的底部,卷积层自动从每个输入图像中提取特征序列。在卷积网络之上,构建了一个循环网络,用于对卷积层输出的特征序列的每一帧进行预测。采用CRNN顶部的转录层将循环层的每帧预测转化为标签序列。虽然CRNN由不同类型的网络架构(如CNN和RNN)组成,但可以通过一个损失函数进行联合训练。

特征序列提取

在CRNN模型中,通过采用标准CNN模型(去除全连接层)中的卷积层和最大池化层来构造卷积层的组件。这样的组件用于从输入图像中提取序列特征表示。所有的图像需要缩放到相同的高度。然后从卷积层组件产生的特征图中提取特征向量序列,这些特征向量序列作为循环层的输入。具体地,特征序列的每一个特征向量在特征图上按列从左到右生成。这意味着第i个特征向量是所有特征图第i列的连接。在我们的设置中每列的宽度固定为单个像素。

由于卷积层,最大池化层和元素激活函数在局部区域上执行,因此它们是平移不变的。因此,特征图的每列对应于原始图像的一个矩形区域(称为感受野),并且这些矩形区域与特征图上从左到右的相应列具有相同的顺序。如图2所示,特征序列中的每个向量关联一个感受野,并且可以被认为是该区域的图像描述符。

序列标注

一个深度双向循环神经网络是建立在卷积层的顶部,作为循环层。循环层预测特征序列x=x1,…,xTx=x1,…,xT中每一帧xtxt的标签分布ytyt。循环层的优点是三重的。首先,RNN具有很强的捕获序列内上下文信息的能力。对于基于图像的序列识别使用上下文提示比独立处理每个符号更稳定且更有帮助。以场景文本识别为例,宽字符可能需要一些连续的帧来完全描述(参见图2)。此外,一些模糊的字符在观察其上下文时更容易区分,例如,通过对比字符高度更容易识别“il”而不是分别识别它们中的每一个。其次,RNN可以将误差差值反向传播到其输入,即卷积层,从而允许我们在统一的网络中共同训练循环层和卷积层。第三,RNN能够从头到尾对任意长度的序列进行操作。

LSTM是定向的,它只使用过去的上下文。然而,在基于图像的序列中,两个方向的上下文是相互有用且互补的。因此,文中采用双向LSTM。此外,可以堆叠多个双向LSTM,得到如图3.b所示的深双向LSTM。深层结构允许比浅层抽象更高层次的抽象,并且在语音识别任务中取得了显著的性能改进[17]。

在循环层中,误差在图3.b所示箭头的相反方向传播,即反向传播时间(BPTT)。在循环层的底部,传播差异的序列被连接成映射,将特征映射转换为特征序列的操作进行反转并反馈到卷积层。实际上,我们创建一个称为“Map-to-Sequence”的自定义网络层,作为卷积层和循环层之间的桥梁。

转录

转录是将RNN所做的每帧预测转换成标签序列的过程。数学上,转录是根据每帧预测找到具有最高概率的标签序列。在实践中,存在两种转录模式,即无词典转录和基于词典的转录。词典是一组标签序列,预测受拼写检查字典约束。在无词典模式中,预测时没有任何词典。在基于词典的模式中,通过选择具有最高概率的标签序列进行预测。CTC论文

场景数字号码检测与识别

数字检测,使用AdvancedEAST作为检测器

检测与裁剪结果:

识别,双向LSTM+CNN+CTC

测试图像与结果:

问题分析

检测器与识别器分开测试的时候(用各自的测试集),acc均能达到90%以上。但是将两个模型连接测试时(即输入一张图片,由检测器得到数字区域,然后进行裁剪,送入识别器),识别性能下降。个人觉得主要原因在于检测器得到的结果裁剪后引入了干扰,主要还是识别器的训练集制作的太简单(个人也没有太多时间花在制作数据集上)。将检测器得到的检测结果裁剪下来作为识别器的训练集,对于两个模型的连接使用的性能影响比较大,只是得人工筛选,耗费时间。

完整项目代码