代码地址:PointRend-PyTorch
1. 概述
导读:这篇文章致力于解决语义分割中的一个比较棘手的问题,那就是对于细节边界的回归上,这边文章采用了一种采样加单独回归的思路去完成这些困难分割部分的回归,也取得了较为不错的效果。这篇文章对此提出的模块叫做PointRend模块,主要就是包含了一个困难点采样与困难点的多层感知机(其中的参数还是共享的)标签回归。基于此的改进效果还是不错的见图1的右上角图。
在基于CNN的分割任务中一般是才去像素矩阵的形式表达分割目标与分割预测结果。尽管这样的表达方式很自然也很方便,但是对于分割任务来说就显得并不是很理想了。这是由于这样的表达方式对高频区域(边缘)并不是很友好,并且在边界与平滑区域上存在采样不均衡的问题。这样的结果就导致了在边界分割上效果不如意,具体可见图1的左上图。
2. 方法设计
2.1 模块原理结构
文章提出的PointRend模块原理见下图所示:
文章在生成的coarse prediction上去选择最具不确定性的点作为采样的点,之后在这些点对应的fine-grained feature上使用共享参数的多层感知机网络生成对应的预测结果。其中采样的策略是文章的重点,也是需要重点分析的。
文章提出的PointRend模块由3个主要的模块组成:
- 1)采样点选择策略,这里是选择(后面文中指出按照不确定性进行选择)一小部分真实的点去预测,从而避免采样多带来的计算量问题;
- 2)对于选中点逐点预测特征表达,对于每个被选中的点通过特征图上的4邻域可以计算得出真值,而且可以通过特征图通道中编码的亚像素信息进行预测;
- 3)基于点的预测头,采用小的神经网络(共享参数的多层感知机网络)去相互独立预测点的值;
2.2训练与预测阶段采样点的选择
对于采样点的核心思想是灵活且适当地在分割label上面选择采样点,这些采样点的位置应该在标注的高频部分密集出现,这也是训练与预测的时候采用的指导思想。
预测阶段
对于采样点的选择一个指导思想就是选择那些与周围邻域有较大差异概率的点(可以理解为边缘部分)。而在预测阶段文章会选择不确定性最大的
N
N
N个采样点(这些点的概率接近于0.5,不确定性最大),之后在PointRend中去预测这些点的标签,这样的步骤会持续到分割图上采样到原始大小。这一步的操作见图4所示:
这里对于采样点的数据文章做出了说明,假设输出的分辨率是
M
∗
M
M*M
M∗M,输入的分辨率是
M
0
∗
M
0
M_0*M_0
M0∗M0,那么最多的采样点数为
N
∗
l
o
g
2
M
M
0
N*log_2\frac{M}{M_0}
N∗log2M0M。
训练阶段
在训练阶段PointRend模块也需要去选择一些点,原则上其选择的策略与预测阶段的类似,但是由于其对梯度反传并不友好,在训练的时候采用的是基于随机采样的非迭代策略。
这里的采样策略在特征图中选择
N
N
N个采样点,这些点采样的时候被设置为偏向于选中特征图中的不确定性区域,并且同时保持一定程度的统一覆盖特性,具体的的准则为:
- 1)使用均匀分布采样的方式选择 k N , ( k > 1 ) kN,(k>1) kN,(k>1)个点;
- 2)在完成 k N kN kN个点的随机采样之后,按照不确定性有偏向性地从 k N kN kN个点中选择 β N , ( β ∈ [ 0 , 1 ] ) \beta N,(\beta \in[0,1]) βN,(β∈[0,1])个不确定的点;
- 3)剩下的 ( 1 − β ) N (1-\beta)N (1−β)N个点就均匀分布选择就好了;
具体参见图5所示:
3. 实验结果
Mask RCNN网络上:
Deeplab V3网络上: