MASTER: Multi-aspect non-local network for scene text recognition

总体介绍

基于Seq2Seq的OCR改进文章,提出两个问题,encoder特征间相似度太高导致注意力不准 & RNN-based的结构需要逐个step跑效率太低:

1、 such methods suffer from attention-drift problem because high similarity among encoded features leads to attention confusion under the RNN-based local attention mechanism. 

2、RNN-based methods have low efficiency due to poor parallelization.

三个改进,加了2个自注意力机制 & 改进网络结构增强对空间的分辨能力 & 更有效的缓存机制加速:

 (1) not only encodes the input-output attention but also learns self-attention which encodes feature-feature and target-target relationships inside the encoder and decoder

 (2) learns a more powerful and robust intermediate representation to spatial distortion

 (3) owns a great training efficiency because of high training parallelization and a high-speed inference because of an efficient memory-cache mechanism. 

 

上图即为网络结构,

编码器种作者用Multi-Aspect Global Context Attention (GCAttention)结构改进了常规的resnet,从Fiegre2-a、Figure2-b可见GCA的结构:多头的Resnet Block。

Global context

其中Figure2-a的结构(standard global context block)是比较老的ResNet改进了,是对non-local block的简化实现,下面这张图应该更为经典(解读见https://zhuanlan.zhihu.com/p/64988633):

 

Non local SENet GCNet

 

 

Non local通过注意力机制给HW尺寸图的每个位置单独生成了HW尺寸的权重,HW的权重和C*HW的value作用生成每个位置的C*1*1的特征,共有HW个特征,GCNet的作者分析non local发现对于不同位置来说,它们的attention maps几乎是相同的,换句话说,虽然non-local block想要计算出每一个位置特定的全局上下文,但是经过训练之后,全局上下文是不受位置依赖的。即上non local图中的HW*HW的权重矩阵其实用1*HW即可(不同位置的权重统一表示),最后的特征也只有一个C*1*1。

GCNet意义就是先计算了融合全局上下文信息的C个通道特征,然后捕获通道间的依赖,最后将各个通道的信息添加到原始特征上:

 

 

 

 

卷积也能拆分成空间依赖、通道依赖、特征融合三个步骤,Non-local和SENet有效主要是因为context modeling,卷积只能对局部区域进行context modeling,导致感受野受限制,而Non-local和SENet实际上是对整个输入feature进行context modeling,感受野可以覆盖到整个输入feature上,这对于网络来说是一个有益的语义信息补充。另外,网络仅仅通过卷积堆叠来提取特征,其实可以认为是用同一个形式的函数来拟合输入,导致网络提取特征缺乏多样性,而Non-local和SENet正好增加了提取特征的多样性,弥补了多样性的不足。GCNet充分结合了Non-local全局上下文建模能力强和SENet省计算量的优点,在各个计算机视觉任务上得到更好的结果。

Multi-Apsect GCAttention (MAGC)

原GCNet输出C*1*1的特征中各个通道依赖同一个HW尺寸的权重,这不是很合理,作者采取多头的机制使得不同的通道对不同的位置的依赖权重不再相同。公式中计算alpha里的d我没怎么搞懂,说是为了抵消网络中不同的方差,,看起来是网络全部变量的方差/8?可以看看代码实现。

 

 

 

 

 

 编码器就是GCA的堆叠,基于ResNet31实现。