《UPSNet:A Unified Panoptic Segmentation Network》论文笔记

本文详细解析了UPSNet,一种基于Mask R-CNN的全景分割网络。UPSNet通过添加语义分割分支和全景分割头,解决实例分割与语义分割的融合问题。在训练时,通过特殊策略处理未知类别,以提高性能。测试时,依据Mask R-CNN和语义分割结果确定类别。实验结果表明其在MS-COCO和CityScaps数据集上表现出色。
摘要由CSDN通过智能技术生成

参考代码:UPSNet

1. 概述

导读:在这篇文章中提出了一种端到端的全景分割方法,其在Mask RCNN的基础上通过添加一个语义分割分支,之后使用一个无参数的全景分割预测头使用之前预测头的输出(指的是使用了这部分的参数)经过整合实现全景分割。为了解决语义分割和实例分割之间的冲突,文章在全景分割的预测结果中添加一个未知的类别(文中指出是按照规则选择一定的比例实例作为未知类别),从而使得其在性能指标上表现更佳。

全景分割解决的是实例分割/语义分割融合的方法,这篇文章中将全景分割的目标是否可数性质划分为两个类别:

  • 1)目标是可数的(things),这类目标是可数的且具有具体的轮廓信息,诸如行人/车辆等;
  • 2)目标是不可数的(stuff),这类目标不可数且具有不固定的轮廓,诸如天空/草地/道路等;

2. 方法设计

2.1 全景分割的pipline

文章的pipline见下图所示:
在这里插入图片描述
在上图中可以看到文章的方法是在Mask RCNN的基础上添加语义分割分支和全景分割分支实现的,并且通过pipeline上的巧妙设计实现了端到端的训练。

2.2 语义分割分支

语义分割部分使用了FPN输出的特征 [ P 2 , P 3 , P 4 , P 5 ] [P_2,P_3,P_4,P_5] [P2,P3,P4,P5],它们输出的channel都是256,对应的stride为 [ 1 4 , 1 8 , 1 16 , 1 32 ] [\frac{1}{4},\frac{1}{8},\frac{1}{16},\frac{1}{32}] [41,81,161,321]。在经过共享参数的可变形卷积block之后将这些特征统一规整到尺寸为原图 1 4 \frac{1}{4} 41的尺度上,之后经过一个1*1的卷积进行输出,其结构见下图所示:
在这里插入图片描述
为了增加对分割结果中RoI区域的关注,文章对其引入了RoI Loss就是使用instance GT去crop上面生成的特征,之后使用共享参数的预测头去预测这部分的结果,其输出的预测结果与Mask RCNN头输出的结果大小一致,为28。从而使得网络更加关注RoI区域(但是从文章表6的结果看这部分带来的增益相当小…)。这部分的代码可以参考:

# upsnet/models/fcn.py
def forward(self, fpn_p2, fpn_p3, fpn_p4, fpn_p5, roi=None):
    # 使用共享参数的可变形卷积进行特征聚合
    fpn_p2 = self.fcn_subnet(fpn_p2)
    fpn_p3 = self.fcn_subnet(fpn_p3)
    fpn_p4 = self.fcn_subnet(fpn_p4)
    fpn_p5 = self.fcn_subnet(fpn_p5)

    fpn_p3 = F.interpolate(fpn_p3, None, 2, mode='bilinear', align_corners=False)
    fpn_p4 = F.interpolate(fpn_p4, None, 4, mode='bilinear', align_corners=False)
    fpn_p5 = F.interpolate(fpn_p5, None, 8, mode='bilinear', align_corners=False)
    feat = torch.cat([fpn_p2, fpn_p3, fpn_p4, fpn_p5], dim=1)  # 规整到stride=2的尺寸上去
    # 这里的分割类别数量比实例分割的类别多为133,排列顺序为【stuff+things】,实例为81
    score = self.score(feat)
    ret = {
   'fcn_score': score, 'fcn_feat': feat}
    if self.upsample_rate != 1:
        output = F.interpolate(score, None, self.upsample_rate, mode='bilinear', align_corners=False)
        ret.update({
   'fcn_output': output})
    if roi is not None:  # 文章中提到的RoI Loss
        # 输出的大小与mask rcnn实例分割头的结果一致【28,28】
        roi_feat = self.roipool(feat, roi)  # 将特征在instance GT的指引下进行特征图crop
        roi_score = self.score(roi_feat)  # 使用共享的预测头进行结果预测
        ret.update({
   'fcn_roi_score': roi_score})

    return ret

2.2 全景分割头

语义分割的结果表示为 X X X,其对应的输出channel数量为 N s t u f f + N t h i n g N_{stuff}+N_{thing} Nstuf

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值