经典NMS算法详解

2023-11-02

简介

在这里插入图片描述

目标检测在使用了基于深度学习的端到端模型后效果斐然。目前,常用的目标检测算法,无论是One-stage的SSD系列算法、YOLO系列算法还是Two-stage的基于RCNN系列的算法,非极大值抑制都是其中必不可少的一个组件。在现有的基于anchor的目标检测算法中,都会产生数量巨大的候选矩形框,这些矩形框有很多是指向同一目标,因此就存在大量冗余的候选矩形框。非极大值抑制算法的目的正在于此,它可以消除多余的框,找到最佳的物体检测位置。

非极大值抑制(Non-Maximum Suppression,以下简称NMS算法)的思想是搜索局部极大值,抑制非极大值元素。

原理

IoU(Intersection over Union)为交并比,如图1所示,IoU相当于两个区域交叉的部分除以两个区域的并集部分得出的结果。图2是IoU为各个取值时的情况展示,一般来说,这个score > 0.5 就可以被认为一个不错的结果了。
在这里插入图片描述
经典NMS最初第一次应用到目标检测中是在RCNN算法中,其实现严格按照搜索局部极大值,抑制非极大值元素的思想来实现的,具体的实现步骤如下:

(1)设定目标框的置信度阈值,常用的阈值是0.5左右

(2)根据置信度降序排列候选框列表

(3)选取置信度最高的框A添加到输出列表,并将其从候选框列表中删除

(4)计算A与候选框列表中的所有框的IoU值,删除大于阈值的候选框

(5)重复上述过程,直到候选框列表为空,返回输出列表

代码

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
NMS function(Non-Maximum Suppression,  抑制不是极大值的元素)
        psedocode:
            1. choose the highest score element  a_1  in set B, add a_1 to the keep set C
            2. compute the IOU between the chosen element(such as a_1) and others elements in set B
            3. only keep the nums  at set B whose IOU value is less than thresholds (can be set as >=0.5), delete the nums similiar
                to a_1(the higher IOU it is , the more interseciton between a_1 and it will have)
            4. choose the highest score value a_2 left at set B  and add a_2 to set C
            5. repeat the 2-4 until  there is nothing in set B, while set C is the NMS value set

