介绍:

是目前较为流行的图文识别模型,可识别较长的文本序列, 它利用BLSTM和CTC部件学习字符图像中的上下文关系, 从而有效提升文本识别准确率,使得模型更加鲁棒。 CRNN是一种卷积循环神经网络结构,用于解决基于图像的序列识别问题,特别是场景文字识别问题。 文章认为文字识别是对序列的预测方法,所以采用了对序列预测的RNN网络。通过CNN将图片的特征提取出来后采用RNN对序列进行预测,最后通过一个CTC的翻译层得到最终结果。说白了就是CNN+RNN+CTC的结构。

CRNN 全称为 Convolutional Recurrent Neural Network,主要用于端到端地对不定长的文本序列进行识别,不用先对单个文字进行切割,而是将文本识别转化为时序依赖的序列学习问题,就是基于图像的序列识别。

CRNN网络结构:

crnn模型训练trip crnn 原理_人工智能

整个CRNN网络结构包含三部分,从下到上依次为:

CNN(卷积层),使用深度CNN,对输入图像提取特征,得到特征图;
RNN(循环层),使用双向RNN(BLSTM)对特征序列进行预测,对序列中的每个特征向量进行学习,并输出预测标签(真实值)分布;
CTC loss(转录层),使用 CTC 损失,把从循环层获取的一系列标签分布转换成最终的标签序列。

1.CNN结构(卷积层结构图)

CNN结构采用的是VGG的结构,并且文章对VGG网络做了一些微调,如下图所示

crnn模型训练trip crnn 原理_卷积_02

这里有一个很精彩的改动,一共有四个最大池化层,但是最后两个池化层的窗口尺寸由 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

网络结构综合了CNN+RNN

(1)其中Max pooling中的窗口大小为1*2,保证提出的特征具有横向的长度,有利于识别较长的文本;

(2)CNN+RNN的训练比较困难,所以加入了BatchNorm,有助于模型收敛;

优势

(1)可以端到端训练;

(2)不需要进行字符分割和水平缩放操作,只需要垂直方向缩放到固定长度即可,同时可以识别任意长度的序列;

(3)可以训练基于字典的模型和不基于词典的任意模型;

(4)训练速度快,并且模型很小。

CRNN.pytorch环境配置

1.安装pytorch

网站http://pytorch.org/给出了对于不同的环境安装pytorch的命令 , 本人选择如下:

crnn模型训练trip crnn 原理_crnn模型训练trip_03

因此安装命令如下:

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

crnn模型训练trip crnn 原理_python_04

6.输出:

loading pretrained model from ./data/crnn.pth
a-----v--a-i-l-a-bb-l-e--- => available