非极大值抑制-NMS

NMS非极大值抑制 NMS非极大值抑制的功能: 筛选出一定区域内、属于同一种类、得分最大的框。 每个grid cell包含2个bounding box(每个bounding box包含4个box位置坐标和1个box置信度) 和20个类别的条件概率。 将box置信度和20个类别的条件概率分别相乘,得到一个全概率(20*1)。 因此每个bounding box有一个全概率,1个grid cell有2个全概率,总共输出有7*7*2=98个全概率 此图摘自:YOLOv1 前向推断后处理——NMS非极大值抑制_我的博客-. 阅读详情

在目标检测任务中,滑动窗口经过特征提取和分类器识别后,每个窗口会得到一个分数,但滑动窗口胡导致很多窗口之间存在较大交叉重叠的情况,使用NMS可以选取在相邻区域相互交叉但得分最高的候选框,剔除那些得分低的候选框。

检测之后的候选框集合用B表示,每个候选框的置信度用S表示,IOU阈值设置为T,NMS的实现步骤可以总结为:

1.在候选框集合B中选择具有最大置信度S的候选框M

2.将M从候选框集合B中移除,并加入到最终的检测结果D中

3.将B中剩余候选框和M进行IOU计算,从B中剔除IOU值大于阈值T的候选框

4.重复上面的步骤,直到候选框集合B为空

# --------------------------------------------------------
# Fast R-CNN
# Copyright (c) 2015 Microsoft
# Licensed under The MIT License [see LICENSE for details]
# Written by Ross Girshick
# --------------------------------------------------------

import numpy as np

def py_cpu_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)
    #按照score置信度降序排序
    order = scores.argsort()[::-1]
    #保留的结果框集合
    keep = []
    while order.size > 0:
        i = order[0]
        #保留该类剩余box中得分最高的一个
        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:]])
	    #计算相交的面积,不重叠时面积为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)
		# 保留IoU小于阈值的box
        inds = np.where(ovr <= thresh)[0]
        # 因为ovr数组的长度比order数组少一个,所以这里要将所有下标后移一位
        order = order[inds + 1]

	return keep

soft-nms

def cpu_soft_nms(np.ndarray[float, ndim=2] boxes, float sigma=0.5, float Nt=0.3, float threshold=0.001, unsigned int method=0):
    cdef unsigned int N = boxes.shape[0]
    cdef float iw, ih, box_area
    cdef float ua
    cdef int pos = 0
    cdef float maxscore = 0
    cdef int maxpos = 0
    cdef float x1,x2,y1,y2,tx1,tx2,ty1,ty2,ts,area,weight,ov

    for i in range(N):
        maxscore = boxes[i, 4]
        maxpos = i

        tx1 = boxes[i,0]
        ty1 = boxes[i,1]
        tx2 = boxes[i,2]
        ty2 = boxes[i,3]
        ts = boxes[i,4]

        pos = i + 1
    # get max box
        while pos < N:
            if maxscore < boxes[pos, 4]:
                maxscore = boxes[pos, 4]
                maxpos = pos
            pos = pos + 1

    # add max box as a detection
        boxes[i,0] = boxes[maxpos,0]
        boxes[i,1] = boxes[maxpos,1]
        boxes[i,2] = boxes[maxpos,2]
        boxes[i,3] = boxes[maxpos,3]
        boxes[i,4] = boxes[maxpos,4]

    # swap ith box with position of max box
        boxes[maxpos,0] = tx1
        boxes[maxpos,1] = ty1
        boxes[maxpos,2] = tx2
        boxes[maxpos,3] = ty2
        boxes[maxpos,4] = ts

        tx1 = boxes[i,0]
        ty1 = boxes[i,1]
        tx2 = boxes[i,2]
        ty2 = boxes[i,3]
        ts = boxes[i,4]

        pos = i + 1
    # NMS iterations, note that N changes if detection boxes fall below threshold
        while pos < N:
            x1 = boxes[pos, 0]
            y1 = boxes[pos, 1]
            x2 = boxes[pos, 2]
            y2 = boxes[pos, 3]
            s = boxes[pos, 4]

            area = (x2 - x1 + 1) * (y2 - y1 + 1)
            iw = (min(tx2, x2) - max(tx1, x1) + 1)
            if iw > 0:
                ih = (min(ty2, y2) - max(ty1, y1) + 1)
                if ih > 0:
                    ua = float((tx2 - tx1 + 1) * (ty2 - ty1 + 1) + area - iw * ih)
                    ov = iw * ih / ua #iou between max box and detection box

                    if method == 1: # linear
                        if ov > Nt:
                            weight = 1 - ov
                        else:
                            weight = 1
                    elif method == 2: # gaussian
                        weight = np.exp(-(ov * ov)/sigma)
                    else: # original NMS
                        if ov > Nt:
                            weight = 0
                        else:
                            weight = 1

                    boxes[pos, 4] = weight*boxes[pos, 4]

            # if box score falls below threshold, discard the box by swapping with last box
            # update N
                    if boxes[pos, 4] < threshold:
                        boxes[pos,0] = boxes[N-1, 0]
                        boxes[pos,1] = boxes[N-1, 1]
                        boxes[pos,2] = boxes[N-1, 2]
                        boxes[pos,3] = boxes[N-1, 3]
                        boxes[pos,4] = boxes[N-1, 4]
                        N = N - 1
                        pos = pos - 1

            pos = pos + 1

    keep = [i for i in range(N)]
    return keep

 

