摘要: 想要对 OCR 进行性能优化,首先要理解分明待优化的 OCR 网络的构造,本文从动机的角度来推演下基于 Seq2Seq 构造的 OCR 网络是如何一步步搭建起来的。
本文分享自华为云社区《OCR 性能优化系列(一):BiLSTM 网络结构概览》,原文作者:HW007。
OCR 是指对图片中的印刷体文字进行辨认,最近在做 OCR 模型的性能优化,用 Cuda C 将基于 TensorFlow 编写的 OCR 网络重写了一遍,最终做到了 5 倍的性能晋升。通过这次优化工作对 OCR 网络的通用网络结构和相干的优化办法有较深的意识,打算在此通过系列博文记录下来,也作为对本人最近工作的一个总结和学习笔记。
想要对 OCR 进行性能优化,首先要理解分明待优化的 OCR 网络的构造,在本文中我将尝试着从动机的角度来推演下基于 Seq2Seq 构造的 OCR 网络是如何一步步搭建起来的。
读懂此文的前提只须要理解在矩阵乘法中矩阵的维度变化规律,即 n p 的矩阵乘以 pm 的矩阵等于 n*m 的矩阵。如果晓得 CNN 和 RNN 网络的构造,对机器学习模型的结构套路有点理解的话更好。
首先给出从本文要分析的 OCR BILSTM 网络总体构造如下图:
接下来我将从这张图的右上角(模型的输入端)向左下角(模型的输出端)逐渐解释每一个构造的动机及其作用。
1. 结构最简略的 OCR 网络
首先思考最简略状况下的 OCR 辨认场景,假如输出是只含有一个文字图片,图片的高和宽均为 32 个像素,即 3232 的矩阵,为了不便将其拉长便可失去一个 11024 的矩阵。在输入方面,因为文字的特殊性,咱们只能将所有的文字进行标号,最初输入所辨认的文字的编号便好,由此失去咱们的输入是一个 1*1 的矩阵,矩阵元素的内容就是所辨认的文字的编号。
怎么失去这个 1 1 的矩阵呢?依据概率统计的套路,咱们假如全世界存在 10000 个文字,将其表为 1~1000 号,那么这 10000 个元素都有概率成为咱们的输入,因而咱们如果先算出这 10000 个文字作为该输出图片的辨认后果的概率的话,再挑概率最大的那个输入便能够了。于是问题被转变成如何从一个 11024 的矩阵(X)中失去一个 110000 的矩阵(Y)。在这里便能够上机器学习模型构造中最常见的线性假如套路了,假如 Y 和 X 是之间是线性相关的,这样便可失去最简略且经典的线性模型:Y = AX + B。其中称 X(维度:11024)为输出,Y(维度:110000)为输入,A 和 B 均为该模型的参数,由矩阵乘法可知 A 的维度应该是 10241000,B 的维度应该是 110000。至此,只有 X 是已知的,咱们要计算 Y 的话还须要晓得 A 和 B 的具体值。在机器学习的套路中,作为参数的 A 和 B 的值在一开始是随机设定的,而后通过喂大量的 X 及其标准答案 Y 来让机器把这两个参数 A、B 缓缓地调整到最优值,此过程称为模型的训练,喂进去的数据称为训练数据。训练完后,你便能够拿最优的 A 乘以你的新输出 X 在加上最优的 B 失去相应的 Y 了,应用 argMax 操作来筛选 Y 这 1 10000 个数中最大的那个数的编号,就是辨认进去的文字的编号了。
当初,再回头去看图 1 中右上角的那局部,置信你能看懂两个黄色的 38410000 和 110000 的矩阵的含意了。图中例子和上段文字描述的例子的区别次要在于图中的输出是 1 张 11024 的图片,上段文字中的是 27 张 1384 的图片罢了。至此,你曾经理解如何结构一个简略地 OCR 网络了。接下来咱们就开始对这个简略地网络进行优化。
2. 优化策略一:缩小计算量
在下面的文字描述的例子中,咱们每辨认一个文字就要做一次 11024 和 102410000 的矩阵乘法计算,这外面计算量太大了,是否有一些计算是冗余的呢?相熟 PCA 的人应该马上能想到,其实将 3232 的文字图片拉长为 11024 的矩阵,这个文字的特色空间是 1024 维,即使每维的取值只有 0 和 1 两种,这个特色空间可示意的值都有 2^1024 种,远远大于咱们所假如的文字空间中所有文字个数 10000 个。为此咱们能够用 PCA 或各种降维操作把这个输出的特征向量降维到小于 10000 维,比方像图中的 128 维。
3. 优化策略二:思考文字间的相关性
(揭示:在上图中为了体现出 batch Size 的维度,是按 27 张文字图片来画的,下文中的探讨均只针对 1 张文字图片,因而下文中维度为 1 的中央均对应着图中的 27)
兴许你曾经留神到了,图中与黄色的 38410000 矩阵相乘的“地位图像特色”的维度没有间接用一个 1 384,而是 1*(128+128+128)。其实这里隐含着一个优化,这个优化是基于文字间的关联假如的,简略地例子就是如果后面一个字是“您”,那其前面跟着的很可能是“好”字,这种文字程序中的统计法则应该是能够用来晋升文字图片的辨认准确率的。那怎么来实现这个关联呢?
在图中咱们能够看到左侧有一个 10000128 的参数矩阵,很容易晓得这个参数就像一个数据库,其保留了所有 10000 个文字图片通过加工后的特色(所谓加工便是下面提到的降维,原始特色应该是 100001024 的),照图中的构造,我须要输出以后辨认的这个字的前一个字的辨认后果(辨认工作是一个字接一个字串行地辨认进去的)。而后抉择出上个字对应的特色矩阵 1128,再通过一些加工转换后当做 1 384 的输出中的前 1 / 3 局部内容。
同理,1384 里靠后的两个 1 128 又代表什么含意呢?尽管在句子中,后面一个字对前面一个字的影响很大,即便以后要预测的字在图片中很含糊,我也能够依据后面的字将其猜出来。那是否能够依据其前 k 个字或者后 k 个字猜出来呢?显然答案是必定的。因而靠后的两个 1 *128 别离代表的是句子图片里文字“从前到后(Forward)”和“从后到前(Backward)”的图片特色对以后要辨认的字的影响,因而图中在后面加了个“双向 LSTM 网络”来生成这两个特色。
至此,改良版的 OCR 网络轮廓根本进去了,还有一些细节上的问题须要解决。不知你是否留神到,按下面所述,1384 中蕴含了 3 个 1 128 的特色,别离代表着前一个字对以后字的影响、图片中的整个句子中各个文字从前到后(Forward)的排序对以后文字的影响、图片中的整个句子中各个文字从后到前(Backward)的排序对以后文字的影响。
然而他们的特色长度都是 128!!!一个字是 128,一个句子也是 128?对于不同的文字图片中,句子的长度还可能不一样,怎么可能都用一个字的特色长度就示意了呢?
如何示意一个可变长的句子的特色呢?乍一看确实是个很辣手的问题,好在它有一个很粗犷简略的解决办法,就是加权求和,又是概率统计外面的套路,管你有几种状况,所有的状况的概率求和后都得等于 1。看到在这里不晓得是否被震撼到,“变动”和“不变”这样看起来水火不容的两个货色就是这么神奇地共存了,这就是数学的魅力,让人不禁拍手赞绝!
下图以一个理论的例子阐明这种神奇的形式的运作形式。当咱们要对文字片段中的“筷”字进行辨认时,只管改字已近被遮挡了局部,但依据日常生活中的一些教训常识积攒,要对该地位进行补全填空时,咱们分割上下文,把注意力放在上文中的“是中国人”和下文中的“吃饭”上。这个加权系数的机制便是用来实现这种注意力机制的。至于“日常生活中的教训”这种货色就是由“注意力机制网络”通过大量的训练数据来学习失去的。也就是图 1 中的那 32 个 alpha 的由来。注意力网络在业界个别由 GRU 网络负责,因为篇幅起因,在此不开展了,下回有机会再细说。看官们只需晓得在图一的左边还应该有个“注意力网络”来输入 32 个 alpha 的值便好。
点击关注,第一工夫理解华为云陈腐技术~