弱监督实例分割BoxInst(只需要box标注即可实例分割)论文分享
【摘要】 写在前面这篇文章同样出自沈春华组,是今年看到的最亮眼的一篇文章,只使用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)