UPSNet总体结构如下图所示,包含RPN、PymaridMaskTarget生成、Semantic Segmentatin Head、Instance Segmentation Head和Panoptic Segmentation Head。
特征的提取采用ResNet后接FPN,FPN的使用充分利用了不同level特征。简图和详细的结构图如下。ResNet每个block的输出(记为 [ M a t h P r o c e s s i n g E r r o r ] P 2 P 2 [Math Processing Error]P2 P_2 [MathProcessingError]P2P2P5通过一个步长为2,size为1*1的最大池化得到。
整个模块的输出为:
分支名称 | channel数 | H | W |
---|---|---|---|
[ M a t h P r o c e s s i n g E r r o r ] F P N P 2 F P N _ P 2 [Math Processing Error]FPN_P2 FPN\_P_2 [MathProcessingError]FPNP2FPN_P23∗H/i2∗W/i2个anchors
Created with Raphaël 2.2.0 FPN-Pi generate anchors(3*(H/2^i)*(W/2^i), 4) sort(score top N1) adjust bbox NMS(Post top N2) Proposals_i
该层的输出为ndarray, shape=(2000, 5),第二维的第一位是batch_inx,由于batchsize为1,因此第一位都为0. 3.2 PyramidMaskTarget该层同样不包含训练参数,两个主要函数add_proposals,sample_rios.
通过计算RPN产生的2000个proposals和gt box的重叠比例,修改一字段的值。
sample_rois:
4. Sementic Segmentation Head4.1 FCN-HeadFCN-Head即用于生成语义分割的分支。承接FPN的四个分支,每个分支分别经过可变卷积,而后同一scale到H/4、W/4,concat之后再卷积得到每个像素点的在19个类别上的概率。同时计算gt-roi mask内每个像素点的在19个类别上的概率。源码及结构如下:
|
RCNN分支用于预测512个rois(前后景)的类别和边框
本模块的作用是取出mask分支中每个检测到实例的logit
如下图所示.
panoptic logits 由三项组成,语义分割部分seg-logits、实例分割部分inst_logits、和未知类预测部分void-logits。其中未知类是由gt-box中随机选出30%作为未知的类别,在本文所用的例子中,原本gt-box共有8个,现在有三个b-box被归为未知类.
void-logits
void-logits根据语义分割实例类部分logits(8,H/4,W/4)最大值减去5个b-box的logits(5,H/4,W/4)的最大值,得到(1, H/4, W/4).void-logits的计算代码如下:
void_logits = torch.max(fcn_output['fcn_score'][:, (config.dataset.num_seg_classes - config.dataset.num_classes + 1):, ...], dim=1, keepdim=True)[0] - torch.max(seg_inst_logits, dim=1, keepdim=True)[0]
inst-logits
inst-logtis则是将MaskTerm和SegTerm得到的mask-logits和seg-ins-logits直接相加。综合了两部分的预测,相当于做了一个模型融合。
inst_logits = seg_inst_logits + mask_logits
seg-logits
seg-logits则是语义分割部分stuffs部分的logtis
panoptic-logits
panoptic-logots直接将三个部分concat在一起。shape=(17, H/4, W/4), 17=11+5+1
panoptic_logits = torch.cat([seg_logits, inst_logits, void_logits], dim=1)