重点:原论文必定要得看!!!英语好的直接看原论文,不懂的地方查资料。英语很差的(好比笔者),先看中文资料,而后再看原论文。git
CRNN全称是:An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition
说本身是端到端的的网络,其实严格意义根本不是的,而是一种识别网络而已。github
严格意义端到端的网络:Fast Oriented Text Spotting with a Unified Network
算法
请看下图为CRNN
网络的输入,得检测到文字以后才能去识别文字。网络
不严格的端到端是啥意思呢?post
下图1-2所示为传统的文字识别,还得把每一个文字分割再去识别(这方面的东西不进行说明,很简单的传统方法)学习
而CRNN直接输入上图获得结果。测试
CRNN网络结构入下图1-3所示:编码
正常的图像提取,提取到的特征以序列方式输出,这里不懂的读者能够去看RNN训练手写数字识别.net
特征输入到BLSTM,输出每一个序列表明的值(这个值是一个序列,表明可能出现的值),对输出进行softmax操做,等于每一个可能出现值的几率。
至关于一个LOSS,一个计算几率到实际输出的几率,具体后面章节介绍。
假设上图2-1为提取到的特征(特征是一块一块的,这确定不是特征图,为了看着舒服)
图像通过VGG的特征提取以后就是普通的feature map,而后进行上述的划分,造成特征序列!
若是你的文字很斜或者是纵向的,那就得把特征竖向划分序列了!
基本原理不懂读者能够看看这个教程
懂了原理这部分仍是比较简单的(理解简单,实现太难了),笔者这里只介绍几个使用过程难理解的点
从上图能够获得的是X1---X6,总共6个序列
从上图3-2能够看出,是由五层网络构成
这里引用知乎大神的一个图,上图中序列为4,层数为3层(固然不加输入和输出也能够说是1层,这里按正常CNN去说就是3层了)
从图中能够看出每一个序列包含一个CNN,图中的隐藏层神经元数量为24个,因为RNN使用权值共享,那么不一样的神经元个数就为6个。
以上图知乎大神的图为例子,每一个输入序列长度8
假设这个网络是一个RNN识别手写数字识别的图,那么图像的宽为4,高为8
注意:输入序列的数量和输入序列的长度和神经元个数无关!!!这里想象RNN便可理解
笔者只是推导了单向的LSTM网络,而没有推导BLSTM网络。
其实不管RNN如何变种,像如今最好的GRU等,无非都是在单元(unite)里面的trick而已。
具体公式推导,就是链式求导法则!建议先推RNN、而后LSTM、最后不用推导BLSTM都明白了
关于CTC的描述网上不少,也讲解的比较清楚了,这里主要是说一下我笔者看原理时候的几个难点(弄了很久才想明白)
这是鸢尾花分类网络,其中输入一张图像,输出是通过softmax的种类几率。
那么这个网络标签是什么???
标签的制做都是须要通过Incode
(分类的种类通过数字化编码),测试过程须要Encode
(把输出的数字解码成分类的种类)
这很简单,读者应该都理解,代码为了计算机能看懂,编码就是神经网络能看懂。
假设有26个英文字母要识别,那么种类数=27(还有一个空白blank字符)
假设CNN输出以50个序列为基准(读者这里看不懂就去看RNN识别手写数字识别),序列太大训练不许,识别结果会漏字母。序列过小训练不许,识别会多字母。
假设CTC是一个黑盒子,它能把输出那么多序列变化为一个序列,这样就能和CNN分类同样计算Loss了。固然不会那么简单,CTC仍是比较复杂的,后面具体看这个黑盒子如何工做的。。。。
注释:这里笔者就不进行详细的描述了,感受别人比我写的更好:很是详细的CTC力理论
在这一章,主要针对笔者遇到的重难点进行介绍:
原本还去看了马尔科夫的先后向传播的理论,没怎么看懂(数学基础太差)
针对本文的CTC先后向传播仍是比较简单理解的
其实这里能够理解为动态规划的方式进行的,由于其使用递归的方式,以一个点为中心,向前和向后进行递推,以动态规划的方式理解就很简单了。。。。不懂的读者能够刷leetcode,作几题就有感受了
最简单的搜索追溯算法:
每一个都列举最后计算,能够看出来是指数级搜索,效率确定不行的
贪婪算法+动态规划---CTC Prefix Search Decoding:
第一步是进行合并操做:
第二步输出最大几率:
扩充CTC Prefix Search Decoding算法---CTC Beam Search Decoding
仔细看我上面的标题,CTC Prefix Search Decoding特地加了一个动态规划,动态规划是属于最优解的算法。
由于CTC算法的前提是序列相互独立,因此当前的序列最大,那么总体的序列最大。
注意:得合并以后的序列最大,而不是单个序列的最大!!!,若是是单个序列最大,那这就是单独的贪心算法了。
这都得从新看网络了,网络用到了BLSTM,序列这个东西已经使用过了,到达CTC已是使用序列以后的输出了。
不得不佩服设计网络的人RNN+CTC,语音是使用最先的。
其实回头想一下,若是CTC是有序列的,那么前向和后项几率根本不能使用马尔科夫模型(前提相互独立)了,也不能使用CTC Prefix Search Decoding,只能使用最简单的追溯算法,那效率那么低,怎么普遍使用呢?