基于CRNN+Attention 的英文单词识别(Attention-OCR)

前言:

针对OCR问题,有各种各样的检测和识别网络,虽然架构各不相同,但是基本思想都是通过CNN网络提取文本特征,然后通过RNN网络学习特征之间的关系,从而实现文本识别。目前已经完成CRNN网络的相关工作,在生成的样本上取得较好的识别效果,但是在应用于扫描生成的PDF文件进行识别时,错误率还是很高的,可能的原因是样本不够贴近具体的应用场景,所以样本中应该包含来自真实场景的采样,或者在生成数据时应该加入扫描PDF的背景,做一个混合,丰富样本。正所谓“见多识广”,对于深度网络的训练,这同样是适用的。

关于CRNN的部分,可以参考我之前的文章:https://blog.csdn.net/zshluckydogs/article/details/88408260

 

摘要:

针对NLP领域的问题,谷歌创造性的提出了Attention机制,优点是可以获得较长的依赖,捕捉局部与全局的关系,并且每一步的计算都是独立的所以可以很好的并行加速,缺点是抛弃了序列的语序顺序,在NLP中是一个致命的缺点,但是研究人员通过加入position-embedding可以解决这个问题。简单点说,attention就是高端的词袋模型(BOW),给一个词根据上下文的关系赋予不同的权重,然后用这个向量表示这个词。

网络结构及其实现:

本文CRNN+Attention 的网络架构,是在CRNN网络的输出层后面加上一层attention机制,详细的说就是(这里用GRU代替LSTM)CNN+GRU(一层,hidden_units = 1024),把GRU网络的输出作为 encoder的输出,然后对其做attention得到attention输出s,假设网络上一时刻的输出 y1, 则y2时刻的输出由y1和s共同作用得到,对y1做embedding然后把(embediing(y1)+s)输入到 GRU网络中,通过softmax得到输出,在进行label转换,即可得到最后的输出序列。

input: x  gray-scale image

net = cnn + gru

Encoder = net(x)

Attention = BahdanauAttention(features, hidden_units)  attention的一种实现方式,更多详情可以Google,其中features是Encoder的输出,hidden_units 与gru的对齐。

y0 = s   假设y0时刻输出是 s, s 就代表英文字母 s



y1_input = embedding(s) + Attention  y1时刻的输入

y2 = softmax(gru(y1_input)) 对y1时刻的输入进行embedding然后输入到gru层做soft Max得到y2输出。


y2 --> e  查lable表得到标签。

大概就是上面这个过程,如果你对CRNN和Attention有一定的了解,这个实质就是对二者的一个结合而已,没有什么特别难以理解的地方。另外,本文没有提到Attention的计算方式,这个可以参考:http://jalammar.github.io/illustrated-transformer/,这篇文章讲解的非常细致,不过是英文的。

对于代码部分,只要你自己清楚的知道所设计的网络结构,根据这个去查需要的工具即可,无非是选择框架,caffe、tensorflow、keras、pytorch等,重点是你必须很清楚的知道网络是怎样的架构,然后去找相应的函数构造出来这个架构即可。所以对于研究算法的同学,写代码不是第一要务,理解算法本身才是。

参考代码:https://github.com/koibiki/CRNN-ATTENTION

我是在这个代码的基础上加了自己的东西,等有时间上传链接吧。补充,这种Attention机制的网络,在进行长文本的识别时效果比较差,而且网络的robust非常差,用训练好的CRNN网络和这个ATTENTION网络对同样的样本(来自于真实扫描版PDF截图)进行识别时两个网络的表现都很差,但是CRNN的效果却是远远优于ATTENTION的。但是Attention堆叠起来的Transformer在机器翻译任务上的表现优于传统的基于LSTM(GRU)的encoder-decoder架构,这得益于attention能够捕捉更长的时间依赖,这是机器翻领域最影响性能的因素,尤其大量的翻译样本都是长句。但是对OCR这个跟图像有着密切关联的领域,在进行Attention时由于只考虑了词间的关联性,可能会破坏词的一些可以帮助识别的视觉特征,所以性能不如经典的CRNN。

以上只是博主根据自己遇到的情况做的推测,不保证正确,有不同见解或者别的问题欢迎来讨论。

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nobrody

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值