06. OCR学习路径之CRNN文本识别

2020-01-02 11:21:17 浏览数 (1)

前言

在了解了如何检测到文本之后,我们需要识别出检测文本内的文字信息。在文本识别完成之后,整个OCR光学字符识别的过程才算基本完成。那么,本次课程主要讲述识别文本的算法。

一.算法简介

检测出的文本片段一般是一行文字,具有sequence-like属性,因此此类文本识别归属为image-based sequence recognition的问题。这就与常规的物体识别不同,它有一系列的标签,识别出的结果是序列化的字符,而不是单个标签,类序列对象的另一个特点是其长度不统一,标签也是长度变化的。因此,解决此类问题,就不能采用固定输入和输出的传统CNN模型了。

对于此类识别问题,目前比较流行的算法就是CRNN CTC的方式,我们将展开来说。

一篇比较经典的文章:An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition。

链接:https://arxiv.org/pdf/1507.05717.pdf

优点:不需要预处理(二值化、切割等)、可以直接从sequence的target上学习(label为语句)、不受序列长度约束。

CRNN CTC网络架构CRNN CTC网络架构

架构包括三部分:

1) 卷积层,从输入图像中提取特征序列;

2) LSTM层,预测每一帧的标签分布,从卷积层获取的特征序列的标签(真实值)分布

3) 转译层,将每一帧的预测变为最终的标签序列。

CRNN借助了语音识别中解决不定长语音序列的思路。对于序列问题的解决,通常使用循环网络RNN,为了消除RNN网络常见的梯度爆炸问题,引出LSTM,这些算法在语音识别领域都已相当成熟,有很好的表现,现在就是设计特征,让图像特征可以有近似于语音的特征表达。

语音识别中的时间对应着图像的横向尺度W。

如何获取上述特征呢?

现在输入有个图像,为了将特征输入到Recurrent Layers,做如下处理:

l 首先会将图像缩放到 32×W×1 大小

l 然后经过CNN后变为 1×(W/4)× 512

l 接着针对LSTM,设置 T=(W/4) , D=512 ,即可将特征输入LSTM。

l LSTM有256个隐藏节点,经过LSTM后变为长度为T × nclass的向量,再经过softmax处理,列向量每个元素代表对应的字符预测概率,最后再将这个T的预测结果去冗余合并成一个完整识别结果即可。

网络配置如下图,

CRNN网络配置CRNN网络配置

其中,‘k’, ‘s’ 和‘p’ 代表 kernel size, stride 和padding size

以上都比较好理解,但是最后一步,经过LSTM后变为长度为T × nclass的向量,再经过softmax处理,列向量每个元素代表对应的字符预测概率,最后再将这个T的预测结果去冗余合并成一个完整识别结果即可。如何去冗余呢?这可是个技术活了。

当然,语音识别也早就做好了,文字识别在这里所做的一切都是为了吧图像特征与语音特征近似化,其他的工作都交给语音识别算法了。

二.CTC

详细的CTC推导过程网上已经有很多,说一下我的理解就是。由于输出的T=W/4是一个不定长的结果,而我们需要做的就是将该序列结果翻译成最终的识别结果。但是LSTM进行时序分类时的输出有一个特点,就是同一个字符被连续识别两次,因此需要一个去冗余机制,但是简单粗暴地去处冗余也不行,比如“--hh-e-l-ll-oo--”,直接去冗余就变成helo了,那就识别错误了。

因此CTC为了解决这种二义性,提出了插入blank机制,比如下图的以符号“-”代表blank。若标签为“aaa-aaaabb”则将被映射为“aab”,而“aaaaaaabb”将被映射为“ab”。引入blank机制,就可以很好地处理了重复字符的问题了。

-s-t-aatte转译成state-s-t-aatte转译成state

但是通常一个正确的输出序列可以有多条路径达成,比如直接贴一张其他博主的图吧,下面酱紫的:

可以看出,这4条路线都能达到正确的结果输出,那么如何找出最优的路径呢?就引出下一个公式,

其中

Β 的作用就是maps π onto l by firstly removing the repeated labels。

y^t_πt是时刻t在能输出正确值πt的情况下,所输出某一个字符的概率。

每一个字符的输出都对应着一个softmax计算出的概率ytπt ,再把每一个字符输出对应的概率相乘,得出这条路径的概率为p(π|y),那所有路径的概率总和就是p(l|y),也就是以上公式想表达的意思了。

三.Loss设计

由以上分析,知道了最佳路径的概率值,那么现在就可以设计一个训练的Loss函数来寻找一个最大概率的输出序列,

Ii是训练图片,I_i是真实标签。

通过对概率的计算,就可以对之前的神经网络进行反向传播更新。类似普通的分类,CTC的损失函数O定义为负的最大似然,为了计算方便,对似然取对数。我们的训练目标就是使得损失函数O优化得最小即可。

四.训练阶段

训练的时候,为了加速训练,所有的图片都scale到100*32

测试的图片固定高度为32的比例,宽度按对应比例缩放。

总结

该算法在识别乐谱上也有良好的表现,这显然证实了它的泛化性。

可以实现端到端的训练。

1) 不依赖字符切分;

2) 不限定语料范围;

3) 模型参数相对较少;

4) 可充分学习到上下文的关系,等等。

缺点:

1) CTC每次都要计算概率,采用前缀搜索算法解码或者约束解码算法;

2) 受CTC算法对速度的要求,输出长度因此受到限制,不能太长。

0 人点赞