目标检测——NMS非极大值抑制(原理+代码) 非极大值抑制(NMS),顾名思义就是抑制不是最大值的元素,在目标检测当中,就是提取置信度高的目标检测框,而抑制置信度低的框。一般来说,在模型输出到目标框的时候,目标框会非常多,其中有很多重复的框会定位到同一个目标上,NMS用来筛选掉多余的框,来获得真正的目标框。如下图,YOLOv1中使用到的NMS的过程,在模型预测后,会产生很多的框,经过NMS的处理,最后显示出的效果就非常的好。 阅读详情

相关推荐

NMS 非极大值抑制的原理与C++代码实现

原理:对于Bounding Box的列表B及其对应的置信度S,选择具有最大score的检测框M,将其从B集合中移除并加入到最终的检测结果D中.通常将B中剩余检测框中与M的IoU大于阈值Nt的框从B中移除.重复这个过程,直到B为空实现过程:就像上面的图片一样,定位一个车辆,最后算法就找出了一堆的方框,我们需要判别哪些矩形框是没用的。非极大值抑制:先假设有6个候选框,根据分类器类别分类概率做排序,从小...

krais_wk的博客 7942

目标检测 YOLOv5 - 计算指标使用的坐标

flyfish版本:YOLOv5 6.2计算指标时 有两种框需要比较,一个是人为标注的正确的边框 target boxes,躺在数据集的文件中。另一个是模型检测出的结果包括的边框。

二分掌柜的 6640

NMS(非极大值抑制)算法详解与示例

nms的使用总结

baidu_35536188的博客 2万+

yolo 推理 nms

另外一个说明cv2绘制不了中文,但可以用其他包实现。

qq_27172615的博客 632

ECU-TEST笔记&使用技巧01

说明 1)所述均基于如下环境:ECU-TEST 8.0、Win10系统、NI Veristand 2018(HIL测试)。不排除因为版本及软件环境问题,所述方法不奏效或有更好的方法,欢迎交流,一起提高。 2)本博客以问答形式进行,所述问题均来自于实际测试(包括MIL、HIL测试)遇到的问题及需求,目的是提高测试效率和自动化测试序列的可维护性。 3)本博客尽量从测试方法及ECU-TEST原...

Eigrl的博客 1万+

hive sql每个用户的累积访问次数

我们有如下的用户访问数据 userId visitDate visitCount u01 2017/1/21 5 u02 2017/1/23 6 u03 2017/1/22 8 u04 2017/1/20 3 u01 2017/1/23 6 u01 2017/2/21 8 U02 2017/1/23 6 U01 2017/2/22 4 要求使用SQL...

weixin_39150719的博客 3480

Yolov5设置不同类别元素之间使用NMS非极大值抑制

Yolov5默认设置类间元素分别使用NMS,这样一来,会使得图像中的相近区域检测出多个类别目标。 如果想要所有的元素一起使用NMS,可以这样设置: 进入utils的general.py,在791行添加 进行类间NMS时 改为True后:...

一位安分的码农的博客 2328

疾病负担研究(GBD)介绍

今天我们来聊一聊第一个公共数据库——GBD数据库,全称叫做global burden of disease(全球疾病负担),该数据库每年都会更新,目前已经更新到GBD2019。 这里直接给大家贴出网址:Global Burden of Disease Study 2019 (GBD 2019) Data Resources | GHDx 上图中红色圈圈标识的就是数据库的数据获取界面的链接,大家直接点击即可. 数据的检索十分方便: Context下拉菜单中可以选择不同的选项,默认是caus

