基于全景分割Max-Deeplab的版面分析:Towards End-to-End Unified Scene Text Detection and Layout Analysis


Max-Deeplab:

· 论文:https://arxiv.org/abs/2012.00759
· 代码:https://github.com/google-research/deeplab2 (google官方版)
· 代码: https://github.com/conradry/max-deeplab (大佬自创版)

Towards End-to-End Unified Scene Text Detection and Layout Analysis:

· 论文:https://arxiv.org/abs/2203.15143v1
· 代码:https://github.com/google-research-datasets/hiertext

KMax-Deeplab:

· 论文:https://arxiv.org/abs/2207.04044
· 代码:https://github.com/google-research/deeplab2 (google官方版)

一、全景分割介绍

不熟悉全景分割或者不清楚其与语义分割、实例分割区别的同学可以参看文章:
Panoptic Segmentation-全景分割概念与评价指标

二、Max-Deeplab

在这里插入图片描述
现在绝大多数全景检测的处理方法依赖于代理子任务和手工设计的组件,比如框检测、非极大值抑制、stuff-thing合并等等。

上图是一个关于各个全景分割模型是否使用到组件的统计,虽然DETR也是端到端的模型,但是在训练过程中,DETR仍然用到了检测框。

下图是Panoptic-FPN使用的基于anchor的三级代理子任务。比如全景分割结果是将语义分割和实例分割结果合并,而实例分割任务又分解为基于box的检测与分割任务,盒检测任务又分解为基于Anchor的回归和分类任务。

1.粗略框架

在这里插入图片描述

这是max-deeplab易懂版本,先依据这副图简单介绍一下这个模型。它具有两个输入,一个是输入的图像,另外是一个叫做全局内存的输入。这个模型的特色在于设计了双路径transform,称作pixel像素路径和全局路径,在这两个路径之间采用交叉注意力机制(Cross-attention的输入来自不同的序列,Self-attention的输入来自同序列,也就是所谓的输入不同,但是除此之外,基本一致)。像素路径的输出是D×H/4×W/4维的矩阵,代表像素特征;全局路径的输出有两个,一个是N×C维的掩码类别,另一个是N×D维的的掩码特征。而像素特征与掩码特征相乘,就得到N×H/4×W/4维的mask图。

其中D是特征编码的维度,当D=3也就是输出为RGB颜色通道时,可视化看见像素特征是一个带有各种色彩mask的rgb图,掩码特征也可以用一种可视化颜色表示,对应一种类别。N是模型输出的mask数量,需要在训练之前就设置好,比如设置为50,那么这里就会有50张可视化的mask图,一张代表一种mask,如果认为一张图像上分割得到的目标很多,那么可以增加N的数值。而C代表的是判定类别,要注意的是C≠N,可能大于也可能小于,看需要判别的类别数量,比如版面分析,只需要判别是否是文字的话,就是个二分类(C=1),那么C<N的情况下,不同mask可能指向同一个类别,也有可能指向空类别,这就实现了max-deeplab模型可以输出stuff、thing、∅。

2.官方框架

在这里插入图片描述

刚才是模型的粗略介绍,这一幅图是论文里的官方版图。其实这个模型最困惑我的是全局内存指的是什么,论文里面没有关于它的任何解释,我在官方其他文件和代码里才逐渐了解,其实这个全局内存就是object queries,在严格意义上它也不是一个输入,而是一个可训练的参数。每个query有D维,总共N个query,基于这N个object query就预测出N个mask。该object queries是随机初始化的可训练参数,通过双路transform聚合来自像素特征的信息,并通过这个公式更新自己。(其实就是p2m注意力模块,Q是query本身,K和V分别是像素的Key和Value向量)。官方文件里说交叉注意机制的工作机制还不是很清楚,不知道为什么会有优秀的效果。但其实在这里,交叉注意力是有迹可循的,它和k-means聚类很相似,它将对象查询视为可学习特征向量的聚类中心。很好理解,如果对象查询和像素特征相似,那么softmax里的Q和K相乘的值就越大,反之越小,那么在更新对象查询时,它就会更偏向于与它相似的像素特征,这样就将一系列相近像素的聚合在了一起。同样理解的话,那么m2p注意力模块就是使像素特征偏向它具有相似性的Query,这样使得本身就具备一定相似性的像素的相关性更高,更容易聚类。

