attention 文字识别算法_一文读懂CRNN+CTC文字识别

文字识别也是图像领域一个常见问题。然而,对于自然场景图像,首先要定位图像中的文字位置,然后才能进行识别。

所以一般来说,从自然场景图片中进行文字识别,需要包括2个步骤:文字检测:解决的问题是哪里有文字,文字的范围有多少

文字识别:对定位好的文字区域进行识别,主要解决的问题是每个文字是什么,将图像中的文字区域进转化为字符信息。图1 文字识别的步骤

文字检测类似于目标检测,即用 box 标识出图像中所有文字位置。对于文字检测不了解的读者,请参考本专栏文章:场景文字检测—CTPN原理与实现​zhuanlan.zhihu.com

本文的重点是如何对已经定位好的文字区域图片进行识别。假设之前已经文字检测算法已经定位图中的“subway”区域(红框),接下来就是文字识别。图2 文字检测定位文字图像区域

基于RNN文字识别算法主要有两个框架:

图3 基于RNN文字识别2种基本算法框架CNN+RNN+CTC(CRNN+CTC)

CNN+Seq2Seq+Attention

本文主要介绍第一种框架CRNN+CTC,对应TensorFlow 1.15实现代码如下。本文介绍的CRNN网络结构都基于此代码。另外该代码已经支持不定长英文识别。bai-shang/crnn_ctc_ocr_tf​github.com

需要说明该代码非常简单,只用于原理介绍,不保证泛化性等工程问题,也请勿提问。

CRNN基本网络结构图4 CRNN网络结构(此图按照本文给出的github实现代码画的)

整个CRNN网络可以分为三个部分:

假设输入图像大小为

,注意提及图像都是

形式。Convlutional Layers

这里的卷积层就是一个普通的CNN网络,用于提取输入图像的Convolutional feature maps,即将大小为

的图像转换为

大小的卷积特征矩阵,网络细节请参考本文给出的实现代码。Recurrent Layers

这里的循环网络层是一个深层双向LSTM网络,在卷积特征的基础上继续提取文字序列特征。对RNN不了解的读者,建议参考:完全解析RNN, Seq2Seq, Attention注意力机制​zhuanlan.zhihu.com

所谓深层RNN网络,是指超过两层的RNN网络。对于单层双向RNN网络,结构如下:图5 单层双向RNN网络

而对于深层双向RNN网络,主要有2种不同的实现:

tf.nn.bidirectional_dynamic_rnn图6 深层双向RNN网络

tf.contrib.rnn.stack_bidirectional_dynamic_rnn图7 stack形深层双向RNN网络

在CRNN中显然使用了第二种stack形深层双向结构。

由于CNN输出的Feature map是

大小,所以对于RNN最大时间长度

(即有25个时间输入,每个输入

列向量有

)。Transcription Layers

将RNN输出做softmax后,为字符输出。

关于代码中输入图片大小的解释:

在本文给出的实现中,为了将特征输入到Recurrent Layers,做如下处理:首先会将图像在固定长宽比的情况下缩放到

大小(

代表任意宽度)

然后经过CNN后变为

针对LSTM设置

,即可将特征输入LSTM。

所以在处理输入图像的时候,建议在保持长宽比的情况下将高缩放到

,这样能够尽量不破坏图像中的文本细节(当然也可以将输入图像缩放到固定宽度,但是这样由于破坏文本的形状,肯定会造成性能下降)。

考虑训练Recurrent Layers时的一个问题:图8 感受野与RNN标签的关系

对于Recurrent Layers,如果使用常见的Softmax cross-entropy loss,则每一列输出都需要对应一个字符元素。那么训练时候每张样本图片都需要标记出每个字符在图片中的位置,再通过CNN感受野对齐到Feature map的每一列获取该列输出对应的Label才能进行训练,如图9。

在实际情况中,标记这种对齐样本非常困难(除了标记字符,还要标记每个字符的位置),工作量非常大。另外,由于每张样本的字符数量不同,字体样式不同,字体大小不同,导致每列输出并不一定能与每个字符一一对应。

当然这种问题同样存在于语音识别领域。例如有人说话快,有人说话慢,那么如何进行语音帧对齐,是一直以来困扰语音识别的巨大难题。图9

所以CTC提出一种对不需要对齐的Loss计算方法,用于训练网络,被广泛应用于文本行识别和语音识别中。

Connectionist Temporal Classification(CTC)详解

在分析过程中尽量保持和原文符号一致。Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neural Networks​ftp.idsia.ch

整个CRNN的流程如图10。先通过CNN提取文本图片的Feature map,然后将每一个channel作为

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值