Week3:CRNN文本识别

2021SC@SDUSC

一.简介
PaddleOCR算法主要包含三个部分,分别是:

  • DB文本检测
  • 检测框矫正
  • CRNN文本识别

在训练时,这三个模型单独进行训练,得到三个模型的训练权重,在推理预测时会把三个模型整合在一起,即PaddleOCR推理模型的最终结果是由上述三个模型串联推理而得,推理步骤大致如下:

  • 进行文本检测,得到文本位置的检测框;
  • 根据得到的文本检测框对其进行角度分类;
  • 进行文本识别。

二.CRNN 介绍
 CRNN 模型,即将 CNN 与 RNN 网络结合,共同训练。主要用于在一定程度上实现端到端(end-to-end)地对不定长的文本序列进行识别,不用先对单个文字进行切割,而是将文本识别转化为时序依赖的序列学习问题,就是基于图像的序列识别。

  • 构建 CRNN 输入特征序列
  • 其中还涉及到了 CTC 模块,目的是对其输入输出结果
    Week3:CRNN文本识别_第1张图片如上图整个CRNN网络结构包含三部分,从下到上依次为:
  • CNN(卷积层):使用深度 CNN,对输入图像提取特征,得到特征图;
  • RNN(循环层):使用 双向RNN(BLSTM)对特征序列进行预测,对序列中的每个特征向量进行学习,并输出预测标签(真实值)分布;
  • CTC loss(转录层):使用 CTC 损失,把从循环层获取的一系列标签分布转换成最终的标签序列。

三.CRNN 网络结构
3.1 CNN
Week3:CRNN文本识别_第2张图片
 这里有一个很精彩的改动,一共有四个最大池化层,但是最后两个池化层的窗口尺寸由 2x2 改为 1x2,也就是图片的高度减半了四次,而宽度则只减半了两次,这是因为文本图像多数都是高较小而宽较长,所以其 feature map 也是这种高小宽长的矩形形状,如果使用 1×2 的池化窗口可以尽量保证不丢失在宽度方向的信息,更适合英文字母识别(比如区分 i 和 l)。
 CRNN 还引入了 Batch Normalization 模块,加速模型收敛,缩短训练过程。例如:

  1. 输入图像为灰度图像(单通道)。
  2. 高度为32,这是固定的,图片通过 CNN 后,高度就变为 1,这点很重要。
  3. 宽度为160,宽度也可以为其他的值,但需要统一,所以输入 CNN 的数据尺寸为 (channel, height, width)=(1,32, 160)。
  4. CNN 的输出尺寸为 (512, 1, 40)。即 CNN 最后得到 512 个特征图,每个特征图的高度为 1,宽度为 40。
  5. 最后 CNN 得到的 feature map 尺度为 512x1x16。

3.2 Map-to-Sequence
 不能直接把 CNN 得到的特征图送入 RNN 进行训练的,需要进行一些调整,根据特征图提取 RNN 需要的特征向量序列。Week3:CRNN文本识别_第3张图片
 现在需要从 CNN 模型产生的特征图中提取特征向量序列,每一个特征向量(如上图中的一个红色框)在特征图上 按列 从左到右生成,每一列包含 512 维特征,这意味着第 i 个特征向量是所有的特征图第 i 列像素的连接,这些特征向量就构成一个序列。
 由于卷积层,最大池化层和激活函数在局部区域上执行,因此它们是平移不变的。因此,特征图的每列(即一个特征向量)对应于原始图像的一个矩形区域(称为感受野),并且这些矩形区域与特征图上从左到右的相应列具有相同的顺序。特征序列中的每个向量关联一个感受野。如下图所示:Week3:CRNN文本识别_第4张图片
这些特征向量序列就作为循环层的输入,每个特征向量作为 RNN 在一个时间步(time step)的输入。

3.3 RNN
 因为 RNN 有梯度消失的问题,不能获取更多上下文信息,所以 CRNN 中使用的是 LSTM,LSTM 的特殊设计允许它捕获长距离依赖。
 LSTM 是单向的,它只使用过去的信息。然而,在基于图像的序列中,两个方向的上下文是相互有用且互补的。将两个 LSTM,一个向前和一个向后组合到一个双向 LSTM 中。此外,可以堆叠多层双向 LSTM,深层结构允许比浅层抽象更高层次的抽象。如下图,这里采用的是两层各 256 单元的双向 LSTM 网络:Week3:CRNN文本识别_第5张图片
 通过上面一步,我们得到了 40 个特征向量,每个特征向量长度为 512,在 LSTM 中一个时间步就传入一个特征向量进行分类,这里一共有 40 个时间步。
 我们知道一个特征向量就相当于原图中的一个小矩形区域,RNN 的目标就是预测这个矩形区域为哪个字符,即根据输入的特征向量,进行预测,得到所有字符的 softmax 概率分布,这是一个长度为字符类别数的向量,作为 CTC 层的输入。
 因为每个时间步都会有一个输入特征向量 x t x_txt​,输出一个所有字符的概率分布 y t y_tyt​,所以输出为 40 个长度为字符类别数的向量构成的后验概率矩阵。如下图所示:Week3:CRNN文本识别_第6张图片
