概述
这篇文章主要针对场景文字识别问题,提出一个包含特征提取、序列建模以及转录层的整体框架,在不需要字符级别等的标注情况下,完成端到端的文字识别。
对例如文本、乐谱这种序列的识别本身就是一个序列识别问题,而且是不定长序列。与一般的目标识别差异很大。
当前已有的一些文字识别方法都存在一些缺陷:例如一些方法先做单字文字检测,然后对每个文字分类,但是这需要一个强大的检测器;另外一些方法,例如基于单词做分类,构造一个包含 90K 个单词的字典,这是一个很大数量类别的分类器,难以保证分类正确率而且很难扩展。
方法
作者在这篇文章中提出卷积循环神经网络(Convolutional Recurrent Neural Network,CRNN),将 CNN 和 RNN 进行了组合。
对于一个序列识别问题, CRNN 具有一些如下的优势:
- 可以直接使用序列标签学习,不需要细节标注,例如字符级标注;
- 和 CNN 类似,直接输入图片,不需要额外的包括分割、二值化等预处理步骤;
- 和 RNN 类似,可以输出序列标签;
- 不受序列长度约束,只需要对高度做归一化;
- 比当前文字识别方法指标更高;
- 包含参数少,内存要求小。
整体网络结构
整体网络结构如下图所示。它包含特征提取层、循环层和转录层。
特征提取
特征提取层由卷积和最大池化组成。如下图所示,特征空间中每个向量都关联到一个感受野,因此可以视为这个区域的图像描述符。
序列建模
在卷积层上边增加一个双边循环网络作为循环层。使用这样一个基于 RNN 循环层具有多个好处:
- 可以使用 RNN 捕捉上下文信息,增强识别鲁棒性;
- 可以和 CNN 联合优化;
- RNN 可以在任意长度序列上操作。
同时在具体使用上,如下图所示,为了同时利用图像两边的信息,组合了两个LSTM形成双向 LSTM:
转录层
转录层将 RNN 的每帧预测转换成一个标签序列。在数学上就是:转录层在每帧上找到概率最大的标签,形成标签序列。
标签序列的概率
在序列概率计算上使用 Connectionist Temporal Classification(CTC),它无需知道每个标签具体对应的标注位置。
给定一个输入序列
y
=
y
1
,
.
.
.
.
.
.
,
y
T
y=y_1,......,y_T
y=y1,......,yT,其中
T
T
T 是序列长度,每个
y
t
y_t
yt 都是一个概率分布,它表征了预测成每个字符的概率(包含 ‘blank’ 字符)。
π
\pi
π 是一条长度为
T
T
T 的路径,通过一个函数
B
\Beta
B 将
π
\pi
π 映射到序列
l
l
l。在映射过程中先移除重复字符,然后移除 ‘blank’ 字符。因此条件概率被定义为所有的
π
\pi
π 路径的和,这样的路径将把
B
\Beta
B 映射为
l
l
l:
p
(
l
∣
y
)
=
∑
π
:
B
(
π
)
=
1
p
(
π
∣
y
)
p(l|y)=\sum_{\pi:B(\pi)=1}^{}{p(\pi|y)}
p(l∣y)=π:B(π)=1∑p(π∣y)
其中 π \pi π 就被定义为 p ( π ∣ y ) = ∏ t = 1 T y π t t p(\pi|y)=\prod_{t=1}^{T}{y^{t}_{\pi_{t}}} p(π∣y)=∏t=1Tyπtt,其中 y π t t y^{t}_{\pi_{t}} yπtt 是时间 t t t 处预测为标签 π t \pi_{t} πt 的概率。直接对上式进行计算有指数级别的计算复杂度,因此使拥到专门的高效实现。
无需字典的转录
为了进行高效计算,直接将上式中同一时间戳下具有最高概率的字符作为预测输出。也就是直接将每个时间戳 t t t 下的概率最高的字符 π t \pi_{t} πt 输出。
网络训练
在网络训练中需要计算损失,这里直接将条件概率的负对数作为损失,因此训练目标就是最小化这样一个负对数:
优化器上使用 ADADELTA 优化器,不用手动设置学习率,并且获得了比基于 momentum 方法更快的收敛速度。
在池化时还使用了 1 × 2 1×2 1×2 大小的池化窗口,使得感受野具有了更大的宽度,训练输入图像都 scale 到 100 × 32 100×32 100×32。
实验及指标
和之前模型的对比如下图所示,可以看到相比之前的一些模型大小极为降低:
在各个数据集上的识别精度,也有很大的提升:
为了验证模型的泛化性能,还做了乐谱识别实验,也取得了不错的效果: