OCR性能优化:从认识BiLSTM网络结构开始

摘要: 想要对OCR进行性能优化,首先要了解清楚待优化的OCR网络的结构,本文从动机的角度来推演下基于Seq2Seq结构的OCR网络是如何一步步搭建起来的。数据库

本文分享自华为云社区《OCR性能优化系列(一):BiLSTM网络结构概览》,原文做者:HW007性能优化

OCR是指对图片中的印刷体文字进行识别,最近在作OCR模型的性能优化,用 Cuda C 将基于TensorFlow 编写的OCR网络重写了一遍,最终作到了5倍的性能提高。经过此次优化工做对OCR网络的通用网络结构和相关的优化方法有较深的认识,计划在此经过系列博文记录下来,也做为对本身最近工做的一个总结和学习笔记。网络

想要对OCR进行性能优化,首先要了解清楚待优化的OCR网络的结构,在本文中我将尝试着从动机的角度来推演下基于Seq2Seq结构的OCR网络是如何一步步搭建起来的。机器学习

读懂此文的前提只须要了解在矩阵乘法中矩阵的维度变化规律,即n*p的矩阵乘以 p*m 的矩阵等于 n*m 的矩阵。若是知道CNNRNN网络的结构,对机器学习模型的构造套路有点了解的话更好。性能

首先给出从本文要剖析的OCR BILSTM 网络整体结构以下图:学习

接下来我将从这张图的右上角(模型的输出端)向左下角(模型的输入端)逐步解释每个结构的动机及其做用。优化

1. 构造最简单的OCR网络

首先考虑最简单状况下的OCR识别场景,假设输入是只含有一个文字图片,图片的高和宽均为32个像素,即32*32的矩阵,为了方便将其拉长即可获得一个 1*1024 的矩阵。在输出方面,因为文字的特殊性,咱们只能将全部的文字进行标号,最后输出所识别的文字的编号便好,由此获得咱们的输出是一个 1*1 的矩阵,矩阵元素的内容就是所识别的文字的编号。url

怎么获得这个1*1的矩阵呢?根据几率统计的套路,咱们假设全世界存在10000个文字,将其表为1~1000号,那么这10000个元素都有几率成为咱们的输出,所以咱们若是先算出这10000个文字做为该输入图片的识别结果的几率的话,再挑几率最大的那个输出即可以了。因而问题被转变成如何从一个 1*1024的矩阵(X)中获得一个 1*10000 的矩阵(Y)。在这里即可以上机器学习模型结构中最多见的线性假设套路了,假设YX是之间是线性相关的,这样即可获得最简单且经典的线性模型:Y = AX + B 其中称X(维度:1*1024)为输入,Y(维度:1*10000)为输出,AB均为该模型的参数,由矩阵乘法可知A的维度应该是 1024*1000B的维度应该是 1*10000。至此,只有X是已知的,咱们要计算Y的话还须要知道AB的具体值。在机器学习的套路中,做为参数的AB的值在一开始是随机设定的,而后经过喂大量的X及其标准答案Y来让机器把这两个参数AB慢慢地调整到最优值,此过程称为模型的训练,喂进去的数据称为训练数据。训练完后,你即可以拿最优的A乘以你的新输入X在加上最优的B获得相应的Y了,使用argMax操做来挑选Y1*10000个数中最大的那个数的编号,就是识别出来的文字的编号了。spa

如今,再回头去看图1中右上角的那部分,相信你能看懂两个黄色的 384*10000 1*10000的矩阵的含义了。图中例子和上段文字描述的例子的区别主要在于图中的输入是1 1*1024的图片,上段文字中的是 27 1*384的图片罢了。至此,你已经了解如何构造一个简单地OCR网络了。接下来咱们就开始对这个简单地网络进行优化。.net

2. 优化策略一:减小计算量

在上面的文字描述的例子中,咱们每识别一个文字就要作一次 1*10241024*10000的矩阵乘法计算,这里面计算量太大了,是否有一些计算是冗余的呢?熟悉PCA的人应该立刻能想到,其实将 32*32 的文字图片拉长为 1*1024的矩阵,这个文字的特征空间是1024维,即使每维的取值只有01两种,这个特征空间可表示的值都有2^1024种,远远大于咱们所假设的文字空间中全部文字个数10000个。为此咱们能够用PCA或各类降维操做把这个输入的特征向量降维到小于10000维,好比像图中的128维。

3. 优化策略二:考虑文字间的相关性

(提醒:在上图中为了体现出batch Size的维度,是按27张文字图片来画的,下文中的讨论均只针对1张文字图片,所以下文中维度为 1的地方均对应着图中的27)

也许你已经注意到了,图中与黄色的384*10000矩阵相乘的位置图像特征的维度没有直接用一个1*384,而是 1*128+128+128)。其实这里隐含着一个优化,这个优化是基于文字间的关联假设的,简单地例子就是若是前面一个字是,那其后面跟着的极可能是字,这种文字顺序中的统计规律应该是能够用来提高文字图片的识别准确率的。那怎么来实现这个关联呢?

在图中咱们能够看到左侧有一个10000*128的参数矩阵,很容易知道这个参数就像一个数据库,其保存了全部10000个文字图片通过加工后的特征(所谓加工即是上面提到的降维,原始特征应该是 10000*1024的),照图中的结构,我须要输入当前识别的这个字的前一个字的识别结果 (识别工做是一个字接一个字串行地识别出来的)。而后选择出上个字对应的特征矩阵 1*128,再通过一些加工转换后当作1*384的输入中的前1/3部份内容。

同理,1*384里靠后的两个1*128又表明什么含义呢?虽然在句子中,前面一个字对后面一个字的影响很大,即便当前要预测的字在图片中很模糊,我也能够根据前面的字将其猜出来。那是否能够根据其前k个字或者后k个字猜出来呢?显然答案是确定的。所以靠后的两个1*128分别表明的是句子图片里文字从前到后(Forward从后到前(Backward的图片特征对当前要识别的字的影响,所以图中在前面加了个双向LSTM网络来生成这两个特征。

至此,改良版的OCR网络轮廓基本出来了,还有一些细节上的问题须要解决。不知你是否注意到,按上面所述,1*384中包含了31*128的特征,分别表明着前一个字对当前字的影响、图片中的整个句子中各个文字从前到后(Forward)的排序对当前文字的影响、图片中的整个句子中各个文字从后到前(Backward)的排序对当前文字的影响。

可是他们的特征长度都是128!!!一个字是128,一个句子也是128?对于不一样的文字图片中,句子的长度还可能不同,怎么可能都用一个字的特征长度就表示了呢?

如何表示一个可变长的句子的特征呢?乍一看的确是个很棘手的问题,好在它有一个很粗暴简单的解决办法,就是加权求和,又是几率统计里面的套路,管你有几种状况,全部的状况的几率求和后都得等于1。看到在这里不知道是否被震撼到,变化不变”这样看起来水火不容的两个东西就是这么神奇地共存了,这就是数学的魅力,让人不由拍手赞绝!

下图以一个实际的例子说明这种神奇的方式的运做方式。当咱们要对文字片断中的字进行识别时,尽管改字已近被遮挡了部分,但根据平常生活中的一些经验知识积累,要对该位置进行补全填空时,咱们联系上下文,把注意力放在上文中的是中国人和下文中的吃饭上。这个加权系数的机制即是用来实现这种注意力机制的。至于平常生活中的经验这种东西就是由注意力机制网络经过大量的训练数据来学习获得的。也就是图1中的那32alpha的由来。注意力网络在业界通常由GRU网络担任,因为篇幅缘由,在此不展开了,下回有机会再细说。看官们只需知道在图一的右边还应该有个注意力网络来输出32alpha的值便好。

 

点击关注,第一时间了解华为云新鲜技术~

相关文章
相关标签/搜索