第五章 深度学习
十二、光学字符识别(OCR)
3. 文字识别技术
3.1 CRNN+CTC(2015)
CRNN(Convolutional Recurrent Neural Network)即卷积递归神经网络,是DCNN和RNN的组合,专门用于识别图像中的序列式对象。与CTC loss配合使用,进行文字识别,可以直接从文本词级或行级的标注中学习,不需要详细的字符级的标注。
3.1.1 特点
(1)与大多数现有的组件需要单独训练和协调的算法相比,它是端对端训练的。
(2)它自然地处理任意长度的序列,不涉及字符分割或水平尺度归一化。
(3)它不仅限于任何预定义的词汇,并且在无词典和基于词典的场景文本识别任务中都取得了显著的表现。
(4)它产生了一个有效而小得多的模型,这对于现实世界的应用场景更为实用。
3.1.2 网络结构
- 卷积层:从输入图像中提取特征序列;
- 循环层:预测每一帧的标签分布;
- 转录层:将每一帧的预测变为最终的标签序列。
3.1.3 特征提取
在CRNN模型中,通过采用标准CNN模型(去除全连接层)中的卷积层和最大池化层来构造卷积层的组件。这样的组件用于从输入图像中提取序列特征表示。在进入网络之前,所有的图像需要缩放到相同的高度。然后从卷积层组件产生的特征图中提取特征向量序列,这些特征向量序列作为循环层的输入。具体地,特征序列的每一个特征向量在特征图上按列从左到右生成。这意味着第i个特征向量是所有特征图第i列的连接。在我们的设置中每列的宽度固定为单个像素。由于卷积层,最大池化层和元素激活函数在局部区域上执行,因此它们是平移不变的。因此,特征图的每列对应于原始图像的一个矩形区域(称为感受野),并且这些矩形区域与特征图上从左到右的相应列具有相同的顺序。如图2所示,特征序列中的每个向量关联一个感受野,并且可以被认为是该区域的图像描述符。
3.1.4 序列标注
一个深度双向循环神经网络是建立在卷积层的顶部,作为循环层。循环层预测特征序列 x = x 1 , … , x T x = x_1,…,x_T x=x1,…,xT中每一帧 x t x_t xt的标签分布 y t y_t yt。循环层的优点是三重的。首先,RNN具有很强的捕获序列内上下文信息的能力。对于基于图像的序列识别使用上下文提示比独立处理每个符号更稳定且更有帮助。以场景文本识别为例,宽字符可能需要一些连续的帧来完全描述(参见图2)。此外,一些模糊的字符在观察其上下文时更容易区分,例如,通过对比字符高度更容易识别“il”而不是分别识别它们中的每一个。其次,RNN可以将误差差值反向传播到其输入,即卷积层,从而允许我们在统一的网络中共同训练循环层和卷积层。第三,RNN能够从头到尾对任意长度的序列进行操作。
传统的RNN单元在其输入和输出层之间具有自连接的隐藏层。每次接收到序列中的帧 x t x_t xt时,它将使用非线性函数来更新其内部状态 h t h_t ht,该非线性函数同时接收当前输入 x t x_t xt和过去状态 h t − 1 h_{t−1} ht−1作为其输入: h t = g ( x t , h t − 1 ) h_t = g(x_t, h_{t−1}) ht=g(xt,ht−1)。那么预测 y t y_t yt是基于 h t h_t ht的。以这种方式,过去的上下文 { x t ′ } t ′ < t \lbrace x_{t\prime} \rbrace _{t \prime < t} {xt′}t′<t被捕获并用于预测。然而,传统的RNN单元有梯度消失的问题,这限制了其可以存储的上下文范围,并给训练过程增加了负担。长短时记忆(LSTM)是一种专门设计用于解决这个问题的RNN单元。LSTM(图3所示)由一个存储单元和三个多重门组成,即输入,输出和遗忘门。在概念上,存储单元存储过去的上下文,并且输入和输出门允许单元长时间地存储上下文。同时,单元中的存储可以被遗忘门清除。LSTM的特殊设计允许它捕获长距离依赖,这经常发生在基于图像的序列中。
LSTM是定向的,它只使用过去的上下文。然而,在基于图像的序列中,两个方向的上下文是相互有用且互补的。因此,将两个LSTM,一个向前和一个向后组合到一个双向LSTM中。此外,可以堆叠多个双向LSTM,得到如图3.b所示的深双向LSTM。深层结构允许比浅层抽象更高层次的抽象,并且在语音识别任务中取得了显著的性能改进。
3.1.5 转录
转录是将RNN所做的每帧预测转换成标签序列的过程。数学上,转录是根据每帧预测找到具有最高概率的标签序列。在实践中,存在两种转录模式,即无词典转录和基于词典的转录。词典是一组标签序列,预测受拼写检查字典约束。在无词典模式中,预测时没有任何词典。在基于词典的模式中,通过选择具有最高概率的标签序列进行预测。
3.1.5.1 标签序列的概率
采用”联接时间分类“(CTC)层中定义的条件概率。按照每帧预测 y = y 1 , … , y T y=y_1,…,y_T y=y1,…,yT对标签序列 l l l定义概率,并忽略 l l l中每个标签所在的位置。因此,当我们使用这种概率的负对数似然作为训练网络的目标函数时,我们只需要图像及其相应的标签序列,避免了标注单个字符位置的劳动。
条件概率的公式简要描述如下:输入是序列 y = y 1 , … , y T y = y_1,…,y_T y=y1,…,yT,其中 T T T是序列长度。这里,每个 y t ∈ ℜ ∣ L ’ ∣ y_t \in\Re^{|{\cal L}’|} yt∈ℜ∣L’∣是在集合 L ’ = L ∪ {\cal L}’ = {\cal L} \cup L’=L∪上的概率分布,其中 L {\cal L} L包含了任务中的所有标签(例如,所有英文字符),以及由-
表示的“空白”标签。序列到序列的映射函数 B {\cal B} B定义在序列 π ∈ L ’ T \boldsymbol{\pi}\in{\cal L}’^{T} π∈L’T上,其中 T T T是长度。 B {\cal B} B将 π \boldsymbol{\pi} π映射到 l \mathbf{l} l上,首先删除重复的标签,然后删除blank
。例如, B {\cal B} B将“–hh-e-l-ll-oo–”(-
表示blank
)映射到“hello”。然后,条件概率被定义为由 B {\cal B} B映射到 l \mathbf{l} l上的所有 π \boldsymbol{\pi} π的概率之和:
p ( l ∣ y ) = ∑ π : B ( π ) = l p ( π ∣ y ) , \begin{equation} p(\mathbf{l}|\mathbf{y})=\sum_{\boldsymbol{\pi}:{\cal B}(\boldsymbol{\pi})=\mathbf{l}}p(\boldsymbol{\pi}|\mathbf{y}),\tag{1} \end{equation} p(l∣y)=π:B(π)=l∑p(π∣y),(1)
π \boldsymbol{\pi} π的概率定义为 p ( π ∣ y ) = ∏ t = 1 T y π t t p(\boldsymbol{\pi}|\mathbf{y})=\prod_{t=1}^{T}y_{\pi_{t}}^{t} p(π∣y)=∏t=1Tyπtt, y π t t y_{\pi_{t}}^{t} yπtt是时刻 t t t时有标签 π t \pi_{t} πt的概率。由于存在指数级数量的求和项,直接计算方程1在计算上是不可行的。然而,使用CTC中描述的前向算法可以有效计算方程。
3.1.5.2 无字典转录
在这种模式下,将具有方程1中定义的最高概率的序列 l ∗ \mathbf{l}^{*} l∗作为预测。由于不存在用于精确找到解的可行方法,我们采用CTC中的策略。序列 l ∗ \mathbf{l}^{*} l∗通过 l ∗ ≈ B ( arg max π p ( π ∣ y ) ) \mathbf{l}^{*}\approx{\cal B}(\arg\max_{\boldsymbol{\pi}}p(\boldsymbol{\pi}|\mathbf{y})) l∗≈B(argmaxπp(π∣y))近似发现,即在每个时间戳 t t t采用最大概率的标签 π t \pi_{t} πt,并将结果序列映射到 l ∗ \mathbf{l}^{*} l∗。
3.1.5.3 基于词典的转录
在基于字典的模式中,每个测试采样与词典 D {\cal D} D相关联。基本上,通过选择词典中具有方程1中定义的最高条件概率的序列来识别标签序列,即 l ∗ = arg max l ∈ D p ( l ∣ y ) \mathbf{l}^{*}=\arg\max_{\mathbf{l}\in{\cal D}}p(\mathbf{l}|\mathbf{y}) l∗=argmaxl∈Dp(l∣y)。然而,对于大型词典,例如5万个词的Hunspell拼写检查词典,对词典进行详尽的搜索是非常耗时的,即对词典中的所有序列计算方程1,并选择概率最高的一个。为了解决这个问题,我们观察到,通过无词典转录预测的标签序列通常在编辑距离度量下接近于实际结果。这表示我们可以将搜索限制在最近邻候选目标 N δ ( l ’ ) {\cal N}_{\delta}(\mathbf{l}’) Nδ(l’),其中 δ \delta δ是最大编辑距离, l ’ \mathbf{l}’ l’是在无词典模式下从 y \mathbf{y} y转录的序列:
l ∗ = arg max l ∈ N δ ( l ’ ) p ( l ∣ y ) . \begin{equation} \mathbf{l}^{*}=\arg\max_{\mathbf{l}\in{\cal N}_{\delta}(\mathbf{l}’)}p(\mathbf{l}|\mathbf{y}).\tag{2} \end{equation} l∗=argl∈Nδ(l’)maxp(l∣y).(2)
可以使用BK树数据结构有效地找到候选目标 N δ ( l ’ ) {\cal N}_{\delta}(\mathbf{l}’) Nδ(l’),这是一种专门适用于离散度量空间的度量树。BK树的搜索时间复杂度为 O ( log ∣ D ∣ ) O(\log|{\cal D}|) O(log∣D∣),其中 ∣ D ∣ |{\cal D}| ∣D∣是词典大小。因此,这个方案很容易扩展到非常大的词典。在我们的方法中,一个词典离线构造一个BK树。然后,我们使用树执行快速在线搜索,通过查找具有小于或等于 δ \delta δ编辑距离来查询序列。
3.1.6 网络训练
X = { I i , l i } i {\cal X}= \lbrace I_i,\mathbf{l}_i \rbrace _i X={Ii,li}i表示训练集, I i I_{i} Ii是训练图像, l i \mathbf{l}_{i} li是真实的标签序列。目标是最小化真实条件概率的负对数似然:
O = − ∑ I i , l i ∈ X log p ( l i ∣ y i ) , \begin{equation} {\cal O}=-\sum_{I_{i},\mathbf{l}_{i}\in{\cal X}}\log p(\mathbf{l}_{i}|\mathbf{y}_{i}),\tag{3} \end{equation} O=−Ii,li∈X∑logp(li∣yi),(3)
y i \mathbf{y}_{i} yi是循环层和卷积层从 I i I_{i} Ii生成的序列。目标函数直接从图像和它的真实标签序列计算代价值。因此,网络可以在成对的图像和序列上进行端对端训练,去除了在训练图像中手动标记所有单独组件的过程。
网络使用随机梯度下降(SGD)进行训练。梯度由反向传播算法计算。特别地,在转录层中,误差使用前向算法进行反向传播。在循环层中,应用随时间反向传播(BPTT)来计算误差。
为了优化,使用ADADELTA自动计算每维的学习率。与传统的动量方法相比,ADADELTA不需要手动设置学习率。更重要的是,我们发现使用ADADELTA的优化收敛速度比动量方法快。
3.1.7 结论
该模型在4个公共测试数据集上取得了较好的成绩,跟其它基于深度学习模型相比,具有明显提升。如下表所示:
- IIIT5k,SVT,IC03,IC13表示4个数据集
- 50,1k,50k和Full表示使用的字典,None表示识别没有字典
识别图像中的乐谱被称为光学音乐识别(OMR)问题。在乐谱识别方面,CRNN大大优于两个商业系统。Capella Scan和PhotoScore系统在干净的数据集上表现相当不错,但是它们的性能在合成和现实世界数据方面显著下降。主要原因是它们依赖于强大的二值化来检五线谱和音符,但是由于光线不良,噪音破坏和杂乱的背景,二值化步骤经常会在合成数据和现实数据上失败。另一方面,CRNN使用对噪声和扭曲具有鲁棒性的卷积特征。此外,CRNN中的循环层可以利用乐谱中的上下文信息。每个音符不仅自身被识别,而且被附近的音符识别。因此,通过将一些音符与附近的音符进行比较可以识别它们,例如对比他们的垂直位置。