专栏首页晓说AI06. OCR学习路径之CRNN文本识别
原创

06. OCR学习路径之CRNN文本识别

前言

在了解了如何检测到文本之后,我们需要识别出检测文本内的文字信息。在文本识别完成之后,整个OCR光学字符识别的过程才算基本完成。那么,本次课程主要讲述识别文本的算法。

一.算法简介

检测出的文本片段一般是一行文字,具有sequence-like属性,因此此类文本识别归属为image-based sequence recognition的问题。这就与常规的物体识别不同,它有一系列的标签,识别出的结果是序列化的字符,而不是单个标签,类序列对象的另一个特点是其长度不统一,标签也是长度变化的。因此,解决此类问题,就不能采用固定输入和输出的传统CNN模型了。

对于此类识别问题,目前比较流行的算法就是CRNN+CTC的方式,我们将展开来说。

一篇比较经典的文章:An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition。

链接:https://arxiv.org/pdf/1507.05717.pdf

优点:不需要预处理(二值化、切割等)、可以直接从sequence的target上学习(label为语句)、不受序列长度约束。

CRNN+CTC网络架构

架构包括三部分:

1) 卷积层,从输入图像中提取特征序列;

2) LSTM层,预测每一帧的标签分布,从卷积层获取的特征序列的标签(真实值)分布

3) 转译层,将每一帧的预测变为最终的标签序列。

CRNN借助了语音识别中解决不定长语音序列的思路。对于序列问题的解决,通常使用循环网络RNN,为了消除RNN网络常见的梯度爆炸问题,引出LSTM,这些算法在语音识别领域都已相当成熟,有很好的表现,现在就是设计特征,让图像特征可以有近似于语音的特征表达。

语音识别中的时间对应着图像的横向尺度W。

如何获取上述特征呢?

现在输入有个图像,为了将特征输入到Recurrent Layers,做如下处理:

l 首先会将图像缩放到 32×W×1 大小

l 然后经过CNN后变为 1×(W/4)× 512

l 接着针对LSTM,设置 T=(W/4) , D=512 ,即可将特征输入LSTM。

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

网络配置如下图,

CRNN网络配置

其中,‘k’, ‘s’ 和‘p’ 代表 kernel size, stride 和padding size

以上都比较好理解,但是最后一步,经过LSTM后变为长度为T × nclass的向量,再经过softmax处理,列向量每个元素代表对应的字符预测概率,最后再将这个T的预测结果去冗余合并成一个完整识别结果即可。如何去冗余呢?这可是个技术活了。

当然,语音识别也早就做好了,文字识别在这里所做的一切都是为了吧图像特征与语音特征近似化,其他的工作都交给语音识别算法了。

二.CTC

详细的CTC推导过程网上已经有很多,说一下我的理解就是。由于输出的T=W/4是一个不定长的结果,而我们需要做的就是将该序列结果翻译成最终的识别结果。但是LSTM进行时序分类时的输出有一个特点,就是同一个字符被连续识别两次,因此需要一个去冗余机制,但是简单粗暴地去处冗余也不行,比如“--hh-e-l-ll-oo--”,直接去冗余就变成helo了,那就识别错误了。

因此CTC为了解决这种二义性,提出了插入blank机制,比如下图的以符号“-”代表blank。若标签为“aaa-aaaabb”则将被映射为“aab”,而“aaaaaaabb”将被映射为“ab”。引入blank机制,就可以很好地处理了重复字符的问题了。

-s-t-aatte转译成state

但是通常一个正确的输出序列可以有多条路径达成,比如直接贴一张其他博主的图吧,下面酱紫的:

可以看出,这4条路线都能达到正确的结果输出,那么如何找出最优的路径呢?就引出下一个公式,

其中

Β 的作用就是maps π onto l by firstly removing the repeated labels。

y^t_πt是时刻t在能输出正确值πt的情况下,所输出某一个字符的概率。

每一个字符的输出都对应着一个softmax计算出的概率ytπt ,再把每一个字符输出对应的概率相乘,得出这条路径的概率为p(π|y),那所有路径的概率总和就是p(l|y),也就是以上公式想表达的意思了。

三.Loss设计

由以上分析,知道了最佳路径的概率值,那么现在就可以设计一个训练的Loss函数来寻找一个最大概率的输出序列,

Ii是训练图片,I_i是真实标签。

通过对概率的计算,就可以对之前的神经网络进行反向传播更新。类似普通的分类,CTC的损失函数O定义为负的最大似然,为了计算方便,对似然取对数。我们的训练目标就是使得损失函数O优化得最小即可。

四.训练阶段

训练的时候,为了加速训练,所有的图片都scale到100*32

测试的图片固定高度为32的比例,宽度按对应比例缩放。

总结

该算法在识别乐谱上也有良好的表现,这显然证实了它的泛化性。

可以实现端到端的训练。

1) 不依赖字符切分;

2) 不限定语料范围;

3) 模型参数相对较少;

4) 可充分学习到上下文的关系,等等。

缺点:

1) CTC每次都要计算概率,采用前缀搜索算法解码或者约束解码算法;

2) 受CTC算法对速度的要求,输出长度因此受到限制,不能太长。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 05. OCR学习路径之文本检测(下)EAST算法简介

    本次分享主要是讲EAST这篇文章,按照之前的计划是分享两种文本检测思路,即one-stage和two-stage的。已经分享的有《03.OCR学习路径之文本检测...

    Aalto
  • 01. OCR 文字识别学习路径

    由于最近在接触一些OCR的工作,所以本期《晓说AI》和大家分享一下我的一些总结,先从基本的概念讲起。如有错误,还请指正,谢你3千遍。如有疑问,欢迎留言,我会第一...

    Aalto
  • 07. OCR学习路径之基于Attention机制的文本识别

    对于单文本行的图片进行识别,另一种常用的网络模型为编码-解码模型(Encoder-Decoder),并加入了注意力模型(Attention model)来帮助特...

    Aalto
  • 开发一款即时通讯App,从这几步开始

    腾讯云通信团队
  • 【IOT迷你赛】智慧照明

    很荣幸参加这次的TencentTiny内测,切身体会了IOT的魅力认识到其市场价值,在月初收到腾讯工作人员寄来的开发板感觉特别的荣幸--能与腾讯近距...

    格创苗兴航
  • Java并发编程之美-双11限时五折优惠

    天猫链接:https://detail.tmall.com/item.htm?spm=a220m.1000858.1000725.61.59a73c85cVE3...

    加多
  • Maven聚合项目的创建

    点击next修改名称完成构建 这里我们把a-first当做启动项目,需要在maven中加入:

    Dream城堡
  • Scrapy实战:爬取一个百度权重为7的化妆品站点

    禹都一只猫olei
  • DPDK之KNI原理

    DPDK是一个优秀的收发包kit,但它本身并不提供用户态协议栈,因此由将数据报文注入内核协议栈的需求,也就是KNI(Kernel NIC Interface)。...

    glinuxer
  • web站点应用之路_wdcp面板部署网站(三)

    前面我们讲完了部署和面板的信息介绍,这个环节我们讲WDCP面板创建站点的过程,初期都是单机架构,后期会讲到升级以后的变化。首先当然是创建站点,在站...

    相柳

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动