语义分割目标上下文表示
Abstract
这篇论文,我们研究语义分割的上下文信息聚合问题。一个像素的标签是该像素属于的目标类别,该方法利用一个像素对应的目标类别的特征表示。首先,在gt分割的监督下学习粗糙的目标区域,其次通过聚合位于目标区域像素的特征表示来 计算目标区域特征表示。最后,计算每个像素和每个目标区域的关系,用目标上下文表示(是所有目标区域特征表示的加权聚合)来增强每个像素的特征表达。代码开源链接:https://git.io/openseg and https://git.io/HRNet.OCR.
Introduction
一个位置的上下文 通常指一系列位置(如周围的像素),典型工作有 ASPP, PPM,利用多尺度上下文;最近的工作,如DANet,CFNet,OCNet考虑的是 一个位置和其上下文位置的关系,对于相似的特征,将具有较高权重的上下文位置特征进行聚合。我们打算通过一个像素对应的目标区域的类别特征表示来增强像素特征,这样可以提高分割质量。
方法由三个部分组成:首先,划分上下文像素成 一系列 软物体区域,每一个区域对应一个类别,即深度网络学出的粗糙软分割结果。这样的划分是在gt分割的监督下学习的。其次,我们估计每个物体区域的特征,通过聚合位于相应目标区域的像素特征。最后,我们用目标上下文特征(OCR)增强每个像素的特征。OCR是所有目标域特征的加权聚合,根据像素和目标区域之间的关系计算出权重。提出的OCR方法不同于传统多尺度方法,OCR区分 同目标类上下文像素和不同目标类上下文像素 ;多尺度方法的ASPP和PPM 仅仅区分不同空间位置,其他的关系上下文方法没有考虑区域,只是利用像素和上下文像素的关系(即上下文像素不是强调区域的) 。
思想:粗糙到精细的分割,我们使用粗糙分割map产生上下文特征,而不是直接把map视为额外的特征,利用软分割区域为像素学习更好的特征表达。从网络形式上来看,OCRNet和Deeplab系列、PSPNet、Non-Local和其他自注意力方法都是在完成类似的目标,即如何对深度Backbone网络提取出来的特征X进行特征增强,使其聚合周围像素(上下文)的信息,得到语义性更强的特征图Y。
Approach
理解如下:OCRNet和self-attention有很多相似之处,值得借鉴。具体细节,见原始论文。
a) 学习粗糙的类别mask,根据mask计算类别特征向量
k
j
k_j
kj,{j=1,2…,k}
b) 计算每个像素特征向量
x
i
x_i
xi与类别特征向量
k
j
k_j
kj的相似性,得到相似性权重
w
i
j
w_{ij}
wij
c) k个类别的相似性权重
w
i
j
w_{ij}
wij对特征向量
x
i
x_i
xi进行加权求和,得到增强的特征表达Y
d) 增强特征Y与特征图X concat在一起
参考代码如下:Open-mmlab/segmentation(这里仅仅是给出“根据mask计算类别特征向量”的代码片段)
class SpatialGatherModule(nn.Module):
def __init__(self, scale):
super(SpatialGatherModule, self).__init__()
self.scale = scale
def forward(self, feats, probs):
"""Forward function."""
batch_size, num_classes, height, width = probs.size()
channels = feats.size(1)
probs = probs.view(batch_size, num_classes, -1)
feats = feats.view(batch_size, channels, -1)
# [batch_size, height*width, num_classes]
feats = feats.permute(0, 2, 1)
# [batch_size, channels, height*width]
probs = F.softmax(self.scale * probs, dim=2)
# [batch_size, channels, num_classes]
ocr_context = torch.matmul(probs, feats)
ocr_context = ocr_context.permute(0, 2, 1).contiguous().unsqueeze(3)
return ocr_context
Conclusion
OCRNet的思想是Non-local等自注意力机制的进一步挖掘,Non-local对于Backbone网络提取的特征图X的每个像素 p i p_i pi抽取特征向量 x i {x_i} xi与全部像素特征向量逐一做相似性度量,Softmax之后得到二维权重map(相似的两个特征向量,相应权重自然大),权重map与各自对于像素特征向量的加权和作为像素 p i p_i pi的增强特征向量 y i y_i yi。Non-local庞大的相似度计算是需要优化的,OCRNet从类别区域上(或者说是类别目标级别上)优化了计算,在粗糙mask引导下计算类别特征向量,此时每个像素 p i p_i pi的特征向量 x i {x_i} xi只需和每个类别的特征向量计算相似度,不需要再和全图的像素计算相似度,降低了时间复杂度的同时,还避免了和许多不相关像素的相似度计算,降低了干扰。OCRNet的论文思想,值得参考学习。