点击上方“AI搞事情”关注我们
❝论文:《An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition》
Git code:
https://github.com/bgshih/crnn 官方lua实现
https://github.com/meijieru/crnn.pytorch
https://github.com/bai-shang/crnn_ctc_ocr_tf
❞
这是2015年就发表的一篇基于深度学习的OCR文章,且不用文字切割、可以处理任意长度的端到端文字识别方法。总的来说,CRNN由卷积神经网络从图像中提取文字特征序列,RNN进行文本序列学习,CTC进行网络输出与文本序列的对齐转换。
CRNN = CNN + RNN + CTC,如下图所示:
CRNN借鉴了语音识别思想,引入LSTM+CTC的建模方法解决不定长序列对齐问题。CRNN一般会结合文字检测算法(如:CTPN)一起使用,进行文字定位与识别的整个流程。
一、CNN特征序列提取
CNN通过卷积、池化操作提取输入图像的序列特征,输入图像在输入网络之前被缩放到了固定的高度(文中采用32),经过CNN计算输出RNN所输入的序列特征,由多列向量组成,由于卷积池化具有平移不变性,每一列特征可以映射到原图的矩形感受野。
论文采用VGG结构作为图像特征提取网络,为了适应LSTM的输入格式,文中将第三和第四个max-pooling的核尺度从 2×2 改为了 1×2; 同时加速网络收敛,为后面的卷积加上了BN层。二、RNN序列标记
使用双向RNN网络对CNN输出的特征序列 进行进行分类,每一个输入 都有一个对应的softmax概率输出 。利用LSTM将OCR转为序列化识别问题,既避免了单字符切分与单字符识别的传统处理方式,利用了文字的上下文依赖信息,同时,LSTM可以通过BP算法进行训练优化,可以和CNN进行联合训练,实现端到端任意长度的字符序列识别。
三、CTC转录 联结时序分类(Connectionist Temporal Classification, CTC),一种常用 在语音识别、文本识别等领域的算法,主要用于处理不定长序列对齐问题,通常接在RNN的后面,体现在RNN输出与标签的损失计算上。 假设 LSTM最终输出的概率序列为 ,一种对齐 和 的对齐方式是先对输入的每个分量 对应一个输出字符 ,然后将相邻的字符进行去重合并得到对应的输出序列 ,具体如下图所示。但是,像hello、happy这样有相邻重复的单词就会无法完整识别,同时对于输入语音或者文字图像往往存在空白区域,不可能每个部分都会有对应的字符映射。于是CTC引入了空白符 ϵ 进 行空白占位和重复切分,有效地避免了以上问题。
CTC具有以下几种特性:
「条件独立性」,CTC做了一个假设就是不同时间步的输出之间是独立的。这个假设对于很多序列问题来说并不成立,输出序列之间往往存在联系。
「单调对齐」,CTC只允许单调对齐,在语音识别中可能是有效的,但是在机器翻译中,比如目标语句中的一些比较后的词,可能与源语句中前面的一些词对应,这个CTC是没法做到的。
「多对一映射」,CTC的输入和输出是多对一的关系。这意味着输出长度不能超过输入长度,这在手写字体识别或者语音中不是什么问题,因为通常输入都会大于输出,但是对于输出长度大于输入长度的问题CTC就无法处理了。
所以,输出 的长度一定不大于 。 具体CTC原理和推导可以看参考链接【1】,还是比较难懂的。 转录时,有两种方式,一种是带字典的,一种是没有字典的。 带字典的方式输出的 会包含字典所 有元素的概率,取概率最大的作为预测结果。不带字典的方式,预测时直接选取输出概率最大的作为最终的预测字符串(ps:没太明白这两个啥意思 ̄□ ̄||)。 论文在在无词典和基于词典的场景文本识别任务中都取得了显著的性能。参考:
Sequence ModelingWith CTC
https://distill.pub/2017/ctc/
【OCR技术系列之七】端到端不定长文字识别CRNN算法详解
https://www.cnblogs.com/skyfsm/p/10335717.html
带你看懂CTC算法
https://zhuanlan.zhihu.com/p/161186907
推荐阅读
长按二维码关注我们
有趣的灵魂在等你