非极大值抑制-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

学习利用ce修改游戏生命参数

易语言代码 游戏的简陋界面 用ce查找存储这个1000即生命值的内存地址(得先附加到目标程序上,点击左上角那个电脑按钮) 看到有很多值为1000的,但哪个是生命值呢?真相只有一个 我们点击一下打我这个按钮,看下面的ce界面上地址为004A65C0处的值变了,所以这个就是我们要找的生命值 接下来我们对生命值进行修改,修改为99

zsd747289639的博客 5万+

UI-TARS本地部署

UI-TARS是一个用于本地部署的交互控制模型,支持桌面应用的自动化操作。部署步骤包括:首先,从官方GitHub仓库下载项目源码和模型checkpoint;其次,使用vLLM框架进行本地模型部署,启动API服务;最后,通过客户端调用API实现功能。部署过程中可能遇到pynvml模块或模型配置问题,提供了相应的解决方案。此外,还支持通过UI-TARS-Desktop客户端进行本地桌面应用的交互控制。整体流程旨在帮助用户快速实现UI-TARS的本地部署与应用。

DYF的博客 2531

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

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

一位安分的码农的博客 2328

基于MicroPython的ESP32与微信小程序MQTT通信实战

本文详细介绍了基于MicroPython的ESP32与微信小程序通过MQTT协议实现远程控制的完整实战方案。项目利用巴法云作为免费MQTT服务器,提供了从设备端编程、小程序开发到通信调试的全流程指南,帮助开发者快速构建低成本、易上手的物联网应用,如智能开关、传感器监控等。

week9的博客 632

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

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

lzzzzzzm的博客 4万+

从零开始用QP框架开发STM32:事件驱动编程实战指南(附状态机设计技巧)

本文详细介绍了如何使用QP框架在STM32上实现事件驱动编程,包括状态机设计技巧和嵌入式开发实践。通过对比传统前后台系统和RTOS,展示了QP框架在资源占用、实时性和代码可维护性方面的优势,并提供了从环境搭建到高级状态机设计的完整指南。

h6i7j8的博客 1173

Autosar代码包初识 2 - 如何编译Vector包内Demo工程

Vetcor autosar代码包Demo工程编译,GreenHills,RH850,Autosar,Davinci COnfigurator

weixin_42412049的博客 5184

非极大值抑制(NMS)

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

dawnminghuang的专栏 2万+

Coze实战:解锁多Bot协同与条件分支工作流的奥秘

本文详细介绍了在字节跳动Coze平台实现多Bot协同与条件分支工作流的方法。首先阐述了Coze平台的功能优势,包括丰富的插件、知识库和工作流功能。随后分步骤讲解了多Bot协同的实现:从准备工作、创建Bot到协同配置,并提供了电商客服的实例演示。在条件分支工作流部分,详细说明了条件节点的作用类型、条件设定方法以及具体配置操作,强调测试优化的重要性。最后通过电商平台综合案例,展示了多Bot协同与条件分支的实际应用效果,并针对常见问题提供解决方案。文章为开发者在Coze平台上构建智能应用提供了实用指导,有助于提升

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 449

NMS——非极大值抑制

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

shuzfan的专栏 13万+

Plecs电力电子仿真专业教程-第一季 补充课程 Plecs的安装教程与软件下载

PLECS4.1.64免安装版本–点我下载 Plecs.Standalone-3.7.2版本--关注加私信给我可以提供下载链接 补充课程 Plecs的安装教程与软件下载 详细介绍Plecs软件的安装过程

1万+

高通开发系列 - Camera之摄像头调试记录

记录一些调试内容

fulinux的博客 1215

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

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

lz867422770的博客 2万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

NMS(非极大值抑制)

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

m0_56192771的博客 4695

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

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

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

浩瀚之水的专栏 3891

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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、付费专栏及课程。

余额充值