这就是神经网络 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处理后的数据翻译为后验概率最大的序列
  • 预测序列做后处理,合并重复的字符,得到最终输出

在这里插入图片描述

卷积层网络结构

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

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

在这里插入图片描述

循环层

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

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

在这里插入图片描述

翻译层

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

这一块我不太熟。

loss函数

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述
推理的时候显然不能找遍所有的路径比较P(X|Y)。所以推理的时候一般用贪心算法或者Beam Search(集束搜索)来快速找到一条或几条概率最大的路径作为候选。

CTC

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

就说几个特点吧:

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

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

在这里插入图片描述

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文字识别:一种去水印的营业执照识别方法

  • 8
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
深度学习之卷积神经网络CNN做手写体识别的VS代码。支持linux版本和VS2012版本。 tiny-cnn: A C++11 implementation of convolutional neural networks ======== tiny-cnn is a C++11 implementation of convolutional neural networks. design principle ----- * fast, without GPU 98.8% accuracy on MNIST in 13 minutes training (@Core i7-3520M) * header only, policy-based design supported networks ----- ### layer-types * fully-connected layer * convolutional layer * average pooling layer ### activation functions * tanh * sigmoid * rectified linear * identity ### loss functions * cross-entropy * mean-squared-error ### optimization algorithm * stochastic gradient descent (with/without L2 normalization) * stochastic gradient levenberg marquardt dependencies ----- * boost C++ library * Intel TBB sample code ------ ```cpp #include "tiny_cnn.h" using namespace tiny_cnn; // specify loss-function and optimization-algorithm typedef network CNN; // tanh, 32x32 input, 5x5 window, 1-6 feature-maps convolution convolutional_layer C1(32, 32, 5, 1, 6); // tanh, 28x28 input, 6 feature-maps, 2x2 subsampling average_pooling_layer S2(28, 28, 6, 2); // fully-connected layers fully_connected_layer F3(14*14*6, 120); fully_connected_layer F4(120, 10); // connect all CNN mynet; mynet.add(&C1); mynet.add(&S2); mynet.add(&F3); mynet.add(&F4); assert(mynet.in_dim() == 32*32); assert(mynet.out_dim() == 10); ``` more sample, read main.cpp build sample program ------ ### gcc(4.6~) without tbb ./waf configure --BOOST_ROOT=your-boost-root ./waf build with tbb ./waf configure --TBB --TBB_ROOT=your-tbb-root --BOOST_ROOT=your-boost-root ./waf build with tbb and SSE/AVX ./waf configure --AVX --TBB --TBB_ROOT=your-tbb-root --BOOST_ROOT=your-boost-root ./waf build ./waf configure --SSE --TBB --TBB_ROOT=your-tbb-root --BOOST_ROOT=your-boost-root ./waf build or edit inlude/config.h to customize default behavior. ### vc(2012~) open vc/tiny_cnn.sln and build in release mode.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值