出自文章,Scene Text Recognition with Sliding Convolutional Character Models
方法优势:
(1)相对于基于先分割再识别的方法,该方法避免了复杂的字符分割过程。
(2)避免了rnn训练过程中的梯度消失和梯度爆炸的问题,使得训练过程比较容易
(3)相对于基于单词识别的方法,该基于字符识别的方法可以识别基于单词的方法不能识别的单词
(4)识别过程可以高度并行化
整体识别流程图:
首先对输入图片进行overlap型的滑动窗口扫描(英文:步长step为4,窗口大小为32*32,中文:步长step为8,窗口大小为32*40)。并且将整个的输入图片按照窗口大小切割出来。然后将所有切割出的图片按照batch方向输入神经网络。神经网络会输出分类后的结果。然后Transcription Layer将这些分类结果按照顺序合并起来,然后送入CTC中。CTC会预测出最终的识别结果。
网络结构:
其中,k,s,p分别代表卷积核大小,滑动步长,padding大小
和crnn的对比:
crnn是白翔老师的那篇文章。和这篇文章有异曲同工之处。
(1)crnn整体结构为CNN+RNN+CTC的结构,这篇Sliding Convolution结构为CNN+CTC结构。(2)Sliding Convolution文章对于输入的图片做了切割,然后切割好的图片可以跑batch,然后得出每个分割图片的识别结果。而crnn是一行文字图片直接输入,从处理时间上看,没有Sliding Convolution更加效率。
(2)Sliding Convolution文章的结构使用了全连接层,输入图片大小被固定为32*32。而crnn只保证高度为32,输入宽度不受限制。
自己的一些想法:
(1)Sliding Convolution文章的网络结构,最后的2个全连接层可以换为1*1卷积层,或者RNN。
(2)通过Sliding Convolution文章中跑batch的思想,对于crnn,也可以将输入图片平均切分成几份。然后走batch。注意这里只走cnn的batch。cnn跑完后,做一个batch方向的concat。然后输入rnn+ctc。同样可以实现batch思想的加速。同时对训练过程不会有影响,还是使用原始的训练就可以,而测试程序,只需要再cnn之后加个concat操作既可。
这里我自己修改的程序是使用的reshape操作实现的。由于我这里是对输入图片平均切分的。所以切的份数太多,识别效果会有影响。切的份数越多加速越明显,但是加速比不是很明显。只有微量的加速。
CTC基础建议看这篇:
自己的实现:
https://github.com/watersink/sliding_convolution