3.详细框架

(1)Encoder

在这里插入图片描述
这是一副maxdeeplab的详细框架图encoder部分。可以看到它有一个stem的结构,由3个3×3的卷积形成。作用是下采样输入图片和学习局部特征。Max-deeplab的backbone是一个ResNet50的变种,其实ResNet50本身的Stem是一个7×7的卷积,在这里用3个3×3替换掉了。另外,ResNet50的前面两个stage没有变化,stage3换成了由Axial-attention(轴向自注意)为核心的的bottleneck。Stage4换成了设计的双路transform。

(2)self-attention

在这里插入图片描述

最上面的公式是基础的全局自注意力,一般用在卷积层后来增强CNN的非局部交互,因为如果直接将图像输入进全局注意力,上千个像素会使得计算量复杂度达到O(h2w2),非常庞大,所以全局注意力层无法作为单独的一层网络,往往跟在卷积层后面,而且它不能提取位置信息。
局部注意力避免了上述两个问题,对每一个位置o,取一个m×m的区域作为计算域,大大减小了计算量(O(hwm2))。另外设置了一个相对位置编码rp-o,产生一个“在计算域中先看哪里”的先验,则内积qoTrp-o将会度量位置p到o的兼容性(为什么不考虑绝对位置编码qoTrp?泛化性不好)。
一个轴向注意力层沿着一个特定的轴的方向传播信息,为了捕获全局信息,先是在宽度方向上,再在高度方向上接连地使用两个轴向注意力层。可以理解,宽度轴上的查询像素o聚合了它这一行的键像素p的特征,这时候高度轴上查询像素o聚合这一列的键像素的特征就等于聚合这一整个特征图的特征。虽然主观上觉得这种间接地提取全局信息不如全局自注意力,但是从计算量上却比之小了太多,复杂度只有O(hwm)。另外轴向注意力具备位置敏感(positive sensitivity),之前局部注意力的位置编码主要依赖查询像素o,这里的位置编码还关注了依赖键像素p的Key和Value位置编码。

(3)Decoder

在这里插入图片描述

Max-deeplab的解码器是一个堆叠的“沙漏”模型。先理解“沙漏”,可以看到每个Decoder Bottleneck都是不同尺度的特征提取,然后通过双线性调整后简单求和来融合。另外,每一个Decoder Bottleneck的输入有两个,一个是上一层的输出,另一个是分别是stage2和stage1的输出。而堆叠很简单,就是Decoder重复N次。

(4)Output

在这里插入图片描述

Max-deeplab的输出在最开始已经介绍了,像素路径输出经过两层卷积得到像素特征,全局路径分别经过两层线性层,分别得到掩码类别classes和掩码特征。又由像素特征和掩码特征相乘,得到N张掩码图。

(详细框架图,来自:全景分割Max-Deeplab)
在这里插入图片描述
在这里插入图片描述

4.损失函数

(1)PQ风格损失

在这里插入图片描述

其实max-deeplab除了双路径transform这一个特色,在损失函数和辅助损失函数上也有其特点。首先它的损失函数是基于PQ这个全景分割指标来设置的。
PQ = RQ×SQ,RQ指recognition quality识别质量,SQ指segmentation quality分割质量。PQ是如何计算的?首先计算每一类的PQ,再计算所有类的平均值。计算每一类时,根据唯一匹配规则,将预测结果p和GT(g)根据IoU分为三类,分别为TP、FN、FP(可参照由下图的例子)。得到三类后,根据公式可以看到RQ就是F1指标,1/2FP+1/2FN是惩罚没有匹配的instance。而SQ公式是计算正确匹配目标的平均IoU值。
模型定义了掩码(mask)相似性度量来优化模型。即上面这个公式。其中p©∈[0,1],是预测正确的概率;mi和mj分别是预测掩码和GT,由两者计算的Dice(mi,mj)∈[0,1],代表两者相似性。两者相乘类似于PQ的分解。
同时使用匈牙利算法来实现预测掩码和GT的二分图一对一匹配。之前说过,模型会输出N个掩码mask,但是GT可能只有K个掩码,那么K个预测掩码成为正掩码,另外N-K个掩码成为负掩码,可以预测出∅类别。
那么获得最大值化的掩码相似性度量,可以直接优化模型参数(右上公式)。
在实际中,由正掩码组成的损失函数改写为两个常见的损失项,两个权重系数是常数。这个损失函数的背后逻辑是,希望掩码和类是同时正确的。
而由负掩码,即指向∅类别的那些掩码,组成的损失函数,只有一个损失项。
两个损失函数通过权重值α平衡。

