参考代码:RefineMask
1. 概述
导读:在这篇文章中针对以Mask-RCNN为代表的实例分割模型存在实例分割mask掩膜边界补贴合的问题进行探究,文章指出由于网络存在下采样操作以及RoI Pooling的操作使得进行mask预测的特征图丢失了很多细节信息,进而导致了实例分割结果边界较差的问题。对此文章从如下几个方面对实例分割头部分进行改进:
1)直接使用FPN网络特征图输出的 P 2 P2 P2特征图添加几个卷积之后进行语义分割,从而辅助实例分割部分;
2)采用级联优化的形式,逐渐增加mask预测的分辨率;
3)对于边缘部分采用额外预测的形式,增强对mask边界的监督能力,从而起到进一步优化实例分割边界的作用;
在下图中对比了原始的Mask-RCNN方法、deeplabv3+为代表的语义分割,以及文章的实例分割结果:
从上图可以看到文章的方法相比原来的Mask-RCNN在mask部分呢是存在较大的改善的。
2. 方法设计
2.1 网络结构
文章的方法是在Mask-RCNN的基础上进行改进得到的,主要的改进便是在实例分割头的部分上,其对应的实例分割头见下图所示:
其对应的代码实现可以参考:
class RefineMaskHead(nn.Module)
结合上图其主要的作用可以划分为3个作用:
- 1)使用FPN网络特征图输出的 P 2 P2 P2特征图得到语义分割的mask和特征图,之后在不同的实例分割优化stage上使用RoI Pooling操作对实例分割进行优化。
对语义分割RoI Pooling:
ins_semantic_masks = roi_align(
_semantic_pred, fake_rois, instance_feats.shape[-2:], 1.0 / self.semantic_out_stride, 0, 'avg', True)
对语义分割特征RoI Pooling:
# instance-wise semantic feats
semantic_feat = self.relu(self.semantic_transform_in(semantic_feat))
ins_semantic_feats = self.semantic_roi_extractor([semantic_feat,], rois)
ins_semantic_feats = self.relu(self.semantic_transform_out(ins_semantic_feats))
concat_tensors.append(ins_semantic_feats)
- 2)使用级联优化策略将实例分割mask从分辨率从 14 ∗ 14 14*14 14∗14优化到 112 ∗ 112 112*112 112∗112;
- 3)使用BAR模对实例分割的mask边界进行优化;
2.2 mask级联优化策略
除了使用上述提到的语义分割分支的mask和feat之外,在级联的过程中还引入了SFM模块,其对特征图的操作流程见下图所示:
语义分割mask、语义分割feat、示例feat和上一个stage的实例mask组合起来进行融合,这里的融合采取的是带膨胀卷积的模块:
class MultiBranchFusion(nn.Module):
def __init__(self, feat_dim, dilations=[1, 3, 5]):
super(MultiBranchFusion, self).__init__()
for idx, dilation in enumerate(dilations):
self.add_module(f'dilation_conv_{
idx + 1}', ConvModule(
feat_dim, feat_dim, kernel_size=3, paddin