3.4 CTC Loss
 这算是 CRNN 最难的地方,这一层为转录层,转录是将 RNN 对每个特征向量所做的预测转换成标签序列的过程。数学上,转录是根据每帧预测找到具有最高概率组合的标签序列。
 端到端 OCR 识别的难点在于怎么处理不定长序列对齐的问题!OCR 可建模为时序依赖的文本图像问题,然后使用 CTC(Connectionist Temporal Classification, CTC)的损失函数来对 CNN 和 RNN 进行端到端的联合训练。

3.4.1 序列合并机制
 我们现在要将 RNN 输出的序列翻译成最终的识别结果,RNN 进行时序分类时,不可避免地会出现很多冗余信息,比如一个字母被连续识别两次,这就需要一套去冗余机制。Week3:CRNN文本识别_第7张图片
 比如我们要识别上面这个文本,其中 RNN 中有 5 个时间步,理想情况下 t0, t1, t2 时刻都应映射为 “a”,t3, t4 时刻都应映射为 “b”,然后将这些字符序列连接起来得到 “aaabb”,我们再将连续重复的字符合并成一个,那么最终结果为 “ab”。
 这似乎是个比较好的方法,但是存在一个问题,如果是 book,hello 之类的词,合并连续字符后就会得到 bok 和 helo,这显然不行,所以 CTC 有一个 blank 机制来解决这个问题。
 我们以 “-” 符号代表 blank,RNN 输出序列时,在文本标签中的重复的字符之间插入一个 “-”,比如输出序列为 “bbooo-ookk”,则最后将被映射为 “book”,即有 blank 字符隔开的话,连续相同字符就不进行合并。
 即对字符序列先删除连续重复字符,然后从路径中删除所有 “-” 字符,这个称为解码过程,而编码则是由神经网络来实现。引入 blank 机制,我们就可以很好地解决重复字符的问题。
 相同的文本标签可以有多个不同的字符对齐组合,例如,“aa-b” 和 “aabb” 以及 “-abb” 都代表相同的文本 (“ab”),但是与图像的对齐方式不同。更总结地说,一个文本标签存在一条或多条的路径。

3.4.2 训练阶段
 在训练阶段,我们需要根据这些概率分布向量和相应的文本标签得到损失函数,从而训练神经网路模型,下面来看看如何得到损失函数的。Week3:CRNN文本识别_第8张图片
 如上图,对于最简单的时序为 2 的字符识别,有两个时间步长 (t0,t1) 和三个可能的字符为 “a”,“b” 和 “-”,我们得到两个概率分布向量,如果采取最大概率路径解码的方法,则 “–” 的概率最大,即真实字符为空的概率为 0.6*0.6=0.36。
 但是为字符 “a” 的情况有多种对齐组合,“aa”, “a-“ 和 “-a” 都是代表 “a”,所以,输出 “a” 的概率应该为三种之和:0.4*0.4+0.4*0.6+0.6*0.4=0.16+0.24+0.24=0.64
所以 “a” 的概率比空 “-” 的概率高.如果标签文本为 “a”,则通过计算图像中为 “a” 的所有可能的对齐组合(或者路径)的分数之和来计算损失函数。
 所以对于 RNN 给定输入概率分布矩阵为 y={y1,y2,…,yT},T是序列长度,最后映射为标签文本l的总概率为:Week3:CRNN文本识别_第9张图片
 其中 B(π) 代表从序列到序列的映射函数 B 变换后是文本 l 的所有路径集合,而 π 则是其中的一条路径。每条路径的概率为各个时间步中对应字符的分数的乘积。
 我们就是需要训练网络使得这个概率值最大化,类似于普通的分类,CTC 的损失函数定义为概率的负最大似然函数,为了计算方便,对似然函数取对数。
 通过对损失函数的计算,就可以对之前的神经网络进行反向传播,神经网络的参数根据所使用的优化器进行更新,从而找到最可能的像素区域对应的字符。
 这种通过映射变换和所有可能路径概率之和的方式使得 CTC 不需要对原始的输入字符序列进行准确的切分。

你可能感兴趣的:(深度学习,机器学习,神经网络)