非极大值抑制算法(NMS)及python实现

本文详细介绍了非极大值抑制(NMS)算法在目标检测中的应用,通过实例讲解了如何利用NMS算法去除冗余边框,保留最优检测结果。NMS算法是计算机视觉和深度学习领域中常用的技术,用于提高目标检测的准确性和效率。
部署运行你感兴趣的模型镜像

以下图为例,由于滑动窗口,同一个人可能有好几个框(每一个框都带有一个分类器得分)

è¿éåå¾çæè¿°

而我们的目标是一个人只保留一个最优的框:

于是我们就要用到非极大值抑制,来抑制那些冗余的框: 抑制的过程是一个迭代-遍历-消除的过程。

(1)将所有框的得分排序,选中最高分及其对应的框:

è¿éåå¾çæè¿°

(2)遍历其余的框,如果和当前最高分框的重叠面积(IOU)大于一定阈值,我们就将框删除。

è¿éåå¾çæè¿°

(3)从未处理的框中继续选一个得分最高的,重复上述过程。

è¿éåå¾çæè¿°

 

Python 代码:

# python3
import numpy as np

def py_nms(dets, thresh):
    """Pure Python NMS baseline."""
    #x1、y1、x2、y2、以及score赋值
    x1 = dets[:, 0]
    y1 = dets[:, 1]
    x2 = dets[:, 2]
    y2 = dets[:, 3]
    scores = dets[:, 4]

    #每一个候选框的面积
    areas = (x2 - x1 + 1) * (y2 - y1 + 1)
    #order是按照score降序排序的
    order = scores.argsort()[::-1]

    keep = []
    while order.size > 0:
        i = order[0]
        keep.append(i)
        #计算当前概率最大矩形框与其他矩形框的相交框的坐标,会用到numpy的broadcast机制,得到的是向量
        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或h算出来会是负数,用0代替
        w = np.maximum(0.0, xx2 - xx1 + 1)
        h = np.maximum(0.0, yy2 - yy1 + 1)
        inter = w * h
        #计算重叠度IOU:重叠面积/(面积1+面积2-重叠面积)
        ovr = inter / (areas[i] + areas[order[1:]] - inter)

        #找到重叠度不高于阈值的矩形框索引
        inds = np.where(ovr <= thresh)[0]
        #将order序列更新,由于前面得到的矩形框索引要比矩形框在原order序列中的索引小1,所以要把这个1加回来
        order = order[inds + 1]
    return keep

# test
if __name__ == "__main__":
    dets = np.array([[30, 20, 230, 200, 1], 
                     [50, 50, 260, 220, 0.9],
                     [210, 30, 420, 5, 0.8],
                     [430, 280, 460, 360, 0.7]])
    thresh = 0.35
    keep_dets = py_nms(dets, thresh)
    print(keep_dets)
    print(dets[keep_dets])
--------------------- 
作者:Blateyang 
来源:优快云 
原文:https://blog.youkuaiyun.com/Blateyang/article/details/79113030 
版权声明:本文为博主原创文章,转载请附上博文链接!

 


--------------------- 
作者:shuzfan 
来源:优快云 
原文:https://blog.youkuaiyun.com/shuzfan/article/details/52711706 
版权声明:本文为博主原创文章,转载请附上博文链接!

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

非极大值抑制(NMS算法的核心目标是从一组候选框中筛选出最优的检测结果,主要通过抑制重叠的、非极大值的候选框来实现去重或过滤。该算法在目标检测、边缘检测等领域广泛应用,其基本思想是通过比较候选框之间的重叠度(通常使用交并比IoU)和置信度得分,保留局部极大值的候选框并抑制其他重叠框。 ### NMS的基本工作流程 1. **计算得分排序**:首先,根据候选框的置信度得分对所有框进行排序,将得分最高的候选框作为当前最优框。 2. **计算交并比(IoU)**:对于当前最优框,计算其与其他候选框之间的交并比(IoU)。IoU的定义为两个框的交集面积除以它们的并集面积。 3. **过滤重叠框**:如果某个候选框与当前最优框的IoU超过预设的阈值,则认为该框与最优框重叠过多,将其从候选框列表中移除。 4. **迭代处理**:重复上述步骤,从剩余的候选框中再次选择得分最高的框,继续比较和过滤,直到所有候选框都被处理完毕。 ### NMS实现示例 以下是一个基于PythonNMS算法实现示例,用于对候选框进行过滤: ```python import numpy as np def nms(boxes, scores, threshold): """ 非极大值抑制算法实现 :param boxes: 候选框坐标,格式为[x1, y1, x2, y2] :param scores: 每个候选框的置信度得分 :param threshold: IoU阈值 :return: 保留的候选框索引 """ # 计算每个候选框的面积 x1 = boxes[:, 0] y1 = boxes[:, 1] x2 = boxes[:, 2] y2 = boxes[:, 3] areas = (x2 - x1 + 1) * (y2 - y1 + 1) # 按照得分排序 order = scores.argsort()[::-1] keep = [] while order.size > 0: i = order[0] keep.append(i) # 计算交集坐标 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 # 计算IoU ovr = inter / (areas[i] + areas[order[1:]] - inter) # 筛选IoU小于阈值的框 inds = np.where(ovr <= threshold)[0] order = order[inds + 1] return keep ``` ### NMS的变体 经典的NMS算法虽然简单有效,但在某些场景下可能存在不足。例如,当多个目标紧密相邻时,经典NMS可能会错误地抑制正确的候选框。因此,研究者提出了多种NMS的变体,包括: 1. **Soft-NMS**:通过逐渐降低重叠框的置信度得分,而不是直接移除它们,以缓解经典NMS的硬性过滤问题。 2. **IoU-Guided NMS**:根据IoU值动态调整抑制策略,提高检测精度。 3. **Cluster NMS**:将候选框聚类为多个组,然后在每组中应用NMS,以处理复杂场景中的目标检测问题。 ### NMS的应用场景 NMS算法广泛应用于目标检测任务中,例如YOLO、Faster R-CNN等模型的后处理阶段。在这些任务中,NMS能够有效减少重复检测,提升检测结果的准确性和简洁性。此外,NMS也被用于边缘检测和图像分割等任务中,以优化检测结果的后处理[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值