非极大抑制原理及代码实现

NMS(非极大抑制)

常常用在目标检测,因为一个目标会有很多预测bounding box,但是我们希望最后只留下一个。

步骤为:
① 按照置信度将所有的bounding box排序(在此之前应将置信度低于置信度阈值的框直接删除)
② 将置信度最高的取出作为一个输出,同时将其与其他所有bounding box计算IoU,当IoU高于某个阈值时将其从备选框中删掉
③ 重复②操作,直到备选框中为空

IoU阈值的选取是一个难点,如果阈值选取过大则会有好多框删不掉,如果阈值设置过小则会将有重合的其他目标删除。所以当有很多物体挨得很近时,NMS的效果不是很好。这时候可以采用soft-NMS,soft-NMS不会将目标直接从备选集合中删除,而是采用一个惩罚函数将其置信度降低,惩罚函数可以选择线性函数或高斯函数,IoU越大则置信度降的越低。

import  numpy as np


def my_nms(dets, thresh):
    x1 = dets[:, 0]
    y1 = dets[:, 1]
    x2 = dets[:, 2]
    y2 = dets[:, 3]
    score = dets[:, 4]
    areas = (x2 - x1 + 1) * (y2 - y1 + 1)
    order = np.argsort(score)[::-1]
    keep = []
    while order.size > 0:
        i = order[0]
        keep.append(i)
        # 交集的左上点
        com_x1 = np.maximum(x1[i], x1[order[1:]])
        com_y1 = np.maximum(y1[i], y1[order[1:]])
        # 交集的右下点
        com_x2 = np.maximum(x2[i], x2[order[1:]])
        com_y2 = np.maximum(y2[i], y2[order[1:]])
        # 面积
        com_area = (com_x2-com_x1+1)*(com_y2-com_y1+1)
        # 与其他bbx的iou
        iou = com_area / (areas[i] + areas[order[1:]]-com_area)
        index = np.where(iou<thresh)[0]
        order = order[index+1]

    return keep


regions = np.array([[10, 10, 20, 20, 0.9], [15, 15, 20, 20, 0.8],
                    [25, 25, 50, 50, 0.8], [30, 30, 50, 50, 0.7]])
keep = my_nms(regions, 0.2)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值