《An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition》,是比较老的一篇文章了,在2015年6月发表在arxiv上,但是该方法还是被广泛运用。

文章思想:文章认为文字识别是对序列的预测方法,所以采用了对序列预测的RNN网络。通过CNN将图片的特征提取出来后采用RNN对序列进行预测,最后通过一个CTC的翻译层得到最终结果。说白了就是CNN+RNN+CTC的结构。

关于CTC的解释在之前写过一篇博客,这里不做重复介绍。

一、网络结构

如前面所说的,就是CNN+RNN+CTC,如下图所示

CRNN训练自己的模型 crnn算法_字符串

下面来分开说明

1. CNN结构

CNN结构采用的是VGG的结构,并且文章对VGG网络做了一些微调,如下图所示

CRNN训练自己的模型 crnn算法_CRNN训练自己的模型_02

从上图可以看出,对VGG的调整如下:

  1. 为了能将CNN提取的特征作为输入,输入到RNN网络中,文章将第三和第四个maxpooling的核尺度从CRNN训练自己的模型 crnn算法_ocr_03改为了CRNN训练自己的模型 crnn算法_ocr_04
  2. 为了加速网络的训练,在第五和第六个卷积层后面加上了BN层。

这里需要说明的是第一点,为什么将第三和第四个maxpooling的核尺度从CRNN训练自己的模型 crnn算法_ocr_05改为CRNN训练自己的模型 crnn算法_字符串_06是为了方便的将CNN的提取特征作为RNN的输入.首先要注意的是这个网络的输入为CRNN训练自己的模型 crnn算法_字符串_07,也就是说该网络对输入图片的宽没有特殊的要求,但是高都必须resize到32。文中举例说明了,如果一张包含10个字符的图片大小为CRNN训练自己的模型 crnn算法_DL_08,经过上述的CNN网络得到的特征尺度为CRNN训练自己的模型 crnn算法_DL_09(这里忽略通道数),这样得到一个序列,每一列特征对应原图的一个矩形区域(如下图所示),这样就很方便作为RNN的输入进行下一步的计算了,而且每个特征与输入有一个一对一的对应关系。

CRNN训练自己的模型 crnn算法_CRNN训练自己的模型_10

2. RNN的结构

RNN网络是对于CNN输出的特征序列CRNN训练自己的模型 crnn算法_CRNN_11,每一个输入CRNN训练自己的模型 crnn算法_CRNN_12都有一个输出CRNN训练自己的模型 crnn算法_字符串_13。为了防止训练时梯度的消失,文章采用了LSTM神经单元作为RNN的单元。文章认为对于序列的预测,序列的前向信息和后向信息都有助于序列的预测,所以文章采用了双向RNN网络。LSTM神经元的结构和双向RNN结构如下图所示。

CRNN训练自己的模型 crnn算法_字符串_14

3. CTC翻译层

测试时,翻译分为两种,一种是带字典的,一种是没有字典的。

带字典的就是在测试的时候,测试集是有字典的,测试的输出结果计算出所有字典的概率,取最大的即为最终的预测字符串

不带字典的,是指测试集没有给出测试集包含哪些字符串,预测时就选取输出概率最大的作为最终的预测字符串。

至于CTC的解释这里不详细说明,有需要的请查看我之前的博客,简单说就是将RNN的输出CRNN训练自己的模型 crnn算法_字符串_15转化为一个字符串,而转化的输入与输出长度不对应而且输入可以是不同长度的序列。

二、损失函数

最小化负对数似然函数
CRNN训练自己的模型 crnn算法_CRNN训练自己的模型_16

详情还是请查看CTC算法详解这篇博文

到这里CRNN算法的基本理论就介绍完了

中文本定位与识别的评测方法