美文网首页
Numpy版本的NMS/Soft-NMS算法实现

Numpy版本的NMS/Soft-NMS算法实现

作者: LabVIEW_Python | 来源:发表于2022-04-05 17:13 被阅读0次

先放本文的范例代码:https://gitee.com/ppov-nuc/nms

什么是NMS算法?

NMS,全称:Non Max Suppression,是一种广泛用于目标标检测算法中,把最优边界框找出来的技术,即通过迭代的形式,不断的以最大得分的框去与其他框做IoU操作,并过滤那些IoU较大(即交集较大)的框

NMS算法作用 各种任务中的使用情况

NMS算法具体实现

  • 输入: 带有置信分数的候选框(Proposal boxes with corresponding confidence scores S)列表和重叠阈值(overlap threshold)
  • 输出: 最终保留的检测框.
    参考Ross Girshick大神的代码实现nms.py
# --------------------------------------------------------
# Fast R-CNN
# Copyright (c) 2015 Microsoft
# Licensed under The MIT License [see LICENSE for details]
# Written by Ross Girshick
# --------------------------------------------------------

import numpy as np
# dets:带有置信分数的候选框列表
# thresh: 重叠度阈值
def nms(dets, thresh):
    x1 = dets[:, 0] # 候选框x1
    y1 = dets[:, 1] # 候选框y1
    x2 = dets[:, 2] # 候选框x2
    y2 = dets[:, 3] # 候选框y2
    scores = dets[:, 4] # 候选框的置信分数

    areas = (x2 - x1 + 1) * (y2 - y1 + 1) # 候选框面积列表
    order = scores.argsort()[::-1] # 按候选框置信度,从大到小排列

    keep = [] # 最终保留的候选框列表
    while order.size > 0:
        i = order[0]
        keep.append(i) # 选出某一类中置信度最高的候选框BBox1
        xx1 = np.maximum(x1[i], x1[order[1:]])
        yy1 = np.maximum(y1[i], y1[order[1:]])
        xx2 = np.minimum(x2[i], x2[order[1:]])
        yy2 = np.minimum(y2[i], y2[order[1:]])

        w = np.maximum(0.0, xx2 - xx1 + 1)
        h = np.maximum(0.0, yy2 - yy1 + 1)
        inter = w * h
        ovr = inter / (areas[i] + areas[order[1:]] - inter) # 计算置信度最高的候选框与其余所有候选框的IOU

        inds = np.where(ovr <= thresh)[0] # 若IOU(BBox1, BBox2)>thresh,说明BBox2与BBox1重叠度比较大,需要抛弃。
        order = order[inds + 1]

    return keep
NMS的执行结果: NMS的执行结果

NMS缺点

  • NMS算法中的最大问题就是它将相邻检测框的分数均强制归零(即将重叠部分大于重叠阈值thresh的检测框移除)。在这种情况下,如果一个真实物体在重叠区域出现,则将导致对该物体的检测失败并降低了算法的平均检测率。
  • NMS的阈值也不太容易确定,设置过小会出现误删,设置过高又容易增大误检。

Soft-NMS算法

NMS算法是略显粗暴,因为NMS直接将删除所有IoU大于阈值的框。soft-NMS吸取了NMS的教训,在算法执行过程中不是简单的对IoU大于阈值的检测框删除,而是降低得分。算法流程同NMS相同,但是对原置信度得分使用函数运算,目标是降低置信度得分。

其优点:

  • Soft-NMS可以很方便地引入到object detection算法中,不需要重新训练原有的模型、代码容易实现,不增加计算量(计算量相比整个object detection算法可忽略)。并且很容易集成到目前所有使用NMS的目标检测算法。
  • Soft-NMS在训练中采用传统的NMS方法,仅在推断代码中实现soft-NMS。作者应该做过对比试验,在训练过程中采用soft-NMS没有显著提高。
  • NMS是Soft-NMS特殊形式,当得分重置函数采用二值化函数时,Soft-NMS和NMS是相同的。soft-NMS算法是一种更加通用的非最大抑制算法。


    source:Improving Object Detection With One Line of Code

所以:8 out of top 15 submissions used Soft-NMS in the COCO 2017 detection challenge!

Soft-NMS的执行结果: Soft-NMS的执行结果

参考资料:

  1. https://github.com/rbgirshick/fast-rcnn/blob/master/lib/utils/nms.py
  2. https://github.com/bharatsingh430/soft-nms
  3. https://github.com/DocF/Soft-NMS/blob/master/soft_nms.py
  4. https://github.com/DocF/Soft-NMS
  5. https://github.com/bharatsingh430/soft-nms

相关文章

网友评论

      本文标题:Numpy版本的NMS/Soft-NMS算法实现

      本文链接:https://www.haomeiwen.com/subject/nopksrtx.html