weixin_44240228的博客 1万+

Pytorch机器学习(八)—— YOLOV5中NMS非极大值抑制与DIOU-NMS等改进

Pytorch机器学习(八)—— YOLOV5中NMS非极大值抑制与DIOU-NMS等改进 文章目录 系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 在目标检测的预测阶段时,会输出许多候选的anchor box,其中有很多是明显重叠的预测边界框都围绕着同一个目标,这时候我就可以使用NMS来合并同一目标的类似边界框,或者说是保留这些边界框中最好的一个。 如果对IOU等知识不了解的可以看我上篇博客Pytorch机器学习(五

lzzzzzzm的博客 4万+

cdk&java | 分子sdf文件生成

sdf

ASKCOS博客 1089

【DRAM存储器二】Sense Amplifier

详述DRAM颗粒中感应放大器功能、电路结构、工作原理和操作波形

highman110的博客 7195

非极大值抑制(NMS)

非极大值抑制(NMS) 非极大值抑制顾名思义就是抑制不是极大值的元素,搜索局部的极大值。这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二是邻域的大小。这里不讨论通用的NMS算法,而是用于在目标检测中用于提取分数最高的窗口的。例如在行人检测中,滑动窗口经提取特征,经分类器分类识别后,每个窗口都会得到一个分数。但是滑动窗口会导致很多窗口与其他窗口存在包含或者大部分交叉的情况。这时就需

dawnminghuang的专栏 2万+

wireshark提取视频数据之RTP包中提取H264和H265

本文主要描述从wireshark包数据中提取出H264和H265裸流数据方法,裸流通过RTP封包方式发送,从抓包中直接提取视频流数据,进而进行流媒体问题定位

技术控的笔记 17万+

NMS——非极大值抑制

NMS(non maximum suppression),中文名非极大值抑制,在很多计算机视觉任务中都有广泛应用,如:边缘检测、目标检测等。这里主要以人脸检测中的应用为例,来说明NMS,并给出Matlab和C++示例程序。 人脸检测的一些概念(1) 绝大部分人脸检测器的核心是分类器,即给定一个尺寸固定图片,分类器判断是或者不是人脸;(2)将分类器进化为检测器的关键是:在原始图像上从多个尺度产生窗口,

shuzfan的专栏 13万+

AI大模型:(三)3.2 Spring AI实现Agent

SpringAI实现了流式对话功能,通过与Ollama模型集成完成前后端交互,当前版本存在thinking信息丢失问题。系统支持两种工具注册方式(方法注解和函数式),并内置时间工具类展示外部工具调用能力。记忆功能提供多种存储方案(内存、JDBC、NoSQL等),实现跨对话轮次的上下文保持。MCP协议集成方面,服务端实现计算和业务查询工具,客户端支持12306及自定义业务系统接入。完整演示了流式对话、工具调用与记忆功能的综合应用。该实践构建了具备复杂交互能力的AI系统,同时指出生产环境需关注的安全与优化问题。

haylee的专栏 1007

基于 51 单片机的智能手势控制小车设计与实现

智能手势控制小车以STC89C52RC 单片机为控制核心,通过手势识别模块采集用户手势指令,经单片机处理后驱动电机执行前进、后退、左转、右转等动作。该项目融合了传感器技术、单片机编程和电机驱动技术,具有成本低、易实现、互动性强的特点,适合作为嵌入式系统入门实践案例。本项目成功实现了基于 51 单片机的智能手势控制小车,通过 APDS-9960 模块采集手势信号,经单片机处理后驱动电机完成基本动作,验证了 “传感器 + 单片机 + 执行器” 的嵌入式系统设计思路。

weixin_42300449的博客 177

非极大值抑制(nms)算法详解[python]

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

lz867422770的博客 2万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

NMS(非极大值抑制)

非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素。例如在行人检测中,滑动窗口经特征提取,经分类器分类识别后,每个窗口都会得到一个分数。但是滑动窗口会导致很多窗口与其他窗口存在包含或者大部分交叉的情况。这时就需要用到NMS来选取那些邻域里分数最高(是行人的概率最大),并且抑制那些分数低的窗口。 NMS在计算机视觉领域有着非常重要的应用,如视频目标跟踪、数据挖掘、3D重建、目标识别以及纹理分析等 。 在目标检测中,NMS的目的就是要去除冗余的检测框,保留

m0_56192771的博客 4695

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

深入浅出之非极大值抑制(NMS)

非极大值抑制(Non-Maximum Suppression, NMS)首次在论文“Efficient non-maximum suppression”中被提出,主要是为了解决在目标检测任务中,同一目标被多个检测器多次检测到,导致出现多个相交或重叠的候选框的问题。这些冗余的候选框不仅增加了计算负担,还降低了目标检测的精度。Non-Maximum Suppression的翻译是非“”抑制,而不是非“最大值”抑制。。

浩瀚之水的专栏 3891

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

NMS(非极大值抑制)

近段时间一直在看multi-person pose estimation,在最后有一个剔除候选keypoint的过程,该过程采用的NMS方法。但我一直对NMS不理解,经过查找资料,整理出本人对NMS的理解内容,如有不对请指出。 在引进NMS概念之前我们先介绍IOU(交并比),因为在NMS中选出框图起到至关重要的作用 1、IOU(交并比) 物体检测需要定位出物体的bounding box,就像上面的图片一样,我们不仅要定位出车辆的bounding...

邹小驴 4万+

一文打尽各种nms非极大值抑制

NMS(非极大抑制) 1.传统NMS(非极大抑制) ​ NMS即non maximum suppression即非极大抑制,顾名思义就是抑制不是极大值的元素,搜索局部的极大值。在最近几年常见的物体检测算法(包括rcnn、sppnet、fast-rcnn、faster-rcnn等)中,最终都会从一张图片中找出很多个可能是物体的矩形框,然后为每个矩形框为做类别分类概率。 ​ 以目标检测为例:目标检测的过程中在同一目标的位置上会产生大量的候选框,这些候选框相互之间可能会有重叠,此时我们需要利用非极大值抑制找到最佳

Peterwatwec的博客 2435

【YOLO v4 相关理论】常见的非极大值抑制方法:(Hard) NMS、Soft NMS、DIoU NMS

一、NMS 1.1、IoU IoU(Intersection over Union),也就是我们常说的交并比。简单来说IOU就是用来度量目标检测中预测框与真实框的重叠程度。 IoU公式:IoU=∣A⋂B∣∣A⋃B∣IoU = {|A\bigcap B|\over |A\bigcup B|}IoU=∣A⋃B∣∣A⋂B∣​ 显而易见,IOU的值越高也说明A框与B框重合程度越高,代表模型预测越准确。反之,IOU越低模型性能越差。 1.2、NMS算法流程 1. 先对网络预测出的所有边界框按分数(属于某个种类的概率

qq_38253797的博客 9737

【有啥问啥】复习一下什么是NMS(非极大值抑制)?

NMS作为目标检测算法中的重要后处理步骤,对于提高检测准确性和效率具有重要意义。通过深入理解NMS的工作原理和代码实现,我们可以更好地掌握目标检测算法的整个流程。同时,了解NMS的改进和优化方法,也有助于我们进一步提升目标检测模型的性能。在未来的研究中,我们可以继续探索NMS的新方法和新技术,以推动目标检测领域的发展。

Chauvin的博客 3245

非极大值抑制算法hard-NMS与soft-NMS

前言 非极大值抑制算法(Non-maximum suppression, NMS)是有anchor系列目标检测的标配,如今大部分的One-Stage和Two-Stage算法在推断(Inference)阶段都使用了NMS作为网络的最后一层,例如YOLOv3、SSD、Faster-RCNN等。 当然NMS在目前最新的anchor-free目标检测算法中(CornerNet、CenterNet等)并...

华仔的博客 2741

【目标检测】 非极大值抑制—NMS

在目标检测任务中,一个目标可能会被多个边界框检测到,这些边界框可能会有不同的位置和大小,但表示同一个目标。)非极大值抑制是一种常用的方法,用于抑制这些重叠的边界框,只保留置信度最高的那个边界框,从而得到最终的目标检测结果。

qq_43456016的博客 8132

非极大值抑制(NMS)及其变种实现

文章目录非极大值抑制(NMS)及其变种实现NMS各大变种标准NMS局部感知NMS(LNMS)倾斜NMS(INMS)多边形NMS(PNMS)掩膜NMS(MNMS)总结Soft-NMSMotivationMethod 非极大值抑制(NMS)及其变种实现 NMS(Non Maximum Suppression),又名非极大值抑制,是目标检测框架中的后处理模块,主要用于删除高度冗余的bbox,先用图示直观...

xu_fu_yong的专栏 5931
上一篇: yolo fastest中get_actual_detections函数作用及thresh的意义
下一篇: YOLO中letterbox_image相关解释
GeneralJing
博客等级 码龄15年 17粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值