CRNN算法详解
因此,CRNN算法主要采用CNN+RNN+CTC的三层网络结构,自下而上依次为:
(1)卷积层,使用CNN从输入图像中提取特征序列;
(loop层,利用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,也就是说网络对输入图片的宽度没有特殊要求,但是高度必须调整为32。
假设现在有一个图像输入。为了将要素输入到重现层,请执行以下处理:
关于CNN原理的详细解释,请参考/writer #/notebooks/46006121/Notes/71156459。
由于RNN存在梯度消失的问题,无法获得更多的上下文信息,所以在CRNN中使用了LSTM,其特殊的设计使其可以捕获远距离依赖。
RNN网络对于CNN输出的特征序列X = X1,xt有一个输出yt。为了防止梯度在训练过程中消失,采用LSTM神经单元作为RNN单元。本文认为对于序列的预测,序列的前向信息和后向信息都有助于序列的预测,因此本文采用双向RNN网络。LSTM神经元的结构和双向RNN的结构如下图所示。
示例:
通过以上步骤,我们得到40个特征向量,每个特征向量的长度为512。在LSTM,在一个时间步中引入特征向量用于分类,其中有40个时间步。
我们知道一个特征向量相当于原始图像中的一个小矩形区域,RNN的目标是预测这个矩形区域是哪个字符,也就是根据输入的特征向量,预测得到所有字符的softmax概率分布,这个概率分布是以字符类别数的长度作为CTC层输入的向量。
因为每个时间步都有一个输入特征向量,输出所有字符的概率分布,所以输出一个由40个长度为字符类别数的向量组成的后验概率矩阵,然后将这个后验概率矩阵传输到转录层。
考试时,有两种翻译,一种有词典,一种没有词典。
有字典是指测试时,测试集有一个字典,从测试的输出结果计算出所有字典的概率,最大的就是最终的预测字符串。
没有字典,意味着测试集没有给出测试集包含哪些字符串,预测时选择输出概率最大的作为最终预测字符串。
端到端OCR识别的难点在于如何处理不定序列的对齐!(由于是不定长序列,我们很难按照以前的方法计算损失。如果是定长的话,很容易导致信息的丢失,局限性太大了!)
转录是将RNN对每个特征向量的预测转换成标签序列的过程。数学上,转录就是根据每一帧的预测,找到概率组合最高的标签序列。
详见/writer #/notebooks/46006121/Notes/71156474。