弱监督实例分割BoxInst(只需要box标注即可实例分割)论文分享

举报
yd_270793839 发表于 2023/04/13 10:06:58 2023/04/13
【摘要】 写在前面这篇文章同样出自沈春华组,是今年看到的最亮眼的一篇文章,只使用box标注就可完成实例分割的训练。下图是只是用box训练的实例分割结果,感觉特别惊艳。 实例分割的标注成本太高,标注一个实例的mak可能长达一分钟左右,非常影响实例分割的实际应用,而标注一个box只需要几秒钟。用box标注训练实例分割模型,可以极大的减小标注成本,加快数据迭代速度。代码AdelaiDet论文BoxInst...

写在前面

这篇文章同样出自沈春华组,是今年看到的最亮眼的一篇文章,只使用box标注就可完成实例分割的训练。下图是只是用box训练的实例分割结果,感觉特别惊艳。 实例分割的标注成本太高,标注一个实例的mak可能长达一分钟左右,非常影响实例分割的实际应用,而标注一个box只需要几秒钟。用box标注训练实例分割模型,可以极大的减小标注成本,加快数据迭代速度。
代码AdelaiDet
论文BoxInst: High-Performance Instance Segmentation with Box Annotations

亮点

提出了一个即插即用的loss, 使得仅使用box的标注在COCO上就可达到mask标注的80%的实例分割性能(33.2 AP v.s 39.1 AP)。

思想

提出一种新的loss来替代传统实例分割中逐像素预测的方式。Boxinst将实例的mask预测分解为mask在x轴和y轴的投影预测,以及像素之间的一致性一致性预测。简单来说,就是约束box标注的投影与预测的mask在x轴和y轴的投影一致,相当于约束了mask的位置以及宽高。第二项约束一个区域内的类似像素趋于一致(论文中通过颜色相似性判断是否类似像素),这样通过box使得模型自监督的学习mask。

1、投影的loss


def compute_project_term(mask_scores, gt_bitmasks):
    mask_losses_y = dice_coefficient(
        mask_scores.max(dim=2, keepdim=True)[0],
        gt_bitmasks.max(dim=2, keepdim=True)[0]
    )
    mask_losses_x = dice_coefficient(
        mask_scores.max(dim=3, keepdim=True)[0],
        gt_bitmasks.max(dim=3, keepdim=True)[0]
    )
    return (mask_losses_x + mask_losses_y).mean()

def dice_coefficient(x, target):
    eps = 1e-5
    n_inst = x.size(0)
    x = x.reshape(n_inst, -1)
    target = target.reshape(n_inst, -1)
    intersection = (x * target).sum(dim=1)
    union = (x ** 2.0).sum(dim=1) + (target ** 2.0).sum(dim=1) + eps
    loss = 1. - (2 * intersection / union)
    return loss

2、像素一致性loss
判断像素一致性:c为像素

loss:

def compute_pairwise_term(mask_logits, pairwise_size, pairwise_dilation):
    assert mask_logits.dim() == 4

    log_fg_prob = F.logsigmoid(mask_logits)
    log_bg_prob = F.logsigmoid(-mask_logits)

    from adet.modeling.condinst.condinst import unfold_wo_center
    log_fg_prob_unfold = unfold_wo_center(
        log_fg_prob, kernel_size=pairwise_size,
        dilation=pairwise_dilation
    )
    log_bg_prob_unfold = unfold_wo_center(
        log_bg_prob, kernel_size=pairwise_size,
        dilation=pairwise_dilation
    )

    # the probability of making the same prediction = p_i * p_j + (1 - p_i) * (1 - p_j)
    # we compute the the probability in log space to avoid numerical instability
    log_same_fg_prob = log_fg_prob[:, :, None] + log_fg_prob_unfold
    log_same_bg_prob = log_bg_prob[:, :, None] + log_bg_prob_unfold

    max_ = torch.max(log_same_fg_prob, log_same_bg_prob)
    log_same_prob = torch.log(
        torch.exp(log_same_fg_prob - max_) +
        torch.exp(log_same_bg_prob - max_)
    ) + max_

    # loss = -log(prob)
    return -log_same_prob[:, 0]

实验结果

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。