"""
import numpy as np
# boxes表示人脸框的xywh4点坐标+相关置信度
boxes = np.array([[100, 100, 210, 210, 0.72],
                  [250, 250, 420, 420, 0.8],
                  [220, 220, 320, 330, 0.92],
                  [100, 100, 210, 210, 0.72],
                  [230, 240, 325, 330, 0.81],
                  [220, 230, 315, 340, 0.9]])


def py_cpu_nms(dets, thresh):
    # dets:(m,5)  thresh:scaler

    x1 = dets[:, 0]
    y1 = dets[:, 1]
    x2 = dets[:, 2]
    y2 = dets[:, 3]

    areas = (y2 - y1 + 1) * (x2 - x1 + 1)
    scores = dets[:, 4]
    keep = []
    # index表示按照scores从高到底的相关box的序列号
    index = scores.argsort()[::-1]

    while index.size > 0:
        print("sorted index of boxes according to scores", index)
        # 选择得分最高的score直接加入keep列表中
        i = index[0]
        keep.append(i)
        # 计算score最高的box和其他box分别的相关交集坐标
        x11 = np.maximum(x1[i], x1[index[1:]])
        y11 = np.maximum(y1[i], y1[index[1:]])
        x22 = np.minimum(x2[i], x2[index[1:]])
        y22 = np.minimum(y2[i], y2[index[1:]])

        print("x1 values by original order:", x1)
        print("x1 value by scores:", x1[index[:]])
        print("x11 value means  replacing the less value compared"\
              " with the value by the largest score :" , x11)
        # 计算交集面积
        w = np.maximum(0, x22 - x11 + 1)  # the weights of overlap
        h = np.maximum(0, y22 - y11 + 1)  # the height of overlap
        overlaps = w * h
        # 计算相关IOU值(交集面积/并集面积,表示边框重合程度,越大表示越相似,越该删除)
        ious = overlaps / (areas[i] + areas[index[1:]] - overlaps)
        # 只保留iou小于阈值的索引号,重复上步
        idx = np.where(ious <= thresh)[0]
        # 因为第一步index[0]已经被划走,所以需要原来的索引号需要多加一
        index = index[idx + 1]

    return keep


import matplotlib.pyplot as plt


def plot_bbox(dets, c='k', title_name="title"):
    x1 = dets[:, 0]
    y1 = dets[:, 1]
    x2 = dets[:, 2]
    y2 = dets[:, 3]

    plt.plot([x1, x2], [y1, y1], c)
    plt.plot([x1, x1], [y1, y2], c)
    plt.plot([x1, x2], [y2, y2], c)
    plt.plot([x2, x2], [y1, y2], c)
    plt.title(title_name)

if __name__ == '__main__':
    plot_bbox(boxes, 'k', title_name="before nms")  # before nms
    plt.show()

    keep = py_cpu_nms(boxes, thresh=0.7)

    plot_bbox(boxes[keep], 'r', title_name="after_nme")  # after nms
    plt.show()

相关效果图

在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

经典NMS算法详解 的相关文章

随机推荐

  • git 速度很慢的解决办法 git慢

    原因 git clone特别慢是因为github global ssl fastly net域名被限制了 只要找到这个域名对应的ip地址 然后在hosts文件中加上ip即可解决 查询github com地址 https ipaddress
  • 华医网自动答题小脚本软件,并收集答案保存起来

    华医网的考试有不固定性 比如出现题的顺序不同 选择出现的位置不同 这次是A下次不一定就是 要注意2个地方 一个是题的选择一般最多是5个选择所有最多就循环5次选择 自动答题 先用列表把题目和选择都保存起来 提交答案后如果是错的就删除如果是对的
  • Java基础:Java接口和抽象类

    文章目录 一 抽象类 1 1概念 1 2抽象类的特点 二 接口 2 1概念 2 2特点 2 3接口格式 2 4接口实现 2 5接口的继承 2 6接口与类相似点 2 7接口与类的区别 2 8抽象类和接口的区别 三 标记接口 一 抽象类 1 1
  • 增大计算机字体,怎么调整电脑字体大小?

    腾讯视频 爱奇艺 优酷 外卖 充值4折起 小编整理了以下几种方法 一 点击开始 控制面板 在控制面板中选择外观和个性化 在外观和个性化中 选择放大或缩小文本和其他项目 在这里我们选择中等125 点击应用 弹出了对话框提示是否重启 我们点击稍
  • Matlab实现最优化(附上多个完整仿真源码)

    最优化是一种寻找最优解的数学方法 它在各个领域都有广泛的应用 在Matlab中 有多种工具箱和函数库可以用来实现最优化 下面我们来介绍一下如何用Matlab实现最优化 1 定义目标函数 在开始最优化之前 需要定义一个目标函数 目标函数是一个
  • CRC校验算法及C++程序实现

    CRC校验可以运用于传输数据过程中的验证 发送端发送有效数据时 先根据有效数据和生成多项式 比如CCITT标准的多项式是X16 X12 X5 1 计算出CRC校验码 把CRC校验码加到有效数据后面一起发送 当接收数据时 取出前面有效数据部分
  • 单点区域生长算法

    1 理论基础 区域生长算法的基本思想是将有相似性质的像素点合并到一起 对每一个区域要先指定一个种子点作为生长的起点 然后将种子点周围领域的像素点和种子点进行对比 将具有相似性质的点合并起来继续向外生长 直到没有满足条件的像素被包括进来为止
  • [问题解决]不使用PWM调速系统,彻底解决一个L298N带动两个电机却转速不同的问题...

    问题描述 由单片机的VCC引脚供电 使用L298N控制两个电机 发现左右两个轮子的转速老是不一样 更多的情况是左轮转速高 左轮电机接OUT1和OUT2 右轮转速低 右轮电机接OUT3和OUT4 甚至不转 需要用手戳一下才转 在这种情况下 如
  • 属性(property)与成员变量(ivar)有什么区别?

    property 的本质是什么 property ivar getter setter 下面解释下 属性 property 有两大概念 ivar 实例变量 存取方法 access method getter setter 属性 proper
  • 在flutter中连接mysql

    使用flutter连接mysql 在看本教程之前 请先确定你的flutter可以外部访问 另外附上如何设置mysql的权限的博客 可以先配置好 https www cnblogs com ys15 p 11405732 html 在flut
  • 基于区块链技术的展望:搭建商业银行供应链管理和供应链金融服务平台

    目录 1 供应链企业数字化转型发展进入快车道 1 1技术更迭促进供应链行业发展迅猛 1 2国内支付数字化助推供应链数字化转型 2 供应链企业数字变革仍然存在不确定性 2 1 线上线下渠道分割 运营管理效率较低 2 2资金回笼反馈时效性较差
  • AI大模型迈入应用时代,每日互动推动“可控大模型”落地

    垂直行业更需要可控大模型 当下 大模型正在不断精进 以GPT 4 文心一言为代表的大模型 LLM 表现出了强大的逻辑推理能力 并能够很好地处理复杂任务 使得社会生产力得到了飞跃式提升 面对大模型热度的持续狂飙 很多企业跃跃欲试 希望在发展和
  • mysql性能_SQL Server 与 MySQL 性能相差多大?

    关系数据库发展到了今天 已经非常的同质化 如果仅仅是除去上下文环境来单纯的讨论产品性能没有任何意义 既然环境相同 那一定是Windows环境下 相同的硬件 首先要考虑 需要面对何种类型的负载 需要支持的功能 兼容性等各种方面的原因 和楼上两
  • size mismatch for roi_heads.box_predictor.cls_score.weight: copying a param with shape torch.Size([9

    1 报错 RuntimeError Error s in loading state dict for FasterRCNN size mismatch for roi heads box predictor cls score weigh
  • python爬虫包含gui界面的完整版_爬虫-天气查询程序【GUI界面版】,Python交流,技术交流区,鱼C论坛 - Powered by Discuz!...

    import urllib request import gzip import json import easygui as g g msgbox 天气查询 def get weather data msg 请输入要查询的城市名称 tit
  • Springboot+CXF实现WebService的客户端和服务端示例

    服务端 package com xxx abc core application cxf import org apache cxf Bus import org apache cxf bus spring SpringBus import
  • 扩频时钟SSC技术,即展频

  • AssetBundle学习

    官方文档 AssetBundle 工作流程 Unity 手册 unity3d com 之前写的博客 AssetBundle学习 zaizai1007的博客 CSDN博客 使用流程图 1 指定资源的AssetBundle属性 xxxa xxx
  • Git的结构和使用

    提示 这篇文章用于增加对Git的理解和基本使用 一 Git是什么 Git是一个用于实现项目版本控制的版本控制器 通过仓库建立分支来实现对项目不同版本的存储和切换 从而能够实现版本的回溯和控制 二 关于Git的基本结构 Git大体上分为四个结
  • 经典NMS算法详解

    简介 目标检测在使用了基于深度学习的端到端模型后效果斐然 目前 常用的目标检测算法 无论是One stage的SSD系列算法 YOLO系列算法还是Two stage的基于RCNN系列的算法 非极大值抑制都是其中必不可少的一个组件 在现有的基