参考代码: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