【语义分割】PointRend

 本文记录了博主阅读ICCV2019一篇关于语义分割论文的笔记

论文题目:《PointRend: Image Segmentation as Rendering

原文地址:https://arxiv.org/abs/1912.08193

开源地址:https://github.com/zsef123/PointRend-PyTorch(第三方针对语义分割任务的复现)

附上自己组会做的ppt:链接:https://pan.baidu.com/s/1mM0FPLSbDqazsZqAb-D7pA  提取码:zl50

动机

  大多数现有的语义分割网络都是将图片放入网络中,首先进行编码,然后再想办法进行上采样,但是在进行decoder的时候,都会存在一个直接的4x~16x上采样操作,以deepv3plus为例,最后直接进行4x的上采样,而pspnet进行8x的上采样。那么仔细想想,分割是一个特别精细化的任务(尤其是边缘),直接进行这种大尺度的上采样是不是存在问题呢?而且直接这样上采样对我们的边缘会特别的不利。

【语义分割】PointRend_第1张图片

 

 【语义分割】PointRend_第2张图片

 

    然后我们再从采样的角度理解语义分割这个任务,现有的网络都是对图片进行均匀划分,每个像素点相当于一个采样点,然后使用分割算法,对采样点进行分类。但是,我们都知道图片中存在低频(相对平滑,颜色变化小)和高频区域(变化明显,物体边缘),对于低频区域来说,大概率属于某一类,我们是不是不用采样过多的点,而针对高频区域来说,如果采样的点太过稀疏,最终可能导致分割出来的物体边界过于平滑,不太真实。因此,我们分割网络会存在一个问题,对平滑区域过采样,对边界欠采样。所以作者想到一个重要的思路:优化采样方法。而类似的问题在图形学图像渲染中同样会遇到,它往往就是采样某种采样方式进行采样,例如,高频区域多采样、低频区域少采样。然后计算每个采样的像素值。借助这种思路,作者将分割问题看成一个类似渲染问题来处理,先通过一中合理的采样方式进行非均匀采样,计算出每个采样点的分割结果;然后再将结果映射到规则的grid里面。如下图所示,我们可以先看一下可视化的效果。

【语义分割】PointRend_第3张图片

 

 

 

方法

PointRend模块主要由如下三部分构成:
  1)点选择策略:选择少数的一些点(难点)进行预测,避免在高分辨率的输出中过量的计算所有的像素;
  2)point-wise特征表示:提取被选择出来的点的特征,这些的特征通过双线性插值计算,然后沿着通道维度编码子像素信息预测分割;
  3)point head:小的网络,进行预测。

 

点选择策略

  测试:选点工作主要是受图形学中adaptive subdivision的启发,adaptive subdivision的主要思想是通过只计算那些最可能与周围像素不同的点去高效的渲染图像,所有其他的位置,都通过插值的方法计算输出的值。每一步,我们迭代的渲染输出的mask,也就是需要经过一个coarse-to-fine的过程。coarse的预测是由分割的head得到的。在每次的迭代中,PointPend使用双线性插值上采样前一步分割预测结果,然后在这个更密集的特征图中选择N个最不确定的点,比方说概率接近0.5的点。然后计算这N个点的特征表示并且预测它们的lables。这个过程一直被重复,直到上采样到需要的大小。其中的一次迭代如下图所示:

【语义分割】PointRend_第4张图片

 

  对于M0xM0的输入,想要得到MxM的输出。PointRend要求不超过Nlog2(M/M0)个点的预测,这个值比MxM小的多,这样可以减少计算量。例如:M0=7,M=224,执行5部subdivision。选择N=28*28,PointRend仅仅会预测28*28*4.25个点(为什么是4.25,我也不太理解,感觉应该是5),比224*224的1/15还小。

  训练:训练过程中PointRend选择一些点然后重构他们的特征。原则上,选择策略与推理时应该一样,但是由于subdivision的操作是不可微的,没办法直接嵌入到具有BP的网络中训练,因此,训练过程中,使用基于随机采样的非迭代策略。在特征图上选择N个点(这里的N与推理时的N不同),它用来选择不确定的区域,同时保持一定程度的统一覆盖,使用如下三个原则:

  1)Over generation: 在均匀分布中随机采样over-generation kN个点候选点(k>1)

  2)Importance sampling: 重点关注着插值后kN个候选点中不确定的点并且对不确定性进行估计。在kN中选择βN个最不确定的点,β∈[0, 1]

  3)Coverage:剩下的(1-β)N个点从均匀分布采样

  训练的时候,预测值和损失函数仅仅在N个采样点上计算,更加高效比BP通过subdivide步骤。这个设计类似于Faster R-CNN中的 RPN+Fast R-CNN。

【语义分割】PointRend_第5张图片

 

 

 特征重建的Point-wise特征表示和进行预测的Point Head

  PointRend重建特征通过结合细粒度的特征和粗糙的预测概率。

  细粒度的特征:为了使得PointRend渲染好的分割细节,从特征图的每个采样点提取特征向量。因为一个点有一个2D的坐标系,在特征图上使用双线性插值计算特征向量。可以使用单尺度的特征图,仅仅只用resnet第2个残差块得到的特征图,也可以使用多尺度的特征图,同时使用resnet第2到第5个残差块的特征图。

  粗糙预测图:细粒度的特征可以加强细节信息,但是在两方面是不足的。第一,他们不能得到包含明确区域的信息, 并且因此两个实例的边界框重叠的点将具有相同的细粒度特征。因此,对于实例分割的任务,在区域可以预测同一点的不同标签,需要额外的区域特定信息。第二,由于细粒度的特征图可能仅仅包含一些low-level的信息。在这种情况下,具有更多上下文和语义信息的特征图是有帮助的。这个问题对实例分割和语义分割都有影响。基于上面这些考虑,第二个特征类型是一个粗糙的分割预测图(具有明确的上下文和语义信息),每个点有一个K为的向量表示K类的预测。粗糙预测图用来提供全局信息,然而通道传递语义类别。这些粗糙特征图与显存的结构相似,训练过程中被监督。对于实例分割任务而言,可以是Mask R-CNN mask head 7*7的输出,对于语义分割,可以是步长16的特征图。

  Point Head:给定每个选定点的point-wise特征表示,Head使用简单的多层感知机进行预测。在所有的点上MLP共享权重。类似于图卷积或者PointNet。

 

实验

实例分割(COCO和cityscapes上进行)

试验设置

              评价指标使用AP(3次试验的中值coco 5次试验的中值cityscapes)

    baseline:MaskR-CNN ResNet50 + FPN

    具体的试验设置请看如下表格:

    【语义分割】PointRend_第6张图片

             

       

试验结果:

【语义分割】PointRend_第7张图片

 

 【语义分割】PointRend_第8张图片

【语义分割】PointRend_第9张图片

 

 

【语义分割】PointRend_第10张图片

 【语义分割】PointRend_第11张图片

 

 

语义分割

试验设置

              数据集cityscapes

    评价指标miou(5次试验的中值)

              Baseline:semantic-FPN(resnet101)  Deeplabv3(resnet103) resnet103指的是将res101第一个7*7替换层3个3*3的残差网络,这个backbone在语义分割中经常会用到

             【语义分割】PointRend_第12张图片

试验结果【语义分割】PointRend_第13张图片

             【语义分割】PointRend_第14张图片

你可能感兴趣的:(【语义分割】PointRend)