基于STN的场景文字识别框架整理

当前场景文字识别较为主流的方法分为 attention mechanism(代表:Show, Attend and Read; Transformer-based attention; 各种各样的 2D Attention) 和 STN + CRNN / DenseNet + CTC,二者的主要区别是一个是在解码前给文字区域赋予较高的权重,聚焦于文本信息,弱化无关背景信息,另一个是在一开始修正曲形的文字得到水平规整的文字进行识别;

基于注意力机制的几篇前面博文都有涉及,感兴趣可以参考之前的文章:

  1. Show, Attend and Read
  2. Transformer-based attention
  3. 2D attention (深度双向transformer)

由于最近组里相关项目涉及到基于 STN 的文字识别算法框架,所以大概总结一下相关模型结构。

    基本框架:

intputs --> STN --> Feture Extraction (CNN) --> Sequence Modeling(optional) --> Prediction(Decoder) --> outputs

  • STN:修正曲形文字为水平规整文字;
  • CNN:提取图像特征;
  • Sequence Modeling:建立encoder得到的特征图的上下文关联(contextual connection);
  • Decoder:输出最终的文字字符;

 

STN: Spatial Trasformation Network

1. 总体概览

以较为经典的 TPS-STN 为例,定位网(localization network)络定位出一系列基准点(fiducial points),格点生成器(grid generator)依据这些基准点生成对应的一系列采样点(sampling grid),采样器通过匹配两组基准点和变换矩阵 T 生成基于原图文字区域的格点网络,最后通过双线性差值得到修正的图像,一般和原图尺寸相同;

2. 定位网络 localization network

通过CNN回归一系列坐标点(x-y),通过激活函数 tanh 归一化为[-1, 1],共 2K 个值, 确定 K 个基准点, 记为C

注意 K 为常亮;

3. 格点生成器 grid generator

首先定义另一组 K 个基准点(base fiducial points)C^'C^' 均匀分布在修正的照片的上下两侧,下图中左边绿色的点是 C,右边的蓝色的点就是 C^';通过变化矩阵T完成从左图到有图的变化;

TPS 变换可以用矩阵 T 表示:, T \in R^{2 \times (K+3)}

其中为常量;

d_{i,k} 表示 p^{'}_{i} 和 C^{'}_k 的欧式距离;

P^{'}=\left \{ \left. p^{'}_{i} \right \} \right., i =1, 2, ..Np^{'}_i 表示输出图像的每一个像素点的坐标(x, y),N 为输出(输入)图像像素个数;

P=\left \{ \left. p_i \right \} \right., i =1, 2, ..N, p_i  表示格点生成器对应原图中生成的格点坐标(x, y),N 为输出(输入)图像像素个数;

是通过格点生成器生成的 I^' 上的像素值,

4. 采样器 sampling grid

I{^'}=V(P, I)V表示双线性差值,得到从输入图像到输出图像的变换;

5. 总结

整个 TPS-STN 结构是可微的,所以可以通过反向传播反传梯度自动学习,是一个无监督的过程,可以应用在倾斜或小曲率的曲形文字修正上。

 

CRNN:Convolutional-Recurrent Network

Encoder: CNN+Sequence Modeling, CNN 的选择有很多,目前效果比较好的就是 ResNet 和 DenseNet;Sequence Modeling 当前比较主流的做法就是使用 BiLSTM 进行序列建模,关联特征向量的上下文信息;这部分没太多好说的,要注意的是 DenseNet 的中间层特征图是跨层连接,所以具有全局感受野,此外其网络规模相对同尺度 ResNet 更小,但训练更占显存;

 

CTC:Connectionist temporal classification

选用 CTC 进行预测输出的话,其输入必为列方向上一维的特征向量,引入blank空白字符,对于每一列向量预测一个字符,最后通过 beta-decode 删除空白字符和重复字符;

  • 作用:切分输入序列的单个词以及整合输出序列;
  • 优点:
    • 多个连续文字,作为一个输入;
    • 整合 RNN 输出最优序列;
  • e.g 

       上图 RNN 每一步的输出其实都是一组概率分布,p(l|x), l\in Alphebat, 对于第一个矩形框,输出可能是p(l='h'|x)=0.5, \, p(l='m'|x)=0.3

  • 损失函数:Lebal Error Rate (LER),其中涉及到 ED (Edit Distance, 量化两个字符串的相异性)的概念。

定义:

  • LER(h, S')=\frac{1}{|S'|} \sum_{(x,z)\in S'}\frac{ED(h(x), z)}{|z|}
  • CTC 的 softmax 输出类别有 L+1 种,1 为空白分隔符(L为字符类别数目);
  • 同一种输入对应的多种输出可能会有多种形式:把空格和连续重复的字母去掉,即l=B(\pi), |l|\leqslant T
  • 预测标签有很多备选的输出序列,所以预测标签 ll 的概率公式:p(l|x)=\sum_{\pi \in B^{-1}(l)}p(\pi |x)
  • 输出模型构建:
    • 搜索最优前缀:找到第一个字母的最优输出,然后找到以这个字母为开头的子串,并在子串中找到下一个最优的子母,依次下去。
    • 启发式:用预测出来的空格把预测结果划分成几段,且预测成空格的概率必须大于一个阈值(强条件),再对每一段用最优前缀的方法;

 

Attention Deocoder:

捕捉decoder输入序列的信息,给其赋予不同权重,最后再输出最终的字符,一般是每次输出的预测字符的一部分输入来自于上一个字符的输出,第一个输出字符固定为 BOS_TOKEN,输出到 EOS_TOKEN 为止;

 

其他:

Beam Search

字符识别的beam search只在inference时(train的时候label已知),且只用于输出时存在前后依赖关系的网络结构中使用;

  1. 假设预测第一个位置的字符为a的概率为0.2, 为b的概率为0.1;
  2. 预测第二个字符时,前一个预测字符作为输入,如果第一个字符预测取a,则第二个字符预测为c的概率最大,为0.2;
  3. 但是如果第一个字符取b,此时可能第二个字符预测为d的概率最大,为0.9;
  4. 这个时候整个字符串预测为ac的概率为 0.2 * 0.2 = 0.04, 而预测为bd的概率为 0.1 * 0.9 = 0.09。

这种情况下基于贪心的策略不是很合理,因此beam search的做法是选定一个K值(K > 1),每次取前K个概率最大的字符和前面保留的前K个概率最大的字符串(长度为n)排列组合,再得到概率最大的长度为n+1的字符串,依次向后预测和生成。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值