SOFT NMS

论文:Improving Object Detection With One Line of Code

Github:https://github.com/bharatsingh430/soft-nms

 

ICCV 2017

 

Hard nms VS soft nms:

B:候选框

S:候选框得分score,和B一一对应。

D:最终的输出候选框结果

Nt:IOU阈值

M:当前循环中得分最高的候选框

 

Hard nms和soft nms的区别就在于红色框和绿色框的区别。

Hard nms直接将IOU得分大于预设阈值的候选框去掉。而soft nms没有去掉该候选框,而是将该候选框的得分score基于函数f进行了降低。其中函数f是一个和iou相关的函数。

 

物体检测中,边框提取流程:

Hard nms

正常的nms当框之间的IOU阈值大于Nt时,就会将score分数较低的候选框去掉,也就是将其得分score置为0。而对于候选框之间IOU下雨阈值Nt时,不做任何处理,保持原始的阈值si。

 

Soft nms:

soft nms的思想,就是要降低IOU大于阈值Nt的候选框的得分score,而不是将其去掉。这样很自然的想到上面的公式。

当框框之间IOU小于阈值Nt时候,不做处理,大于阈值Nt的时候,将得分score si和(1-iou)相乘,得到处理后的得分。由于1-iou介于0-1之间,这样就实现了高IOU候选框得分得到降低操作。

但是这样会引入一些问题,

  1. 该soft nms函数是一个分段函数,而不是一个连续的函数。
  2. 只对大于IOU阈值的候选框得分进行缩小,容易产生最终所有候选框得分的断层。

 

为了解决上面的问题,提出了下面的处理方法,后续实现都是基于下面的方法。

上面的式子,类似高斯惩罚函数。

根据指数函数的小于0区间段可以看出,该函数实现了对于所有的候选框的得分score的缩小。对于IOU越大的候选框得分,惩罚的越大,而对于IOU很小的候选框得分惩罚的较少。

 

代码实现:

hard nms:

def hard_nms(box_scores, iou_threshold, top_k=-1, candidate_size=200):
    """

    Args:
        box_scores (N, 5): boxes in corner-form and probabilities.
        iou_threshold: intersection over union threshold.
        top_k: keep top_k results. If k <= 0, keep all the results.
        candidate_size: only consider the candidates with the highest scores.
    Returns:
         picked: a list of indexes of the kept boxes
    """
    scores = box_scores[:, -1]
    boxes = box_scores[:, :-1]
    picked = []
    _, indexes = scores.sort(descending=True)
    indexes = indexes[:candidate_size]
    while len(indexes) > 0:
        current = indexes[0]
        picked.append(current.item())
        if 0 < top_k == len(picked) or len(indexes) == 1:
            break
        current_box = boxes[current, :]
        indexes = indexes[1:]
        rest_boxes = boxes[indexes, :]
        iou = iou_of(
            rest_boxes,
            current_box.unsqueeze(0),
        )
        indexes = indexes[iou <= iou_threshold]

return box_scores[picked, :]

soft nms:

def soft_nms(box_scores, score_threshold, sigma=0.5, top_k=-1):
    """Soft NMS implementation.

    References:
        https://arxiv.org/abs/1704.04503
        https://github.com/facebookresearch/Detectron/blob/master/detectron/utils/cython_nms.pyx

    Args:
        box_scores (N, 5): boxes in corner-form and probabilities.
        score_threshold: boxes with scores less than value are not considered.
        sigma: the parameter in score re-computation.
            scores[i] = scores[i] * exp(-(iou_i)^2 / simga)
        top_k: keep top_k results. If k <= 0, keep all the results.
    Returns:
         picked_box_scores (K, 5): results of NMS.
    """
    picked_box_scores = []
    while box_scores.size(0) > 0:
        max_score_index = torch.argmax(box_scores[:, 4])
        cur_box_prob = torch.tensor(box_scores[max_score_index, :])
        picked_box_scores.append(cur_box_prob)
        if len(picked_box_scores) == top_k > 0 or box_scores.size(0) == 1:
            break
        cur_box = cur_box_prob[:-1]
        box_scores[max_score_index, :] = box_scores[-1, :]
        box_scores = box_scores[:-1, :]
        ious = iou_of(cur_box.unsqueeze(0), box_scores[:, :-1])
        box_scores[:, -1] = box_scores[:, -1] * torch.exp(-(ious * ious) / sigma)
        box_scores = box_scores[box_scores[:, -1] > score_threshold, :]
    if len(picked_box_scores) > 0:
        return torch.stack(picked_box_scores)
    else:
        return torch.tensor([])

 

实验结果:

 

总结;

(1)对于遮挡较大,密度较大的场合,优先使用soft nms,可以增加模型的准确性。

(2)在PASCAL VOC 2007数据集上,使用soft nms可以使得RFCN提升1.7%准确性,Faster-RCNN提升1.7%准确性。MS-COCO数据集上,RFCN提升1.3%准确性,Faster-RCNN提升1.1%准确性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值