CRNN 论文 CNN + RNN + CTC 经久不衰的文字识别大框架鸭

An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition 2015

Abstract

奠定了文字识别任务上 CNN + RNN + CTC(或者更准确地说是 transcription) 的框架,到 ppocr 都也还是基于这个大框架。不得不说的是,这个框架能出来,CTC 功不可没(迷妹出现~)。甚至我觉得这个框架本身就是 CTC,而不是最后一步是 CTC。我总听到类似把最后 transcription 单独叫作 CTC 的,我觉得这是弱化了 CTC 的工作。2006 年 CTC 被提出的时候就是点名要解决 RNN 不能处理未分割序列问题的,可以理解为就是绑定了 RNN + transcription,至于是原数据直接喂进 RNN 还是特征喂进去,那不是很随意的事?如果没有 CTC,RNN 就不能用来处理未分割的序列数据。

  • CNN 做 feature extraction + RNN 做 sequence modeling + transcription。
  • 和以往工作相比:(1)端到端识别;(2)任意长度;(3)独立与语言;(4)模型更小。

Introduction

当时深度学习神经网络盛行,但主要集中在卷积部分,做物体检测和分类,少有涉足序列识别问题。而 CNN 经常限定输入和输出的维度,所以不适合直接做序列(不擅长吧,也不是完全不能)。CNN 尝试文字识别任务是切分字符,然后再一个个地识别。嗯,费劲。

RNN 很适合做序列任务,在训练和预测过程中,都不需要知道序列中目标元素的具体位置(也就是未分割序列,这里!这个特点是 CTC 论文赋予 RNN 的技能点)。先前有工作单独提取图片的 HOG 特征,然后将其做成特征序列再送入 RNN。但是两个步骤之间是分离的。嗯,不够丝滑。

其他的不使用神经网络方法的也有很多。比如把特征和对应字符做成“字典”的,那么文字识别就变成了“查询检索”的工作。

本文的 CRNN:

  • 端到端,有 CNN 的特征提取能力 + RNN 的序列处理能力;
  • 不限定序列长度;
  • better and high performance;
  • 参数更少。

The Proposed Network Architecture

来,CRNN,上图。

整体结构非常简单清晰一气呵成。从底向上依次是 CNN、RNN 和 Transcription,这三部分是个整体,可以被联合训练。
在这里插入图片描述

Feature Sequence Extraction

所有的图片,高度会被 resize 到一致。每个 feature vector 是在 feature map 上,论文设定 1 个像素宽度,从左到右依次按列取出来的。那么映射到原图,感受野就如下图。这里肯定要保证,每个 feature vector 映射到原图的感受野之间,不能有缝隙(那不就漏了嘛),且不能太宽(这样一个 feature vector 就覆盖了一个以上字符的特征了)。

这里的一个 feature vector 就叫一个 frame(或者叫在原图上的映射长方形也行),总之这里 frame 按照顺序排列在一起就变成 feature sequence。这个 sequence 就会被送入到 RNN 中去处理。

上述这个机制,能够实现对序列数据长度(宽度)变化的适应。
在这里插入图片描述

Sequence Labeling

称上面 CNN 得到的 feature vector x t x_t xt 们,排序成序列之后作为 RNN 的输入 X = x 1 , x 2 , . . . x T X = x_1, x_2, ... x_T X=x1,x2,...xT。RNN 在此处处理序列有 3 点优势:

  • 对上下文信息强大的 capability,在文字识别任务上,结合上下文比单独处理切割好的字块效果要好。比如,il 的识别,它俩在一块更好识别和区分,如果单独是 il 反而特征容易混。
  • RNN 网络特性,能够反向传播,能和 CNN “打成一片”,联合训练。
  • RNN 理论上可以处理任意长的序列。

传统 RNN 有自连接,在每个时刻,它接受输入 x t x_t xt,然后通过非线性激活函数更新自身的状态,从 h t − 1 h_{t-1} ht1 更新到 h t h_t ht,更新表示为 h t = g ( x t , h t − 1 ) h_t = g(x_t, h_{t - 1}) ht=g(xt,ht1)。然后根据更新后的 h t h_t ht 来决定输出/预测 y t y_t yt。由于有隐藏状态的存在,过去的信息能够得以保留,用于当前时刻的预测。

