CRNN算法详解

CRNN算法详解,第1张

文字识别是对序列的预测方法,所以采用了对序列预测的RNN网络。通过CNN将图片的特征提取出来后采用RNN对序列进行预测,最后通过一个CTC的翻译层得到最终结果。

所以CRNN算法主要采用的是CNN+RNN+CTC三层网络结构,从下到上,依次为:

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

(2)循环层,使用RNN,预测从卷积层获取的特征序列的标签(真实值)分布;

(3)转录层,使用CTC,把从循环层获取的标签分布通过去重整合等 *** 作转换成最终的识别结果。

卷积层共包含7层卷积神经网络,基础结构采用的是VGC的结构,其中输入是把灰度图缩放到尺寸为W*32,即固定高。在第三个和第四个池化层的时候,为了追求真实的高宽比例,采用的核尺寸为1*2(并非2*2)。为了加速收敛并引入了BN层。 把CNN提取到的特征图按列切分,每一列的512维特征,输入到两层各256单元的双向LSTM进行分类。在训练过程中,通过CTC损失函数的指导,实现字符位置与类标的近似软对齐。

如图:

现在需要从CNN模型产生的特征图中提取特征向量序列,每一个特征向量(红色框)在特征图上按列从左到右生成,每一列包含512维汪握特征,这意味着第i个特征向量是所有的特征图第i列像素的连接,这些特征向量就构成一个序列。

由于卷积层,最大池化层和激活函数在局部区域上执行,因此它们是平移不变的。因此特征图的每列(即一个特征向量)对应于原始图像的一个矩形区域(成为感受野),并且这些矩形区域与特征图上从左到右的相应列具有相同的顺序。特征序列中的每个向量关联一个感受野。

提取的特征序列中的向量是从特征图上从左到右按照顺序生成的,每个特征向量表示了图像上一定宽度上的特征,论文中使用的这个宽度是1,就是单个像素。

如果一张包含10个字符的图片大小为100×32,经过上述的CNN网络得到的特征尺度为25×1(这里忽略通道数),这样得到一个序列,每一列特征对应原图的一个矩形区域(如下图所示),这样就很方便作为RNN的输入进行下一步的计算了,而且每个特征与输入有一个一对一的对应关系。

从上图可以看出,对VGG的调整如下:

1.为了能将CNN提取的特征作为输入,输入到RNN网络中,文章将第三和第困高庆四个maxpooling的核尺度从2×2改为了1×2

2.为了加速网络的训练,在第五和第六个卷积层后面加上了BN层。

为什么将第三和第四个maxpooling的核尺度从2×2改为1×2是为了方便的将CNN的提取特征作为RNN的输入.首先要注意的是这个网络的输入为W×32,也就是说该网络对输入图片的宽没有特殊的要求,但是高都必须resize到32。

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

关于CNN原理详解,具体可以参考: https://www.jianshu.com/writer#/notebooks/46006121/notes/71156459

因为 RNN 有梯度消失的问题,不能获取更多上下文信息,所以 CRNN 中使用的是 LSTM,LSTM 的特殊设计允许它捕获长距离依赖。

RNN网络是对于CNN输出的特征序列x=x1,⋯⋯,xt,每一个输入xt,都有一个输出yt, 为了防止训练时梯度的消失,文章采用了LSTM神经单元作为RNN的单元。文章认为对于序列的预测,序列的前向信息和后向信息都有助于序列的预测,所以文章采用了双向念衫RNN网络。LSTM神经元的结构和双向RNN结构如下图所示。

示例:

通过上面一步,我们得到了40个特征向量,每个特征向量长度为512,在 LSTM 中一个时间步就传入一个特征向量进行分类,这里一共有40个时间步。

我们知道一个特征向量就相当于原图中的一个小矩形区域,RNN 的目标就是预测这个矩形区域为哪个字符,即根据输入的特征向量,进行预测,得到所有字符的softmax概率分布,这是一个长度为字符类别数的向量,作为CTC层的输入。

因为每个时间步都会有一个输入特征向量 ,输出一个所有字符的概率分布 ,所以输出为 40 个长度为字符类别数的向量构成的后验概率矩阵,然后将这个后验概率矩阵传入转录层。

测试时,翻译分为两种,一种是带字典的,一种是没有字典的。

带字典的就是在测试的时候,测试集是有字典的,测试的输出结果计算出所有字典的概率,取最大的即为最终的预测字符串

不带字典的,是指测试集没有给出测试集包含哪些字符串,预测时就选取输出概率最大的作为最终的预测字符串。

端到端OCR识别的难点在于怎么处理不定长序列对齐的问题!(因为是不定长序列,按照以前的方法我们很难去计算loss,如果是定长的话容易造成信息的丢失,而且局限性太大!)

转录是将 RNN 对每个特征向量所做的预测转换成标签序列的过程。数学上,转录是根据每帧预测找到具有最高概率组合的标签序列。

具体可以参考: https://www.jianshu.com/writer#/notebooks/46006121/notes/71156474

《An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition》 ,是比较老的一篇文首世章了,在2015年6月发表在arxiv上,但是该方法还是被广泛运用。

文章思想:文章认为文字识别是对序列的预测方法,所以采用了对序列预测的RNN网络。通镇做过CNN将图片的特征提取出来后采用RNN对序列进行预测,最后通过一个CTC的翻译层得到最终结果。说白了就是CNN+RNN+CTC的结构。

关于 CTC的解释 在之前写过一篇博客,这里不做重复介绍。

如前面所说的,就是CNN+RNN+CTC,如下图所示

下面来分开说明

CNN结构采用的是VGG的结构,并且文章对VGG网络做了一些微调,如下图所示

从上图可以看出,对VGG的调整如下:

这里需要说明的是第一点,为什么将第三和第四个maxpooling的核尺度从 改为 是为了方便的将CNN的提取特征作为RNN的输入.首先要注意的是这个网络的输入为 ,也就是说该网络对输入图片的宽没有特殊的要求,但是高都必须resize到32。文中举例说明了,如果一张包含10个字符的图片大小为 ,经过上述的CNN网络得到的特征尺度为 (这里忽略通道数),这样得到一个序列,每一列特征对应原图的一个矩形区域(如下图所示),这样就很方便作为RNN的输入进行下一步的计算了,而且每个特征与输入有一个一对一的对应关系。

RNN网络是对于CNN输出的特征序列 ,每一个输入 都有一个输出 。为了防止训练时梯度的消失,文章采用了LSTM神经单元作为RNN的单元。文章认为对于序列的预测,序列的前向信息和后向信息都有助于序列的预测,所以文章采用了双向RNN网络。LSTM神经元的结构和双向RNN结构如下图所示。

测试时,翻译分为两种,一种是带字典的,一种是没有字典的。

带字典的就是在测试的时候,测试集是有字典的,测试的输出结果计算出所有字典的概率,取最大的即为最终的预测字符串

不带字典的,是指测试集没有给出测试集包含哪些字符串,预测时就选取输出概率最大的作为最终的预测字符串。

至于 CTC的解释 这里不详细说明,有需要的请查看我之前的博客,简单说就是将RNN的输出 转化为一个字符串,而转化的输入与输出长度不对应而且输入可以是不同长度的序列。

最小化负对数似然函数

详情还是请查看 CTC算法详解 这篇博文

到这里CRNN算法的基本理论就介绍者旅肢完了

中文本定位与识别的评测方法

欢迎加入OCR交流群:785515057(此群已满)

欢迎加入OCR交流群2:826714963


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12514972.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存