原始内容来源于:https://zhuanlan.zhihu.com/p/43534801
根据原始内容整理!
文字识别是图像领域的常见问题,针对自然场景图像中的文字识别,包括两个步骤:首先进行文字检测,定位图像中文字位置;然后进行文字识别,将图像中的文字区域转换为字符信息。在车牌识别问题中,已定位好车牌位置,因此不需要进行文字检测,只需文字识别。(文字检测内容可参考https://zhuanlan.zhihu.com/p/34757009)。
常用的基于RNN文字识别算法主要有两个框架:CNN+RNN+CTC(CRNN+CTC)和CNN+Seq2Seq+Attention,如下图所示。本文主要介绍 CRNN+CTC(paper:https://arxiv.org/abs/1507.05717,tensorflow实现:https://github.com/bai-shang/crnn_ctc_ocr.Tensorflow)。
整个CRNN+CTC网络可以分为三个部分,包括Convlutional Layers,Recurrent Layers,Transcription Layers,如下图所示。
Convlutional Layers:卷积层是一个普通的CNN网络,用于提取输入图像的Convolutional feature maps,即将大小为32 * 100 * 3的图像转换为1 * 25 * 512大小的卷积特征矩阵。
Recurrent Layers:循环网络层是一个深层双向LSTM网络(RNN部分可参考https://zhuanlan.zhihu.com/p/51383402),在卷积特征的基础上继续提取文字序列特征。所谓深层RNN网络,是指超过两层的RNN网络,而对于深层双向RNN网络,主要有2种不同的实现,tf.nn.bidirectional_dynamic_rnn和tf.contrib.rnn.stack_bidirectional_dynamic_rnn,单层双向RNN网络、单深层双向RNN网络的结构如下图所示。
在CRNN+CTC中使用了第二种stack形深层双向结构。由于CNN输出的Feature map是1 * 25 * 512大小,所以对于RNN最大时间长度 T=25(即有25个时间输入,每个输入Xt列向量有D=512)。
Transcription Layers:将RNN输出做softmax后,为字符输出。
在CRNN+CTC中,为了将特征输入到Recurrent Layers图像size的变化:
首先会将图像缩放到32 * W * 3大小
然后经过CNN后变为 1 * (W/4) * 512
接着针对LSTM,设置 T=(W/4),D=512即可将特征输入LSTM
所以在处理输入图像的时候,建议在保持长宽比的情况下将高缩放到 32,这样能够尽量不破坏图像中的文本细节(当然也可以将输入图像缩放到固定宽度,但是这样由于破坏文本的形状,肯定会造成性能下降)。
对于Recurrent Layers,如果使用常见的Softmax Loss,则每一列输出都需要对应一个字符元素。那么训练时候每张样本图片都需要标记出每个字符在图片中的位置,再通过CNN感受野对齐到Feature map的每一列获取该列输出对应的Label才能进行训练,如下图所示。
在实际情况中,标记这种对齐样本非常困难(除了标记字符,还要标记每个字符的位置),工作量非常大。另外,由于每张样本的字符数量不同,字体样式不同,字体大小不同,导致每列输出并不一定能与每个字符一一对应。
当然这种问题同样存在于语音识别领域。例如有人说话快,有人说话慢,那么如何进行语音帧对齐,是一直以来困扰语音识别的巨大难题。
CTC提出一种对不需要对齐的Loss计算方法(理解:softmax loss需要输入图像和字符对齐,如果换了一种对齐方式则不能准确识别,CTC loss不管对齐样式是什么样的,宽的或窄的,相同字符只需输出序列相同即可,不要求每个字符一一对齐),用于训练网络,被广泛应用于文本行识别和语音识别中。
连接主义时间分类(CTC)论文见Graves A , Santiago Fernández, Gomez F . Connectionist temporal classification: Labelling unsegmented sequence data with recurrent neural networks[C]// International Conference on Machine Learning. ACM, 2006.
整个CRNN的流程如下图:先通过CNN提取文本图片的Feature map,然后将每一个channel作为D=512,时间步为25的时间序列输入到LSTM中,最后输出后验概率矩阵。
(1)CNN Feature map
(2)LSTM
(3)空白blank符号
(4)关于B变换
这里容易发生梯度爆炸,一开始学习的权重不好时,t时刻经过值lk的概率可能很小,当接近于0时,容易发生梯度爆炸
CTC是一种Loss计算方法,用CTC代替Softmax Loss,训练样本无需对齐。CTC特点:引入blank字符,解决有些位置没有字符的问题;通过递推,快速计算梯度。