介绍:
是目前较为流行的图文识别模型,可识别较长的文本序列, 它利用BLSTM和CTC部件学习字符图像中的上下文关系, 从而有效提升文本识别准确率,使得模型更加鲁棒。 CRNN是一种卷积循环神经网络结构,用于解决基于图像的序列识别问题,特别是场景文字识别问题。 文章认为文字识别是对序列的预测方法,所以采用了对序列预测的RNN网络。通过CNN将图片的特征提取出来后采用RNN对序列进行预测,最后通过一个CTC的翻译层得到最终结果。说白了就是CNN+RNN+CTC的结构。
CRNN 全称为 Convolutional Recurrent Neural Network,主要用于端到端地对不定长的文本序列进行识别,不用先对单个文字进行切割,而是将文本识别转化为时序依赖的序列学习问题,就是基于图像的序列识别。
原文链接:https://blog.csdn.net/bestrivern/article/details/91050960
CRNN网络结构:
整个CRNN网络结构包含三部分,从下到上依次为:
CNN(卷积层),使用深度CNN,对输入图像提取特征,得到特征图;
RNN(循环层),使用双向RNN(BLSTM)对特征序列进行预测,对序列中的每个特征向量进行学习,并输出预测标签(真实值)分布;
CTC loss(转录层),使用 CTC 损失,把从循环层获取的一系列标签分布转换成最终的标签序列。
原文链接:https://blog.csdn.net/bestrivern/article/details/91050960
1.CNN结构(卷积层结构图)
CNN结构采用的是VGG的结构,并且文章对VGG网络做了一些微调,如下图所示
这里有一个很精彩的改动,一共有四个最大池化层,但是最后两个池化层的窗口尺寸由 2x2 改为 1x2,也就是图片的高度减半了四次(除以),而宽度则只减半了两次(除以 ),这是因为文本图像多数都是高较小而宽较长,所以其feature map也是这种高小宽长的矩形形状,如果使用1×2的池化窗口可以尽量保证不丢失在宽度方向的信息,更适合英文字母识别(比如区分i和l)。
CRNN 还引入了BatchNormalization模块,加速模型收敛,缩短训练过程。
输入图像为灰度图像(单通道);高度为32,这是固定的,图片通过 CNN 后,高度就变为1,这点很重要;宽度为160,宽度也可以为其他的值,但需要统一,所以输入CNN的数据尺寸为 (channel, height, width)=(1, 32, 160)。
CNN的输出尺寸为 (512, 1, 40)。即 CNN 最后得到512个特征图,每个特征图的高度为1,宽度为40。
注意:最后的卷积层是一个2*2,s=1,p=0的卷积,此时也是相当于将feature map放缩为原来的1/2,所以整个CNN层将图像的h放缩为原来的,所以最后CNN输出的featuremap的高度为1。
assert imgH % 16 == 0, 'imgH has to be a multiple of 16'
在程序中,图像的h必须为16的整数倍。
assert h == 1, "the height of conv must be 1"
前向传播时,CNN得到的featuremap的h必须为1。
最后CNN得到的featuremap尺度为512x1x16
原文链接:https://blog.csdn.net/bestrivern/article/details/91050960
网络结构综合了CNN+RNN
(1)其中Max pooling中的窗口大小为1*2,保证提出的特征具有横向的长度,有利于识别较长的文本;
(2)CNN+RNN的训练比较困难,所以加入了BatchNorm,有助于模型收敛;
优势
(1)可以端到端训练;
(2)不需要进行字符分割和水平缩放操作,只需要垂直方向缩放到固定长度即可,同时可以识别任意长度的序列;
(3)可以训练基于字典的模型和不基于词典的任意模型;
(4)训练速度快,并且模型很小。
CRNN.pytorch环境配置
1.安装pytorch
网站http://pytorch.org/给出了对于不同的环境安装pytorch的命令 , 本人选择如下:
因此安装命令如下:
pip install http://download.pytorch.org/whl/cu90/torch-0.3.1-cp27-cp27mu-linux_x86_64.whl
pip install torchvision
2.安装lmdb
pip install lmdb
3.下载RCNN源代码
git clone https:*//github.com/meijieru/crnn.pytorch --recursive*
4.下载预训练的模型
下载地址:https://pan.baidu.com/s/1pLbeCND
将crnn.pth放到data/路径下
5.测试
python demo.py
6.输出:
loading pretrained model from ./data/crnn.pth
a-----v--a-i-l-a-bb-l-e--- => available