An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition
Abstract
- 基于图像的序列识别一直是计算机视觉领域的长期研究课题。在本文中,我们研究了场景文本识别问题,这是基于图像的序列识别中最重要和最具挑战性的任务之一。提出了一种新颖的神经网络架构,将特征提取、序列建模和转录集成到一个统一的框架中。与以前的场景文本识别系统相比,所提出的架构具有四个独特的特性:(1)它是端到端可训练的,而大多数现有算法的组件是单独训练和调整的。(2)它可以自然地处理任意长度的序列,无需字符分割或水平尺度归一化。(3)它不局限于任何预定义的词典,并且在无词典和基于词典的场景文本识别任务中都取得了卓越的表现。(4)它生成了一个有效但小得多的模型,这对于实际应用场景更实用。在包括 IIIT-5K、街景文本和 ICDAR 数据集在内的标准基准上的实验证明了所提出的算法优于现有技术。此外,该算法在基于图像的乐谱识别任务中表现良好,显然验证了该算法的通用性。
- 论文地址:[1507.05717] An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition
- CRNN是一种卷积循环神经网络结构,用于解决基于图像的序列识别问题,特别是场景文字识别问题。认为文字识别是对序列的预测方法,所以采用了对序列预测的RNN网络。通过CNN将图片的特征提取出来后采用RNN对序列进行预测,最后通过一个CTC的翻译层得到最终结果。就是CNN+RNN+CTC的结构。主要用于端到端地对不定长的文本序列进行识别,不用先对单个文字进行切割,而是将文本识别转化为时序依赖的序列学习问题,就是基于图像的序列识别。
Introduction
-
最近,社区见证了神经网络的强势复兴,这主要得益于深度神经网络模型,特别是深度卷积神经网络 (DCNN) 在各种视觉任务中取得的巨大成功。然而,最近与深度神经网络相关的大多数研究都致力于检测或分类对象类别 。在本文中,我们关注计算机视觉中的一个经典问题:基于图像的序列识别。在现实世界中,一组视觉对象(例如场景文本、手写和乐谱)往往以序列的形式出现,而不是孤立地出现。与一般的对象识别不同,识别这种序列状对象通常需要系统预测一系列对象标签,而不是单个标签。因此,识别此类对象可以自然地归结为序列识别问题。序列状对象的另一个独特属性是它们的长度可能有很大差异。例如,英文单词可以由 2 个字符组成(例如“OK”),也可以由 15 个字符组成(例如“congratulations”)。因此,最流行的深度模型如 DCNN 不能直接应用于序列预测,因为 DCNN 模型通常对具有固定维度的输入和输出进行操作,因此无法生成可变长度的标签序列。
-
一些研究尝试针对特定的类序列对象(例如场景文本)解决该问题。例如,算法首先检测单个字符,然后使用 DCNN 模型识别这些检测到的字符,这些模型是使用带标签的字符图像进行训练的。此类方法通常需要训练一个强大的字符检测器,以便从原始单词图像中准确检测和裁剪出每个字符。其他一些方法将场景文本识别视为图像分类问题,并为每个英文单词(总共 90K 个单词)分配一个类别标签。结果是一个大型的训练模型,其中包含大量类别,很难推广到其他类型的类序列对象,例如中文文本、乐谱等,因为此类序列的基本组合数量可能超过 100 万。总之,当前基于 DCNN 的系统不能直接用于基于图像的序列识别。
-
循环神经网络 (RNN) 模型是深度神经网络家族的另一个重要分支,主要用于处理序列。RNN 的优点之一是它在训练和测试中都不需要序列对象图像中每个元素的位置。然而,将输入对象图像转换为图像特征序列的预处理步骤通常是必不可少的。例如,Graves 等人 从手写文本中提取一组几何或图像特征,而 Su 和 Lu 将单词图像转换为顺序 HOG 特征。预处理步骤与流水线中的后续组件无关,因此现有的基于 RNN 的系统无法以端到端的方式进行训练和优化。
-
一些传统的非基于神经网络的场景文本识别方法也为该领域带来了深刻的思想和新颖的表示方法。例如,Almazan 等人和 Rodriguez-Serrano 等人提出将单词图像和文本字符串嵌入到公共矢量子空间中,将单词识别转换为检索问题。Yao 等人 和 Gordo 等人 使用中级特征进行场景文本识别。虽然这些方法在标准基准上取得了不错的效果,但总体上不如以前的基于神经网络的算法 以及本文提出的方法。
-
本文的主要贡献是一种新颖的神经网络模型,其网络架构专门用于识别图像中的序列类对象。 所提出的神经网络模型被称为卷积循环神经网络(CRNN),因为它是 DCNN 和 RNN 的组合。对于序列类对象,CRNN 相较于传统神经网络模型具有几个明显的优势:1)它可以直接从序列标签(例如单词)中学习,不需要详细的注释(例如字符);2)它具有与 DCNN 相同的特性,可以直接从图像数据中学习信息表示,既不需要手工制作特征,也不需要预处理步骤,包括二值化/分割、组件定位等;3)它具有与 RNN 相同的特性,能够生成标签序列;4)它不受序列类对象长度的限制,只需要在训练和测试阶段进行高度归一化; 5)它在场景文本(单词识别)上取得了比现有技术更好或更具竞争力的性能;6)它包含的参数比标准DCNN模型少得多,消耗的存储空间更少。
-
常用文字识别算法主要有两个框架:CNN+RNN+CTC(CRNN+CTC);CNN+Seq2Seq+Attention。CRNN 模型,即将 CNN与 RNN 网络结合,共同训练。主要用于在一定程度上实现端到端(end-to-end)地对不定长的文本序列进行识别,不用先对单个文字进行切割,而是将文本识别转化为时序依赖的序列学习问题,就是基于图像的序列识别。(说一定程度是因为虽然输入图像不需要精确给出每个字符的位置信息,但实际上还是需要对原始的图像进行前期的裁切工作)
The Proposed Network Architecture
-
CRNN 的网络结构如图 1 所示,由三部分组成,从下到上依次为卷积层、循环层和转录层。
-
-
图 1. 网络架构。该架构由三部分组成:1)卷积层,从输入图像中提取特征序列;2)循环层,预测每帧的标签分布;3)转录层,将每帧的预测转换为最终的标签序列。
-
-
在 CRNN 的底层,卷积层会自动从每个输入图像中提取一个特征序列。 在卷积网络的顶层,构建了一个循环网络,用于对卷积层输出的特征序列的每一帧进行预测。CRNN 顶层的转录层用于将循环层的每帧预测转换为标签序列。虽然 CRNN 由不同类型的网络架构(例如 CNN 和 RNN)组成,但它可以用一个损失函数进行联合训练。
-
不能直接把 CNN 得到的特征图送入 RNN 进行训练的,需要进行一些调整,根据特征图提取 RNN 需要的特征向量序列。『带你学AI』一文带你搞懂OCR识别算法CRNN:解析+源码-CSDN博客
-
-
现在需要从 CNN 模型产生的特征图中提取特征向量序列,每一个特征向量(如上图中的一个红色框)在特征图上 按列 从左到右生成,每一列包含 512 维特征,这意味着第 i 个特征向量是所有的特征图第 i 列像素的连接,这些特征向量就构成一个序列。
-
Feature Sequence Extraction
-
在 CRNN 模型中,卷积层的组件是通过从标准 CNN 模型(全连接层被删除)中获取卷积层和最大池化层构建的。该组件用于从输入图像中提取顺序特征表示。在输入网络之前,所有图像都需要缩放到相同的高度。然后从卷积层组件生成的特征图中提取特征向量序列,作为循环层的输入。具体而言,特征序列的每个特征向量都是在特征图上从左到右按列生成的。这意味着第 i 个特征向量是所有图的第 i 列的串联。在我们的设置中,每列的宽度固定为单个像素。
-
由于卷积层、最大池化层和元素激活函数作用于局部区域,因此它们具有平移不变性。因此,特征图的每一列对应于原始图像的一个矩形区域(称为感受野),并且这些矩形区域从左到右与特征图上对应的列的顺序相同。如图 2 所示,特征序列中的每个向量都与一个感受野相关联,并且可以被视为该区域的图像描述符。
-
-
图 2. 感受野。提取的特征序列中的每个向量都与输入图像上的一个感受野相关联,并且可以被视为该感受野的特征向量。这些特征向量序列就作为循环层的输入,每个特征向量作为 RNN 在一个时间步(time step)的输入。
-
-
深度卷积特征具有鲁棒性、丰富性和可训练性,被广泛应用于各类视觉识别任务。之前的一些方法使用 CNN 来学习序列类物体(如场景文本)的鲁棒表示。然而,这些方法通常通过 CNN 提取整幅图像的整体表示,然后收集局部深度特征来识别序列类物体的每个组成部分。由于 CNN 要求将输入图像缩放到固定大小以满足其固定的输入维度,因此它不适用于长度变化很大的序列类物体。在 CRNN 中,我们将深度特征传达到序列表示中,以使其不受序列类物体的长度变化的影响。
-
这里有一个很精彩的改动,一共有四个最大池化层,但是最后两个池化层的窗口尺寸由 2x2 改为 1x2,也就是图片的高度减半了四次(除以 2 4 2^4 24 ),而宽度则只减半了两次(除以 2 2 2^2 22),这是因为文本图像多数都是高较小而宽较长,所以其 feature map 也是这种高小宽长的矩形形状,如果使用 1X2的池化窗口可以尽量保证不丢失在宽度方向的信息,更适合英文字母识别 (比如区分 i 和 1)。CRNN 还引入了 Batch Normalization 模块,加速模型收敛,缩短训练过程。
Sequence Labeling
-
在卷积层之上构建一个深度双向循环神经网络作为循环层。循环层预测特征序列 x = x1; : : : ; xT 中每一帧 xt 的标签分布 yt。循环层的优势有三点。首先,RNN 具有很强的捕捉序列内上下文信息的能力。使用上下文线索进行基于图像的序列识别比独立处理每个符号更稳定、更有帮助。以场景文本识别为例,宽字符可能需要连续几帧才能完整描述(参见图 2)。此外,一些模糊字符在观察其上下文时更容易区分,例如,通过对比字符高度比单独识别每个字符更容易识别“il”。其次,RNN 可以将误差微分反向传播到其输入,即卷积层,使我们能够在统一网络中联合训练循环层和卷积层。
-
第三,RNN 能够对任意长度的序列进行操作,从头到尾遍历。传统 RNN 单元在输入层和输出层之间有一个自连接的隐藏层。每次它接收到序列中的帧 xt 时,它都会用一个非线性函数更新其内部状态 ht,该函数将当前输入 xt 和过去状态 ht−1 作为输入:ht = g(xt; ht−1)。然后根据 ht 进行预测 yt。这样,过去的上下文 fxt 0gt 0<t 被捕获并用于预测。然而,传统的 RNN 单元存在梯度消失问题,这限制了它可以存储的上下文范围,并增加了训练过程的负担。长短期记忆 是一种专门为解决此问题而设计的 RNN 单元。LSTM(如图 3 所示)由一个记忆单元和三个乘法门组成,即输入门、输出门和遗忘门。 从概念上讲,记忆细胞存储过去的上下文,输入门和输出门允许细胞长时间存储上下文。同时,遗忘门可以清除细胞中的记忆。LSTM 的特殊设计使其能够捕获长距离依赖关系,这种依赖关系通常发生在基于图像的序列中。
-
-
图 3. (a) 基本 LSTM 单元的结构。LSTM 由一个单元模块和三个门组成,即输入门、输出门和遗忘门。 (b) 我们在论文中使用的深度双向 LSTM 的结构。将前向(从左到右)和后向(从右到左)LSTM 组合在一起可得到双向 LSTM。堆叠多个双向 LSTM 可得到深度双向 LSTM。
-
-
LSTM 是单向的,它只使用过去的上下文。然而,在基于图像的序列中,来自两个方向的上下文都是有用的,并且相互补充。因此,将两个 LSTM(一个向前,一个向后)组合成一个双向 LSTM。此外,可以堆叠多个双向 LSTM,从而得到如图 3.b 所示的深度双向 LSTM。深层结构比浅层结构允许更高级别的抽象,并且在语音识别任务中取得了显著的性能提升。
-
在循环层中,误差差分沿图 3.b 中箭头相反的方向传播,即时间反向传播 (BPTT)。在循环层的底部,传播的差分序列被连接成映射,反转将特征映射转换为特征序列的操作,并反馈到卷积层。在实践中,我们创建了一个自定义网络层,称为“Map-to-Sequence”,作为卷积层和循环层之间的桥梁。
-
因为 RNN 有梯度消失的问题,不能获取更多上下文信息,所以 CRNN 中使用的是 LSTM,LSTM 的特殊设计
允许它捕获长距离依赖。这里采用的是两层备 256 单元的双向 LSTM 网络。 -
通过上面一步,我们得到了 40 个特征向量,每个特征向量长度为 512,在 LSTM 中一个时间步就传入一个特征向量进行分类,这里一共有 40 个时间步。我们知道一个特征向量就相当于原图中的一个小矩形区域,RNN 的目标就是预测这个矩形区域为哪个字符即根据输入的特征向量,进行预测,得到所有字符的 softmax 概率分布,这是一个长度为字符类别数的向量作为 CTC 层的输入。
-
因为每个时间步都会有一个输入特征向量 xt,输出一个所有字符的概率分布 yt,所以输出为 40 个长度为字符类别数的向量构成的后验概率矩阵。如下图所示:
-
-
然后将这个后验概率矩阵传入转录层。
-
-
class BidirectionalLSTM(nn.Module): def __init__(self, nIn, nHidden, nOut): super(BidirectionalLSTM, self).__init__() self.rnn = nn.LSTM(nIn, nHidden, bidirectional=True) self.embedding = nn.Linear(nHidden * 2, nOut) def forward(self, input): recurrent, _ = self.rnn(input) T, b, h = recurrent.size() t_rec = recurrent.view(T * b, h) output = self.embedding(t_rec) # [T * b, nOut] output = output.view(T, b, -1) return output self.rnn = nn.Sequential( BidirectionalLSTM(512, nh, nh), BidirectionalLSTM(nh, nh, nclass))
Transcription
-
转录是将 RNN 的每帧预测转换为标签序列的过程。从数学上讲,转录是根据每帧预测找到概率最高的标签序列。实际上,存在两种转录模式,即无词典转录和基于词典的转录。词典是一组预测受其约束的标签序列,例如拼写检查词典。在无词典模式下,无需任何词典即可进行预测。在基于词典的模式下,通过选择具有最高概率的标签序列来进行预测。
-
端到端 OCR 识别的难点在于怎么处理不定长序列对齐的问题。OCR 可建模为时序依赖的文本图像问题,然后使用 CTC(Connectionist Temporal Classifcation,CTC)的损失函数来对 CNN 和 RNN 进行端到端的联合训练。
-
我们现在要将 RNN 输出的序列翻译成最终的识别结果,RNN 进行时序分类时,不可避免地会出现很多冗余信息,比如一个字母被连续识别两次,这就需要一套去冗余机制。
-
在训练阶段,我们需要根据这些概率分布向量和相应的文本标签得到损失函数,从而训练神经网路模型,下面来看看如何得到损失函数的。
-
-
其中黑细线是代表文本“a”的路径,而粗虚线是代表空文本的路径。如上图,对于最简单的时序为2的字符识别,有两个时间步长(t0,t1)和三个可能的字符为“a”“b” 和 “-”,我们得到两个概率分布向量,如果采取最大概率路径解码的方法,则“-”的概率最大,即真实字符为空的概率为 0.6*0.6=0.36.
-
但是为字符“a”的情况有多种对齐组合,“aa”,“a-“和“-a”都是代表“a”,所以,输出“a”的概率应该为三种之和:0.4*0.4+0.4*0.6+0.6*0.4=0.16+0.24+0.24=0.64。所以“a”的概率比空"-“的概率高。如果标签文本为“a”,则通过计算图像中为“a"的所有可能的对齐组合(或者路径)的分数之和来计算损失函数。所以对于 RNN 给定输入概率分布矩阵为 y={y1,y2.,yT},T是序列长度,最后映射为标签文本 I 的总概率为:
-
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)
-
其中 B ( π ) B(\pi) B(π) 代表从序列到序列的映射函数 B变换后是文本|的所有路径集合,而 π则是其中的一条路径。每条路径的概率为各个时间步中对应字符的分数的乘积。我们就是需要训练网络使得这个概率值最大化,类似于普通的分类,CTC 的损失函数定义为概率的负最大似然函数,为了计算方便,对似然函数取对数。
-
通过对损失函数的计算,就可以对之前的神经网络进行反向传播,神经网络的参数根据所使用的优化器进行更新,从而找到最可能的像素区域对应的字符。这种通过映射变换和所有可能路径概率之和的方式使得 CTC 不需要对原始的输入字符序列进行准确的切分。
-
-
在测试阶段与训练阶段有所不同,我们用训练好的神经网络来识别新的文本图像。这时候我们事先不知道任何文本,如果我们像上面一样将每种可能文本的所有路径计算出来,对于很长的时间步和很长的字符序列来说这个计算量是非常庞大的,这不是一个可行的方案。
-
我们知道 RNN 在每一个时间步的输出为所有字符类别的概率分布,即一个包含每个字符分数的向量,我们取其中最大概率的字符作为该时间步的输出字符,然后将所有时间步得到一个字符进行拼接得到一个序列路径,即最大概率路径,再根据上面介绍的合并序列方法得到最终的预测文本结果。在输出阶段经过 CTC 的翻译,即将网络学习到的序列特征信息转化为最终的识别文本,就可以对整个文本图像进行识别。
-
上述说到图像resize的宽在CNN输出的特征图的宽度对应了预测的时序,也就是我们挨着图像自左向右预测多少次,显然我们分隔的次数越多,就越不会漏掉其中某个字符,当然大多数情况下是预测多了的,比如图片中写的是"booK",我们的预测可能就是bbbbbbooooookkK,还有就是我们的"booK“作为标签如何去在网络的输出进行表示呢?当然是要做一个码本,将我们的字符用索引 0-25表示。比如我们要预测26个英文字母,那"cat"就可以表示成[2,0,19],预测(序列长度为10)就可能是[2.2.2.0.0.0.0.19,19,19]或者[2,2.0.0.0.0.0.0.0,19]。问题来了,我们预测的输出是明显是多于实际标签的,中间的重复我怎么知道最后该保留一个还是多个呢,比如"book",如果按照上述规则得到的可是"bok"。
-
于是人们用一个占位符"-“来处理这个问题,用于解决到底留几个重复字符,注意,如果我们的预测中有"-“这个字符,要注意与占位符区别开,这和处理空格问题一样,在实际操作中可以使用其他符号暂时代替"-"或者空格进行码本制作,以避免码本无法表示,待解码之后统一替换即可。在编码的时候,所有的重复字符都要用”-“隔开,这样编码肯定是没有疑问了,解码的时候,凡是相同字符间没有"-“的,统统只要一个。将”-““放在码本的0号位,预测26个英文字符就用索引1-26表示,如果我们有输出[2,2.0.0.0,15,15,0,15,11],则解码为“book”,如果是[0,0,2,15,15,15,15,0,0,11],则解码为“bok”。Sequence Modeling with CTC
-
#编码过程,lexicon为字符标签,character为码本 label = [self.characters.find(c) for c in lexicon] #解码过程,只解码一个输出列表,若解码矩阵,可分解出单个样本后进行调用 char_list = [] for i in range(len(str_index)): if str_index[i] != 0 and (not (i > 0 and str_index[i - 1] == str_index[i])): char_list.append(characters[str_index[i]]) return ''.join(char_list)
-
Probability of label sequence
-
我们采用 Graves 等人 提出的联结时间分类 (CTC) 层中定义的条件概率。该概率针对标签序列 l 定义,条件是每帧预测 y = y1; : : : ; yT,并且忽略 l 中每个标签所在的位置。因此,当我们使用该概率的负对数似然作为目标来训练网络时,我们只需要图像及其对应的标签序列,从而避免了标记单个字符位置的劳动。
-
条件概率的公式简要描述如下:输入是一个序列 y = y1; : : : ; yT,其中 T 是序列长度。这里每个 y t ∈ R ∣ L ′ ∣ y_t\in R^{|L'|} yt∈R∣L′∣ 都是集合 L ′ = L ∪ L'=L∪ L′=L∪ 上的概率分布,其中 L 包含任务中的所有标签(例如所有英文字符),以及用 表示的“空白”标签。在序列 π ∈ L T ′ π \in L'_T π∈LT′ 上定义一个序列到序列的映射函数 B,其中 T 是长度。B 通过首先删除重复的标签,然后删除“空白”来将 π 映射到 l 上。例如,B 将“–hh-e-l-ll-oo–”(“-”代表“空白”)映射到“hello”上。然后,条件概率定义为 B 映射到 l 上的所有 π 的概率之和:
-
p ( l ∣ y ) = ∑ π : B ( π ) = l p ( π ∣ y ) ; p(l|y) = \sum _{π:B(π)=l} p(π|y); p(l∣y)=π:B(π)=l∑p(π∣y);
-
其中π的概率定义为 p ( π ∣ y ) = Q t = 1 T y π t t , y π t t p(π|y) = Q^T _{t=1} y ^t _{πt},y ^t _{πt} p(π∣y)=Qt=1Tyπtt,yπtt 是在时间戳 t 处具有标签πt的概率。直接计算公式1在计算上是不可行的,因为求和项的数量呈指数级增长。但是,可以使用描述的前向-后向算法有效地计算公式1。
Lexicon-free transcription
- 在此模式下,将具有公式 1 中定义的最高概率的序列 l ∗ 作为预测。由于没有可处理的算法来精确找到解决方案,我们使用中采用的策略。序列 l ∗ 可以通过 l ∗ ≈ B(arg maxπ p(π|y)) 近似找到,即在每个时间戳 t 处取最可能的标签 πt,并将结果序列映射到 l ∗ 上。
Lexicon-based transcription
-
在基于词典的模式下,每个测试样本都与一个词典 D 相关联。基本上,通过选择词典中具有公式 1 中定义的最高条件概率的序列来识别标签序列,即$ l ∗ = arg max_{l\in D }p(l|y)$。但是,对于大型词典,例如 50k 词的 Hunspell 拼写检查词典 ,对词典进行详尽搜索将非常耗时,即对词典中的所有序列计算公式 1 并选择概率最高的序列。为了解决这个问题,我们观察到通过 2.3.2 中描述的无词典转录预测的标签序列在编辑距离度量下通常接近真实值。这表明我们可以将搜索限制在最近邻候选 Nδ(l ‘ ) 内,其中 δ 是最大编辑距离,l ’ 是在无词典模式下从 y 转录的序列:
-
I ∗ = a r g max l ∈ N δ ( l ′ ) p ( l ∣ y ) : ( 2 ) I ∗ = arg \max _{l\in Nδ(l ')} p(l|y): (2) I∗=argl∈Nδ(l′)maxp(l∣y):(2)
-
可以使用 BK 树数据结构 高效地找到候选 Nδ(l ’ ),BK 树是一种专门适用于离散度量空间的度量树。BK 树的搜索时间复杂度为 O(log |D|),其中 |D| 是词典大小。因此,此方案可轻松扩展到非常大的词典。在我们的方法中,离线为词典构建 BK 树。然后,我们通过查找与查询序列的编辑距离小于或等于 δ 的序列,使用该树进行快速在线搜索。
-
Network Training
-
用 $X = {I_i ; l_i}_i $表示训练数据集,其中 I i I_i Ii是训练图像,li 是真实值标签序列。 目标是最小化真实值条件概率的负对数似然:
-
O = − ∑ I i ; l i ∈ X l o g p ( l i ∣ y i ) ; O = − \sum _{I_i;l_i\in X} log p(li |yi); O=−Ii;li∈X∑logp(li∣yi);
-
其中 yi 是由 Ii 中的循环层和卷积层生成的序列。该目标函数直接从图像及其基本事实标签序列计算成本值。因此,网络可以在图像和序列对上进行端到端训练,从而无需手动标记训练图像中所有单个组件的过程。
-
-
网络采用随机梯度下降 (SGD) 进行训练。梯度由反向传播算法计算。具体而言,在转录层中,误差微分采用前向-后向算法进行反向传播。在循环层中,应用时间反向传播 (BPTT) 来计算误差微分。
-
对于优化,我们使用 ADADELTA 自动计算每维学习率。与传统的动量 方法相比,ADADELTA 不需要手动设置学习率。更重要的是,我们发现使用 ADADELTA 的优化比动量方法收敛得更快。
Experiments
- 为了评估所提出的 CRNN 模型的有效性,我们在场景文本识别和乐谱识别的标准基准上进行了实验,这两项都是具有挑战性的视觉任务。训练和测试的数据集和设置在 3.1 节中给出,场景文本图像的 CRNN 的详细设置在第 3.2 节中提供,综合比较的结果在第 3.3 节中报告。为了进一步证明 CRNN 的通用性,我们在第 3.4 节中在乐谱识别任务上验证了所提出的算法。
Datasets
-
对于所有场景文本识别实验,我们使用 Jaderberg 等人 发布的合成数据集 (Synth) 作为训练数据。该数据集包含 800 万张训练图像及其对应的 GT 词。 此类图像由合成文本引擎生成,非常逼真。我们的网络在合成数据上训练一次,并在所有其他真实世界测试数据集上进行测试,而无需对其训练数据进行任何微调。尽管 CRNN 模型纯粹是用合成文本数据训练的,但它在标准文本识别基准的真实图像上效果很好。
-
使用四个流行的场景文本识别基准进行性能评估,即ICDAR 2003(IC03),ICDAR 2013(IC13),IIIT 5k-word(IIIT5k)和街景文本(SVT)。
- IC03 测试数据集包含 251 张带有标记文本边界框的场景图像。按照 Wang 等人 的方法,我们忽略了包含非字母数字字符或字符少于三个的图像,并获得了一个包含 860 张裁剪文本图像的测试集。每张测试图像都与一个由 Wang 等人 定义的 50 个单词的词典相关联。通过组合所有每幅图像的词典,可以构建一个完整的词典。此外,我们使用了一个包含 Hunspell 拼写检查词典 中的单词的 50k 个单词的词典。
- IC13 测试数据集继承了 IC03 的大部分数据。 它包含 1,015 个真实裁剪单词图像。
- IIIT5k 包含从互联网上收集的 3,000 张裁剪的单词测试图像。每张图片都与一个 50 个单词的词典和一个 1000 个单词的词典相关联。
- SVT 测试数据集包含从 Google 街景收集的 249 张街景图像。从中裁剪出 647 个单词图像。每个单词图像都有一个由 Wang 等人 定义的 50 个单词词典。
Implementation Details
-
表 1 总结了我们在实验中使用的网络配置。卷积层的架构基于 VGG-VeryDeep 架构 。为了使其适合识别英文文本,我们对其进行了调整。在第三和第四个最大池化层中,我们采用 1×2 大小的矩形池化窗口,而非传统的方形窗口。这一调整会产生宽度更大的特征图,从而产生更长的特征序列。例如,包含 10 个字符的图像通常大小为 100×32,从中可以生成 25 帧的特征序列。这个长度超过了大多数英文单词的长度。除此之外,矩形池化窗口会产生矩形感受野(如图 2 所示),这有助于识别一些形状较窄的字符,例如“i”和“l”。
-
-
表 1. 网络配置摘要。第一行是顶层。“k”、“s”和“p”分别代表内核大小、步幅和填充大小
-
-
该网络不仅具有深层卷积层,还具有循环层。众所周知,两者都很难训练。我们发现批量归一化 技术对于训练这种深度的网络非常有用。在第 5 和第 6 个卷积层之后分别插入两个批量归一化层。使用批量归一化层,训练过程大大加快。
-
我们在 Torch7 框架内实现了网络,并对 LSTM 单元(在 Torch7/CUDA 中)、转录层(在 C++ 中)和 BK 树数据结构(在 C++ 中)进行了自定义实现。实验在具有 2.50 GHz Intel® Xeon® E52609 CPU、64GB RAM 和 NVIDIA® Tesla™ K40 GPU 的工作站上进行。使用 ADADELTA 训练网络,将参数 ρ 设置为 0.9。在训练期间,所有图像都缩放到 100 × 32,以加速训练过程。训练过程大约需要 50 小时才能达到收敛。 测试图像缩放为高度为 32。宽度与高度按比例缩放,但至少为 100 像素。 平均测试时间为 0.16 秒/样本,是在没有词典的 IC03 上测得的。对IC03的50k词典进行近似词典搜索,参数δ设置为3,测试每个样本平均需要0.53秒。
Comparative Evaluation
-
表 2 显示了所提出的 CRNN 模型和最新技术(包括基于深度模型的方法)在上述四个公共数据集上获得的所有识别准确率。
-
-
表 2. 四个数据集上的识别准确率(%)。第二行中的“50”、“1k”、“50k”和“Full”表示使用的词典,“None”表示不使用词典进行识别。(* [(22)Reading text in the wild with convolutional neural networks] 严格意义上来说不是无词典的,因为其输出被限制为 90k 词典。
-
-
在词典受限的情况下,我们的方法始终优于大多数最先进的方法,并且平均击败了 [Reading text in the wild with convolutional neural networks] 中提出的最佳文本阅读器。具体来说,我们在 IIIT5k 上获得了优异的表现,而与 [Reading text in the wild with convolutional neural networks] 相比,SVT 仅在使用“完整”词典的 IC03 上取得了较低的性能。请注意,[Reading text in the wild with convolutional neural networks] 中的模型是在特定词典上训练的,即每个单词都与一个类标签相关联。与 [Reading text in the wild with convolutional neural networks] 不同,CRNN 不仅限于识别已知词典中的单词,还能够处理随机字符串(例如电话号码)、句子或其他脚本,如中文单词。因此,CRNN 的结果在所有测试数据集上都具有竞争力。
-
在无约束词典情况下,我们的方法在 SVT 上取得了最佳性能,但在 IC03 和 IC13 上仍然落后于某些方法。请注意,表 2 中“无”列中的空白表示此类方法无法应用于没有词典的识别,或未报告无约束情况下的识别准确率。我们的方法仅使用带有单词级标签的合成文本作为训练数据,这与 PhotoOCR 非常不同,后者使用 790 万张带有字符级注释的真实单词图像进行训练。 报告了在无约束词典情况下的最佳性能,这得益于其庞大的词典,然而,如前所述,它并不是一个严格不受词典约束的模型。从这个意义上来说,我们在无约束词典情况下的结果仍然是有希望的。
-
为了进一步了解所提出的算法相对于其他文本识别方法的优势,我们对 E2E Train、Conv Ftrs、CharGT-Free、Unconstrained 和 Model Size 几个属性进行了全面的比较,如表 3 所示。
-
-
表 3. 各种方法之间的比较。比较的属性包括:1)端到端可训练(E2E Train);2)使用直接从图像中学习的卷积特征,而不是使用手工制作的特征(Conv Ftrs);3)训练期间不需要字符的真实边界框(CharGT-Free);4)不局限于预定义的词典(Unconstrained);5)模型大小(如果使用端到端可训练模型),以模型参数的数量来衡量(模型大小,M 代表数百万)。
-
-
E2E 训练:此栏用于显示某个文本阅读模型是否可端到端训练,无需任何预处理或通过几个单独的步骤,这表明此类方法对于训练来说是优雅而干净的。从表 3 可以看出,只有基于深度神经网络以及 CRNN 的模型才具有此属性。
-
Conv Ftrs:此列用于表明某种方法是否直接使用从训练图像中学习到的卷积特征或者手工制作的特征作为基本表示。
-
CharGT-Free:此列表示字符级注释是否对训练模型必不可少。由于 CRNN 的输入和输出标签可以是序列,因此字符级注释不是必需的。
-
不受约束:此列用于表明训练的模型是否受限于特定的词典,无法处理词典外的单词或随机序列。请注意,虽然最近通过标签嵌入 和增量学习 的模型取得了极具竞争力的性能,但它们受限于特定的词典。
-
模型大小:此列用于报告所学习模型的存储空间。在 CRNN 中,所有层都具有权重共享连接,并且不需要全连接层。因此,CRNN 的参数数量比在 CNN 变体 上学习的模型少得多,从而导致模型比 [Deep structured output learning for unconstrained text recognition, Reading text in the wild with convolutional neural networks] 小得多。我们的模型有 830 万个参数,仅占用 33MB RAM(每个参数使用 4 字节单精度浮点数),因此可以轻松移植到移动设备。下表 清楚地详细展示了不同方法之间的差异,并充分展示了 CRNN 相对于其他竞争方法的优势。
-
此外,为了测试参数 δ 的影响,我们在公式 2 中试验了不同的 δ 值。在图 4 中,我们绘制了识别准确率与 δ 的关系图。δ 越大,候选序列越多,因此基于词典的转录越准确。另一方面,计算成本会随着 δ 的增大而增加,这是因为 BK 树搜索时间更长,而且要测试的候选序列数量也更多。在实践中,我们选择 δ = 3 作为准确率和速度之间的权衡。
-
-
图 4. 蓝线图:识别准确率作为函数参数 δ。红条:每个样本的词典搜索时间。在 IC03 数据集上使用 50k 词典进行测试。
-
Musical Score Recognition
-
乐谱通常由排列在五线谱上的音符序列组成。识别图像中的乐谱被称为光学音乐识别 (OMR) 问题。以前的方法通常需要图像预处理(主要是二值化)、五线谱检测和单个音符识别 。我们将 OMR 视为序列识别问题,并使用 CRNN 直接从图像中预测音符序列。为简单起见,我们仅识别音高,忽略所有和弦,并假设所有乐谱的大调音阶(C 大调)。
-
据我们所知,目前还没有用于评估音高识别算法的公共数据集。为了准备 CRNN 所需的训练数据,我们从 [Free sheet music | Download PDF or print on Musescore.com] 中收集了 2650 张图像。每张图像都包含一个包含 3 到 20 个音符的乐谱片段。我们手动标记所有图像的真实标签序列(非 ezpitches 序列)。通过旋转、缩放和噪声破坏,以及用自然图像替换背景,将收集的图像增强为 265k 个训练样本。为了进行测试,我们创建了三个数据集:1)“干净”,包含从 [Free sheet music | Download PDF or print on Musescore.com] 收集的 260 张图像。示例如图 5.a 所示;2)“合成”,使用上述增强策略从“干净”创建。它包含 200 个样本,其中一些如图 5.b 所示;3)“真实世界”,包含 200 张用手机相机从音乐书中拍摄的乐谱片段图像。示例如图5.c.1所示
-
-
图 5. (a) 收集的干净乐谱图像 (b) 合成的乐谱图像。 © 用手机相机拍摄的真实世界乐谱图像。
-
-
由于训练数据有限,我们使用简化的 CRNN 配置以减少模型容量。与表 1 中指定的配置不同,第 4 和第 6 个卷积层被删除,并且 2 层双向 LSTM 被 2 层单向 LSTM 取代。网络在图像和相应的标签序列对上进行训练。使用两个指标来评估识别性能:1)片段准确度,即正确识别的乐谱片段百分比;2)平均编辑距离,即预测音高序列和基本事实之间的平均编辑距离。为了进行比较,我们评估了两个商用 OMR 引擎,即 Capella Scan 和 PhotoScore 。
-
表 4 总结了结果。CRNN 的表现远胜于这两个商业系统。Capella Scan 和 PhotoScore 系统在 Clean 数据集上表现相当好,但它们在合成数据和真实数据上的表现显著下降。主要原因是它们依赖于稳健的二值化来检测谱线和音符,但由于光照条件差、噪声损坏和背景杂乱,二值化步骤通常会在合成数据和真实数据上失败。另一方面,CRNN 使用对噪声和失真具有高度鲁棒性的卷积特征。此外,CRNN 中的循环层可以利用乐谱中的上下文信息。每个音符不仅可以识别自己,还可以被附近的音符识别。因此,可以通过将一些音符与附近的音符进行比较来识别它们,例如:对比它们的垂直位置。
-
-
表 4. 在我们收集的三个数据集上,CRNN 与两个商用 OMR 系统的音高识别准确率比较。性能通过片段准确率和平均编辑距离(“片段准确率/平均编辑距离”)进行评估。
-
-
结果显示了 CRNN 的通用性,因为它可以轻松应用于其他基于图像的序列识别问题,只需要很少的领域知识。与 Capella Scan 和 PhotoScore 相比,我们基于 CRNN 的系统仍处于初级阶段,缺少许多功能。但它为 OMR 提供了一种新方案,并在音高识别方面表现出良好的能力。
Conclusion
-
在本文中,我们介绍了一种新型神经网络架构,称为卷积循环神经网络 (CRNN),它结合了卷积神经网络 (CNN) 和循环神经网络 (RNN) 的优点。CRNN 能够接收不同尺寸的输入图像并生成不同长度的预测。它直接在粗级别标签(例如单词)上运行,在训练阶段不需要对每个单独的元素(例如字符)进行详细注释。此外,由于 CRNN 放弃了传统神经网络中使用的全连接层,因此它产生了一个更紧凑、更高效的模型。所有这些特性使 CRNN 成为一种基于图像的序列识别的绝佳方法。
-
在场景文本识别基准测试中的实验表明,与传统方法以及其他基于 CNN 和 RNN 的算法相比,CRNN 取得了优异或极具竞争力的性能。 这证实了所提算法的优势。此外,CRNN 在光学音乐识别 (OMR) 基准测试中的表现明显优于其他竞争对手,这验证了 CRNN 的通用性。
-
其实 CRNN 是一个通用框架,可以应用到其他涉及图像序列预测的领域和问题(比如汉字识别)。如何进一步加速 CRNN 并使其在实际应用中更加实用是未来值得探索的另一个方向。