《(DEXTR)Deep Extreme Cut:From Extreme Points to Object Segmentation》论文笔记

主页:dextr
参考代码:DEXTR-PyTorch

1. 概述

导读:这篇文章算是交互式分割种比较具有典型的了,在这篇文章中提出了一种使用极点作为引导,从而实现目标区域分割的方法。添加的引导不区分正负样本属性,只是去定义目标的边界,因而会在对应输入的卷积上添加1个channel就可以了。刚接触交互式分割的同学可以看看这篇文章,但是其也存在一些痛点问题。

文章的方法使用极点的形式作为引导,框出目标大致出现的位置,从而进行分割,其在一些图片上的结果见下图所示:
在这里插入图片描述
但是这样的方法在实际的过程中却存在下面的一些不足:

  • 1)极点在选择的时候也是很费劲的,需要去贴合目标的边界;
  • 2)对于一些包含/形状奇异的目标交互起来困难;
  • 3)文章虽然给出了使用额外第五个点的策略,但是整体上样本并不区分正负,妨碍交互式分割精度更进一步提升;

2. 方法设计

2.1 方法的pipline

文章的pipline比较简单,与传统的分割网络没有太大的差别,其使用的是ResNet-101(ImageNet Pretrained),之后添加PSP模块和解码单元,从而实现目标像素点的预测。其整体结构见下图所示:
在这里插入图片描述
文章的方法在输入进网络的时候会在裕度范围对目标进行剪裁,之后送入到网络进行预测。由于剪裁之后正负样本像素的比例变得异常,因而文章在原始交叉上的基础上给类别添加平衡因子,从而得到Balanced Cross Entropy Loss,为:
L = ∑ j ∈ Y w y j C ( y j , y j ^ ) L=\sum_{j\in Y}w_{y_j}C(y_j,\hat{y_j}) L=jYwyjC(yj,yj^)
此外,作为待分割目标引导的极点时通过下面的方式进行计算的:

def extreme_points(mask, pert):
    def find_point(id_x, id_y, ids):
        sel_id = ids[0][random.randint(0, len(ids[0]) - 1)]
        return [id_x[sel_id], id_y[sel_id]]

    # List of coordinates of the mask
    inds_y, inds_x = np.where(mask > 0.5)

    # Find extreme points
    return np.array([find_point(inds_x, inds_y, np.where(inds_x <= np.min(inds_x)+pert)), # left
                     find_point(inds_x, inds_y, np.where(inds_x >= np.max(inds_x)-pert)), # right
                     find_point(inds_x, inds_y, np.where(inds_y <= np.min(inds_y)+pert)), # top
                     find_point(inds_x, inds_y, np.where(inds_y >= np.max(inds_y)-pert)) # bottom
                     ])

2.2 第五个点的策略

文章为了进一步提升分割的精度,在4个极点的基础上还通过IoU阈值判别的方式,在IoU性能表现不足的图像上采样错误最多的点,作为额外的引导,但是这部分代码是在文章Git仓库里面是没有的,参考:issue-34。虽然有点鸡肋,但是按照文章给出的实验结果还是有点作用的:
在这里插入图片描述

3. 实验结果

文章中各个改动的点对性能的影响:
在这里插入图片描述
文章方法与其它方法的性能比较:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m_buddy/article/details/115336931