01 文字识别-CRNN算法

1. CRNN 算法的背景

传统的OCR在识别过程中分为两步:单字切割与分类任务。我们一般都会讲一连串文字的文本文件先利用投影法切割出单个字体,再送入CNN里进行文字分类。但是此法已经有点过时了,现在更流行的是基于深度学习的端到端的文字识别,即我们不需要显式加入文字切割这个环节,而是将文字识别转化为序列学习问题,虽然输入的图像尺度不同,文本长度不同,但是经过CNN和RNN后,在输出阶段经过一定的翻译后,就可以对整个文本图像进行识别,也就是说,文字的切割也被融入到深度学习中去了。

现今基于深度学习的端到端OCR技术有两大主流技术:CRNN OCR和attention OCR。其实这两大方法主要区别在于最后的输出层(翻译层),即怎么将网络学习到的序列特征信息转化为最终的识别结果。这两大主流技术在其特征学习阶段都采用了CNN+RNN的网络结构,CRNN OCR在对齐时采取的方式是CTC算法,而attention OCR采取的方式则是attention机制。本文将介绍应用更为广泛的CRNN算法。

2. CRNN网络结构

在这里插入图片描述
网络主要由三部分组成,从下到上依次为:

卷积层,使用CNN,作用是从输入图像中提取特征序列;
循环层,使用RNN,作用是预测从卷积层获取的特征序列的标签(真实值)分布;
转录层,使用CTC,作用是把从循环层获取的标签分布通过去重整合等操作转换成最终的识别结果;

在这里插入图片描述

2.1. 卷积层

卷积层使用了VGG16进行特征提取,其中输入图像为单通道灰度图像,且图像高度统一为32个像素 。区别于传统的VGG16,CRNN的卷积层在第3个和第4个maxpooling层采取了1×2的矩形池化窗口(h×w),这个改动是因为文本图像多数都是高较小而宽较长,所以其feature map也是这种高小宽长的矩形形状。CNN输出的图像尺寸大小为512 × 1 × w/4(c×h×w)。输出的向量格式为[b, c, h, w]。
例如,输入CNN的图像大小为[32, 100, 3],CNN处理完的结果为[1,25, 512]。

2.2 循环层

RNN部分使用了双向LSTM,隐藏层单元数为256,CRNN采用了两层BiLSTM来组成这个RNN层。
RNN层的输入为[seq_len, batch, input_size]
seq_len: 序列长度---------w
batch: 即batch_size-------batchsize
input_size: 输入特征数目 ---------c
将CNN的输出结果[b, c, h, w]经过转化变为[w, b, c]作为RNN的输入,即[w, b, c] = [seq_len, batch, input_size]

LSTM有256个隐藏节点,经过LSTM后变为长度为T × nclass的向量,再经过softmax处理,列向量每个元素代表对应的字符预测概率,最后再将这个T的预测结果去冗余合并成一个完整识别结果即可。
在这里插入图片描述

2.3 转录层

RNN进行时序分类时,不可避免地会出现很多冗余信息,比如一个字母被连续识别两次,这就需要一套去冗余机制。CTC有一个blank机制来解决这个问题。
在这里插入图片描述如上图所示,我们要识别这个手写体图像,标签为“ab”,经过CNN+RNN学习后输出序列向量长度为5,即t0~t4,此时我们要将该序列翻译为最后的识别结果。我们在翻译时遇到的第一个难题就是,5个序列怎么转化为对应的两个字母?重复的序列怎么解决?刚好位于字与字之间的空白的序列怎么映射?这些都是CTC需要解决的问题。

我们从肉眼可以看到,t0,t1,t2时刻都应映射为“a”,t3,t4时刻都应映射为“b”。如果我们将连续重复的字符合并成一个输出的话,即“aaabb”将被合并成“ab”输出。但是这样子的合并机制是有问题的,比如我们的标签图像时“aab”时,我们的序列输出将可能会是“aaaaaaabb”,这样子我们就没办法确定该文本应被识别为“aab”还是“ab”。CTC为了解决这种二义性,提出了插入blank机制,即连续相同的字符若中间含有blank则不予以合并,比如我们以“-”符号代表blank,则若标签为“aaa-aaaabb”则将被映射为“aab”,而“aaaaaaabb”将被映射为“ab”。引入blank机制,我们就可以很好地处理了重复字符的问题了。

3. CRNN的创新点

CRNN借鉴了语音识别中的LSTM+CTC的建模方法,不同点是将输入进LSTM的特征,从语音领域的声学特征(MFCC等),替换为CNN网络提取的图像特征。很好的将CNN做图像工程的潜力与LSTM做序列化识别的潜力进行结合。

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴回答您的问题。CRNN文字识别系统是一种将卷积神经网络(CNN)和循环神经网络(RNN)结合的深度学习算法,主要用于识别文本或图像中的文字。下面是CRNN文字识别系统的设计和实现过程: 1. 数据集准备 首先需要准备大量的图像数据集,包含各种不同的文字和字体。数据集需要进行预处理,如裁剪、旋转、模糊等,以增加模型的鲁棒性和准确率。 2. CNN特征提取 对于每一张图片,需要先将其经过卷积神经网络(CNN)进行特征提取。CNN可以有效地将图像中的特征提取出来,如线条、圆弧等,其中,卷积层和池化层交替进行,最后得到一个固定大小的特征图。 3. RNN序列建模 将CNN提取出来的特征图输入到循环神经网络(RNN)中进行序列建模。RNN主要用于文本或语音等序列数据的处理,可以有效地捕捉到序列之间的依赖性。 4. CTC损失计算 利用连接时序分类(CTC)算法求得模型的损失函数。CTC算法是一种基于RNN的序列分类算法,它可以将不定长的序列映射到一个固定输出大小的类别序列上,可以允许序列输入和序列输出,非常适合文字识别任务。 5. 模型训练和评估 最后需要对模型进行训练,并使用测试数据进行评估。在训练过程中,使用随机梯度下降等优化算法对模型的参数进行优化,直到达到预设的训练指标。 希望以上内容能够对您有所帮助。如有任何问题,请随时回复。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值