但是,pathetic 的是,额……梯度要么消失要么爆炸鸭。所以传统 RNN 是不能用的,我觉得它已经是个名胜古迹了(捂脸。目前还在用的比较多的就是 LSTM,或者很多 LSTM 的变种。总之,最 basic 的 RNN 只有历史价值了,只能出现在教材里啦……

Transcription

这部分的工作就是把前面 RNN 逐帧预测的结果“转录翻译”一下得到最后的结果。理论上来讲,这个过程应该是,在给定 RNN 预测序列的条件下,找到可能性最大的序列。但是这个问题不是很好解决,所以实际上是求的近似最优解。

一共有两种方案,完全不使用词汇信息(lexicon-free)或者使用词汇信息加以约束(lexicon based)。这里的词汇信息可以理解为是个字典,用来做“拼写检查”的。也就是说,可以理解为纯粹的 CRNN 就像人一样,在认单词的时候可能会个别地方看错,词汇信息字典就是一份先验知识,绑定先验知识可以大大降低“拼写”的错误率。如果使用字典的话,还会涉及一个新问题,就是把直接识别的结果匹配到字典中的词汇。这个问题也是需要特殊处理的,否则时效性会很差,论文使用的 BK tree 来解决这个匹配问题。

Probability of label sequence

label sequence l l l 在给定逐帧输出的预测 y = y 1 , y 2 , . . . , y T y = y_1, y_2, ..., y_T y=y1,y2,...,yT 条件概率,它会忽略 l l l 中每个 label (在图像上的)的具体位置(这样就能解决不同字符宽度等造成的问题了,还可以适应不同的字符间距,这个特点在很多其他任务中也是非常常见的,比如语音识别等)。

也正因为不需要再在意 label 的具体位置,在准备数据集用于训练时,只需要按字条来做就好(不再需要预分割好每个字符再给每个字符添加 label)。这样,数据集的标注任务量就大大降低了。

这里条件概率的求取思路也是非常简单粗暴:有多种 RNN 的逐帧预测 y y y 经过映射 B \mathcal{B} B map 之后都对应同一个序列 l l l,也可以理解为有多种路径( y y y)都通往同一个终点 l l l。把这多种路径的概率累加起来就是终点序列 l l l 的条件概率。

p ( l ∣ y ) = Σ π : B ( π ) = l p ( π ∣ y ) p(l | y) = \Sigma _{\pi:\mathcal{B}(\pi) = l} p(\pi | y) p(ly)=Σπ:B(π)=lp(πy)

  • p ( π ∣ y ) p(\pi | y) p(πy):在给定预测 y 前提条件下,路径 π \pi π 出现的概率;
  • Σ π : B ( π ) = l \Sigma _{\pi:\mathcal{B}(\pi) = l} Σπ:B(π)=l:累加求和,对谁呢?对某种情况下的路径(们),这些路径有什么特点呢?经过映射 B \mathcal{B} B 能够得到标记序列 l l l
  • p ( l ∣ y ) p(l | y) p(ly) :求得的就是在给定预测 y 的前提条件下,得到标记序列 l l l 的概率。
    这里的 map B \mathcal{B} B 做的事就是首先去除连续相同的字符,然后再去除空格。比如长度为 16 的字符串(可以就看作是 RNN 的直接输出吧) “ − − h h − e − l − l l − o o − − --hh-e-l-ll-oo-- hhellloo” 经过 map 之后就是 “ h e l l o hello hello”。

上面公式中 p ( π ∣ y ) p(\pi | y) p(πy) 怎么求呢?就是依次把路径 π \pi π 中的逐帧预测 y π t y_{\pi_t} yπt 的概率相乘,同样以上面 hello 的例子来说,就是 p(0 时刻出现空格) × p(1 时刻出现空格) × p(2 时刻出现 h) × p(3 时刻出现h) × … × p(15 时刻出现空格) ,至于每个单独的概率就直接来自 RNN 在对应时刻激活函数输出的概率。

p ( π ∣ y ) = Π t = 1 T y π t t p(\pi | y) = \Pi^T_{t = 1}y^t_{\pi_t} p(πy)=Πt=1Tyπtt

Lexicon-free transcription

前面部分说明了如何在 RNN 逐帧预测的结果 y = y 1 , y 2 , . . . , y T y = y_1, y_2, ..., y_T y=y1,y2,...,yT 上计算某个 label sequence l l l 的概率,理论上得需要在一个巨大空间里面去计算每个可能的 l l l 的条件概率,然后选择条件概率最大的那个(就是得穷举哦……这谁玩得起啊),所以采用的折中的策略是,就求一个相对还不错的解就好了,直接让 RNN 的输出在每帧都取概率最大的 label 字符,然后这就生成一个预测序列 y = y 1 , y 2 , . . . , y T y = y_1, y_2, ..., y_T y=y1,y2,...,yT ,然后直接在这个序列上,做映射 B \mathcal{B} B 得到一个 label sequence,就作为预测 l ∗ l^* l 了。

Lexicon-based transcription

上面一小节是对应没有任何语言词汇背景知识下的情况,现在说如果有语言词汇先验知识的情况,那有何不同呢?
此时会通过在词汇字典中查询,找到能让条件概率 p ( l ∣ y ) p(l | y) p(ly) 最大的 l l l 作为最后的预测 l ∗ l^* l

别高兴得太早,“查字典”这件事,当字典很大,遍历字典中的 l l l 来计算 p ( l ∣ y ) p(l | y) p(ly) 仍然是个“impossible”的任务。当然,其实稍微考虑一下效率问题,就能发现即使是查字典也是插相近的而不是从头翻一遍。所以在前面不依赖字典的 predition l ∗ l^* l 的条件下,仅仅在与 l ∗ l^* l 之间满足最近邻条件的候选集合中搜索即可。其中候选集合为 N δ ( l ′ ) \mathcal{N}_\delta(l') Nδ(l),其中 δ \delta δ 是最大编辑距离, l ′ l' l 是不依赖字典的 prediction y y y transcribe 而来,也就是在候选集合 N \mathcal{N} N 中选择一个 l l l 作为预测 l ∗ l^* l,这个 l l l 应该能够满足让条件概率 p ( l ∣ y ) p(l|y) p(ly) 最大。

l ∗ = a r g m a x l ∈ N δ ( l ′ ) p ( l ∣ y ) l^* = arg max_{l \in \mathcal{N_{\delta}(l')}} p(l|y) l=argmaxlNδ(l)p(ly)

那么还有一个问题,就是候选集合 N δ ( l ′ ) \mathcal{N}_\delta(l') Nδ(l) 到底怎么算。论文采用的离线构建 BK-tree 再在线查询与 l ′ l' l 距离小于等于 δ \delta δ l l l 进入集合 N δ ( l ′ ) \mathcal{N}_\delta(l') Nδ(l)

Network Training

训练样本为 X = { I i , l i } i \mathcal{X} = \{I_i, l_i \}_i X={Ii,li}i,其中 I i I_i Ii 为图片, l i l_i li 为标记 gt。训练网络过程中,就是要最小化 gt 的负对数似然条件概率,使用的目标函数就是:

O = − Σ I i , l i ∈ X l o g p ( l i ∣ y i ) \mathcal{O} = - \Sigma_{I_i, l_i \in \mathcal{X}} log p(l_i | y_i) O=ΣIi,liXlogp(liyi)

前面也有提到了向量 y i y_i yi 就是图片 I i I_i Ii 在 RNN 的逐帧输出。整个 loss 函数,可以保证整个网络能够进行端到端训练。

SGD ,反向传播,Adadelta ρ = 0.9 \rho = 0.9 ρ=0.9 来计算每个维度的学习率,不需要手动设置学习率,收敛更快。

Experiments

Datasets

Implementation Details

整体的网络结构如下表。网络骨架是 VGG,在第 3 - 4 最大值池化中,用的 1 × 2 而不是传统的方格,这样 CNN 阶段输出的 feature map 能够更宽一点,也就是 frame 更多一点更细致一些。

比如包含 10 个字母的图片,大小为 100 × 32(宽 × 高),经过 CNN 后,会变成 25 frame(仅仅在前两个 maxpooling 尺寸减半),这样 25 frame cover 10 个字母应该是戳戳有余了。如果不做这个变化,应该会输出降低 4 倍的 frame,先不说整数的事情,10 个字母 才几个 frame,肯定是不够细致的,会存在多个字母的 feature map 在一起,这种情况后面没法分类。

为了训练 RNN 和 CNN,加了 batchnorm 层,来加速训练和收敛。

数据都会被 resize 到 100 × 32 的 size 进行 batch 训练。

这里需要注意的是,最好你的数据在 resize 过程中不会严重变形。
在这里插入图片描述

Comparative Evaluation

Musical Score Recognition

Conclusion

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值