2019.04.08-2019.04.14论文阅读笔记
精读文献:
2019_CVPR_Xiong_UPSNet A Unified Panoptic Segmentation Network
PSPNet一作赵恒爽合作的一篇2019年CVPR文章,做全景分割的。
Introduction:
提出了Unified Panoptic Segmentation Network(UPSNet)用于解决最近提出的全景分割问题。
那么全景分割问题是什么?全景分割问题可以看做语义分割和实例分割的结合,对于可计数的目标称为things(行人,车辆),不仅要分割出目标所在的每个像素,同时还要区分每个实例;对于不可计数的区域称为stuff(如树、天空、建筑)只需要区分出其类别即可。
该文章的关键点我自己总结出来有如下几点:
- 构建新设计的实例分割网络头,使其参数量非常少且非常高效,进而不仅可以利用语义分割和实例分割分别输出的logits,同时可以将这个结构接在任意一个特征提取网络后面。
- 目前语义分割和实例分割之间存在conflicts(通篇文章没有看到conflicts具体是什么,但是看完之后感觉是想说语义分割和实例分割的效果好坏时会互相影响的,不是单纯的实例分割影响到实例分割的指标判断,语义分割影响语义分割的,而是有一种相互的影响在里面。本文后面是通过增加一个拒判类别来缓和的,感觉有点牵强)
- 另外一个就是目前全景分割的网络是没办法进行端到端训练的,使其结构能够端到端训练也算是本文的一个contribution
为什么要用语义分割和实例分割来共同完成这件事情呢?文章中给出了解答:既然两个任务都是要理解场景,那么共同的框架一定能够促进效果。
那么这个框架和以往的全景分割有什么不同?以前的方法都是两个独立的branch分别处理语义分割和实例分割,现在是设计的参数量极少的网络图,可以共用特征提取部份,使得两个任务之间信息可以交互(隐式建模,虽然是一种有效的手段但是感觉没什么novelty)。
而其中的语义分割网络头基于DCN,同时应用了FPN以利用多尺度信息。实例分割的网络头是基于Mask-RCNN的。又设计了一个全景分割的网络头,通过像素层面的分类,发现每张图片中有多少个类别(看上去有点像EncNet的思路?)全景分割网络头从前面两个网络头的输出中提取信息,并加入一个新的unknown的类别channel,说是可以缓和两者之间的矛盾(存疑)。
Related Work:
主要讲了关于语义分割,实例分割以及全景分割的内容。
其中在全景分割部份专门提到【17】,即Kaiming He的Paniptic Segmentation一文,在那篇文章中结构为,语义分割分支用PSPnet,全景分割分支用Mask-RCNN,然后加上了一些简单的启发性决策方法来判断一个像素是空还是stuff还是things。这篇文章也是本文重点比较对象(应该也是本文基础,在结构和做法上都挺像的),Kaiming He这篇文章对于things用bounding box来监督,对于stuff用图像级别标签来监督。
Architecture:
话不多说,上图:
整体结构就是一个FPN网络,然后分别接到语义分割网络头和实例分割网络头上,然后分别输出Semantic logits和Instance logits,然后输入全景分割网络头,给出最终结果。
网络结构很简单,关键之处在于每个网络头的设计,同时文章提到这些网络头都是lightweight head,所以如何减少参数来完成这件事情也是其中一个问题。
下面分别介绍每个网络组件。
Backbone:
特征提取用的是Mask-RCNN作为backbone。(ResNet+FPN)
Instance Segmentation Head:
跟mask-rcnn的设计一致,有一个边界框回归输出
Semantic Segmentation Head:
采用了deformable network的网络设计,经过FPN后,不同金字塔层级的特征图分别经过deformable convolution之后统一上采样到1/4的大小,然后经过1*1的卷积和softmax来预测语义类别。此外,为了增加针对于前景目标如行人的注意,额外添加了一个ROI loss。
在训练中,将GT的bounding box经过1*1的卷积之后将其resize到28*28,这是根据Mask-RCNN的方法来的。看了后面,有点奇怪为什么要搞成28*28的,不是会造成畸变吗?能不能不resize?
另外文章中提到,根据实验结果ROI loss是可以在不毁坏语义分割结果的情况下增进全景分割结果。
Panoptic Segmentation Head:
输入是两个网络头输出的logits,为H*W*(Nstuff+Nthing)的一个tensor,Nstuff指的是stuff的类别个数,Nthing是指的thing的类别个数
网络头结构如图:
Yi是第i个instance segmentation 的结果,Xthing和Xstuff是语义分割的结果图,最终得到右侧的一个tensor,其中每个channel都是一个置信度的图。Tensor通道数中,Nstuff代表stuff的类别数量,Ninst代表instance的数量,如果不考虑别的,一般做法就是直接在Ninst和Nstuff中取argmax就行了(同理语义分割也是这么做的)。
但是这个网络设计了额外的channel,用于表示unknown的类别,即拒判。那么为什么要拒判?文中解释是,如果一个类别被错判为了另一个类别,那么这个类别的FP就会增加,错判类别的FN就会减少。这两个都会影响到最终指标。(我一直也在想这个问题,既然预测错误或导致两个类别的指标都下降,为什么就不干脆拒绝预测呢?至少保持一个类别的指标不受影响。)
这个channel怎么得到的呢?相当于就是用所有的预测包含物体的区域,减去实际上存在物体的区域,就是判断错误的物体的区域,所以这些区域就作为另一个通道来一起添加到logits里面,然后有任意一个channel的置信度大于这个通道的值的时候,才会将其标签设置为那个类别,否则就是拒绝判断的类别。
Loss Function:
UPSNet一共8个loss,语义分割两个(一个全图交叉熵loss,一个像素级分类ROI loss),全景分割一个(基于全图的像素分类loss),RPN两个(分类和回归),实例分割三个(框分类,框回归,mask分割)。
此外,还要对于每个loss function之间有一个权衡,后面讨论了权衡策略不同导致的结果不同。
Experiment:
有一个问题没弄明白,因为前面说到了PQ、SQ、RQ计算公式如下:
为什么给出来的结果PQ和SQ乘RQ不相等?需要后面好好看看Kaiming He的原始文献。
COCO数据集上的结果:
在MS-COCO 2018 dev上的结果:
在cityscape上的结果,有意思的是在coco上预训练的效果还更好了,不知道为什么。
Ablation Study:
有趣的地方有以下几个,在第四行和第五行,stuff的PQ上升了,thing的PQ反而下降了,这样一来这个ROI loss的有效性还真的说不好了,ROI loss稍稍增强了stuff的分割效果(怎么没说thing还下降了)。文章中说ROIloss和unknown channel的加入能显著提升性能,是有问题的。这个结果不能够说明ROI loss的有效性。
最后三列特别高的是用GT算出来的结果,用以评估一下以后还能够做多少,做到怎么样的程度。并得出了一下结论:不完美的thing的PQ值代表我们Instance Seg还做得不够好,另外stuff的巨大增长代表semantic seg对于整体指标的重要性。