(2)辅助损失函数在这里插入图片描述

除了类似PQ的损失函数,论文中还使用了三种辅助损失函数帮助训练模型。
第一个是通过逐像素的实例鉴别损失来帮助学习像素特征g。这个损失的计算步骤如下
·通过像素特征g和下采样的GT标签m,根据公式2计算每种类别的掩码的平均特征。
·通过公式1来让每个像素执行一个实例识别任务,即每个像素应正确识别它自身属于哪一个类。
公式2的内在逻辑是,利用gt标签聚类所有同类像素特征并得到其平均特征。
公式1的内在逻辑是,利用向量点乘计算像素与该类特征的相似性。从数学层面理解,当该像素的编码与该类的编码向量越近似则点乘越大(分子越大,同时分子越接近分母),使得该像素处的损失越接近0,反之接近-1。这是一种通过对比来鼓励来自同一实例的特征相似。

逐像素的掩码ID交叉熵损失,通过公式3判断每个像素最可能是N个mask中的哪一个。然后与GT标签进行交叉熵损失计算(应该是二分类交叉熵,因为只能得到判断结果而非判断结果的概率)。

语义分割损失,认为可以帮助捕获每个像素的语义特征。从编码器encoder输出的结果直接计算语义分割损失。

5.实验

论文里关于实验部分写得很详细,特别可以关注一下消融实验部分。

(1)对比实验

在这里插入图片描述

(2)消融实验

在这里插入图片描述

二、端到端的场景文本识别和版面分析

在这里插入图片描述
这个版面分析感觉是完全依靠了max-deeplab的优秀性能,唯独设计了一个layout branch分支中,将max-deeplab输出的掩码特征经过3层自注意力层,再利用公式计算出掩码之间的相关性,大于阈值则认为两个掩码间可以聚类为一个文本。

在这里插入图片描述

三、KMax-Deeplab

在这里插入图片描述

论文里提到,交叉注意力机制就相当于一个聚类过程,提取另一个序列某类别的特征并聚合。与此同时,作者注意到交叉注意方案和传统的k-means聚类算法十分相似,它将object queries视为可学习编码特征的向量中心。

在这里插入图片描述

但是对于max-deeplab中的交叉注意力,因为是在空间H×W维度上进行softmax归一化,而图像分辨率往往在数千像素范围,需要多次迭代来学习注意力图。同时,它与k-means聚类不是完全相同,比如k-means算法不需要参数,也就不需要线性层;最重要的是,k-means在将相似度转化为Value的权重时,采用的不是空间上的softmax,而是集群的argmax。
是否可以将更新object queries的公式完全仿照k-means?
于是将softmax改成集群的argmax。
在这里插入图片描述
kMaX- deeplab架构由三部分组成。像素编码器提取像素特征,增强的像素解码器恢复特征图的分辨率,并通过transform或轴向注意力增强像素特征,最后用k-means解码器从k-means聚类角度将对象查询(即群集中心)转换为掩码嵌入向量。
在这里插入图片描述
KMax-deeplab表现SOTA!比max-deeplab的PQ值高了5.8%,而操作上仅仅将softmax改为argmax(模型有一定的变化,但不大)。为什么这种改变可以取得优秀的性能,是否其他模型可以效仿?

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值