这就是神经网络 18:深度学习-文字识别OCR-CRNN

概述

在之前项目中用过CRNN做OCR,我在这里记录一下我对这个算法的理解,我没有对比代码去看,主要结合别人的博客略读论文。

声明一下,主要参考了文末的《一文读懂CRNN+CTC文字识别》这篇文章,基本讲的非常易懂。另外,本算法的难点在于CTC的理解, 基本上参考文末的《Sequence Modeling
With CTC》这篇文章能够比较好的有个理解,参考资料里的另一篇博客《CTC算法详解》基本可以看做是对它的翻译,质量还行。但是整体来说,《一文读懂CRNN+CTC文字识别》这篇文章基本就够了,CTC讲的也很详细。

推理流程

网络主要分为卷积层、循环层和翻译层这三块。推理的时候,主要流程如下:

  • 图像被缩放为32xWx3的大小(宽度不需要固定,高度固定为32就行)
  • 经过卷积层之后,输出1x(W/4)x512大小的特征
  • 上述特征作为循环层(LSTM)的输入。此时我们把这个特征当做一个序列,序列长度为T=W/4,每个1x512的特征被认为是一帧数据,共T帧。
  • LSTM输出为TxN(N为数据集里的字符数),每一帧对应一个1XN的特征,softmax处理后可代表着一帧数据在所有字符上的分类概率
  • 最后,翻译层把softmax处理后的数据翻译为后验概率最大的序列
  • 预测序列做后处理,合并重复的字符,得到最终输出

这就是神经网络 18:深度学习-文字识别OCR-CRNN

卷积层网络结构

32xWx3的大小的图片经过卷积层之后,变为1x(W/4)x512大小的特征。也就是说它在垂直方向的缩放倍数为32,在水平方向的缩放倍数为4。

卷积层主要是为了从图像中提取特征序列,它的输出作为递归层的输入。这个网络是从VGG修改而来,在CRNN发表的年代这无可厚非,当前可以用ResNet等思想去做改进。

这就是神经网络 18:深度学习-文字识别OCR-CRNN

循环层

递归层对特征序列进行预测,每一帧的输出值经过softmax之后,表示这一帧数据在素有字符上的分类概率。

文章认为对于序列的预测,序列的前向信息和后向信息都有助于序列的预测,所以文章采用了双向RNN网络。LSTM神经元的结构和双向RNN结构如下图所示。

这就是神经网络 18:深度学习-文字识别OCR-CRNN

翻译层

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

这一块我不太熟。

loss函数

训练过程就是让下面的LOSS函数最小化:

这就是神经网络 18:深度学习-文字识别OCR-CRNN

P(X|Y)的计算思想如下:

这就是神经网络 18:深度学习-文字识别OCR-CRNN

因为LSTM的帧数是远大于最终输出字符数的,所以可能对应多种预测都对应正确的label(如下图)。上图中红框内对应一个路径上所有节点的概率乘积,上图蓝框中的符号表示所有正确路径的概率相加求和。所以我们的LOSS要做的就是让P(X|Y)最大化。

这就是神经网络 18:深度学习-文字识别OCR-CRNN
推理的时候显然不能找遍所有的路径比较P(X|Y)。所以推理的时候一般用贪心算法或者Beam Search(集束搜索)来快速找到一条或几条概率最大的路径作为候选。

CTC

CTC本身非常复杂,很难几句话说清的。

就说几个特点吧:

  • CTC是一种Loss计算方法,用CTC代替Softmax Loss,训练样本无需对齐(这一点相当重要)
  • 引入blank字符,解决有些位置没有字符的问题
  • 通过递推,快速计算梯度

重点说一下第三点,一般来说会有很多种路径符合预测序列,怎么快速计算出他们的概率乘积乘积呢。这里利用了一个动态规划的算法来计算,一句话来说就是利用了类似HARR-like里的积分图技巧,递推计算。

这就是神经网络 18:深度学习-文字识别OCR-CRNN

CTC的一个非常不合理的假设是其假设每个时间片都是相互独立的,这是一个非常不好的假设。在OCR或者语音识别中,各个时间片之间是含有一些语义信息的,所以如果能够在CTC中加入语言模型的话效果应该会有提升。如果CTC前面接的是LSTM的话,每个序列的预测还算借助了上下文的,但是在CTC这边没有体现出来。

参考资料

CRNN论文原文链接:An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition

good:Sequence Modeling
With CTC

CRNN算法详解

good:详解CTC

CTC算法详解

CRNN论文翻译——中文版

good:一文读懂CRNN+CTC文字识别

语音识别中的CTC算法的基本原理解释

语音识别:深入理解CTC Loss原理

Beam Search(集束搜索/束搜索)

腾讯数平精准推荐 | OCR技术之识别篇

这个方案是用GAN去水印,CTPN做文字检测,CRNN文字识别:一种去水印的营业执照识别方法