美文网首页
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