深度学习之非极大值抑制NMS介绍

news2024/11/16 15:15:37

1. 基本介绍

        非极大值抑制(Non-Maximum Suppression,NMS)是深度学习中一种常用的目标检测算法,用于在检测结果中去除冗余的边界框。

        在目标检测任务中,通常会使用候选框(bounding boxes)来表示可能包含目标物体的区域。这些候选框是通过目标检测模型生成的,每个候选框都会伴随一个置信度分数,表示该候选框包含目标物体的概率。当候选框的数量较多时,简单地选择置信度最高的候选框可能会导致冗余和重叠的检测结果。NMS算法通过判断候选框之间的重叠程度,去除那些与已选择的候选框高度重叠的冗余框,从而提供更准确的目标检测结果。

        NMS的目标是从所有候选框中选择出最佳的、不重叠的候选框,以提供最准确的目标检测结果。

        NMS的核心思想是通过设定一个阈值来判断两个候选框是否重叠。常用的重叠度量是交并比(IoU),定义为两个候选框的交集面积除以它们的并集面积。当两个候选框的IoU大于设定的阈值时,认为它们重叠。

        在NMS算法中,通常会设定一个IoU阈值,例如0.5。算法的步骤如下:

        A. 按照置信度分数对所有候选框进行排序,从高到低。

        B. 选择置信度最高的候选框,并将其作为最终输出的一个检测结果。

        C. 计算该候选框与其他未处理的候选框的重叠区域的面积(可以使用交并比(Intersection over Union,IoU)来度量重叠程度)。

        D. 去除与已选择的候选框有较高重叠的候选框,以避免重复检测。

        E. 重复步骤2到4,直到所有候选框都被处理完毕。

        NMS算法保留了置信度最高的候选框,并通过去除与其重叠的其他候选框,消除了冗余的检测结果。通过调整IoU阈值,可以控制NMS的严格程度。较高的IoU阈值会保留更多的候选框,但可能导致冗余检测;较低的IoU阈值可以去除更多的冗余框,但可能会错过一些真实目标。

        NMS算法是目标检测领域中常用的后处理步骤,可应用于各种检测模型,如基于区域的卷积神经网络(Region-based Convolutional Neural Networks,R-CNN)、单阶段检测器(例如YOLO和SSD)等。它在提高目标检测结果的准确性和稳定性方面起到了重要的作用。

2. 示例代码

        以下是一个简单的示例代码,演示了如何使用Python实现非极大值抑制(NMS)算法:

import numpy as np

def calculate_iou(box1, box2):
    """
    计算两个框的交并比(IoU)
    """
    x1, y1, w1, h1 = box1
    x2, y2, w2, h2 = box2

    # 计算交集的坐标
    x_intersection = max(x1, x2)
    y_intersection = max(y1, y2)
    w_intersection = max(0, min(x1 + w1, x2 + w2) - x_intersection)
    h_intersection = max(0, min(y1 + h1, y2 + h2) - y_intersection)

    # 计算交并比
    intersection = w_intersection * h_intersection  #计算交集重合部分
    union = w1 * h1 + w2 * h2 - intersection  
    iou = intersection / union

    return iou

def nms(boxes, scores, iou_threshold):
    """
    非极大值抑制(NMS)算法
    """
    sorted_indices = np.argsort(scores)[::-1]  # 根据分数对框进行降序排序
    selected_indices = []

    while sorted_indices.size > 0:
        current_index = sorted_indices[0]
        selected_indices.append(current_index)

        # 计算当前框与其他框的IoU
        current_box = boxes[current_index]
        remaining_indices = sorted_indices[1:]
        ious = np.array([calculate_iou(current_box, boxes[i]) for i in remaining_indices])

        # 找到IoU小于阈值的框
        below_threshold_indices = remaining_indices[ious < iou_threshold]
        sorted_indices = below_threshold_indices

    return selected_indices

# 示例数据
boxes = np.array([
    [20, 30, 50, 50],
    [25, 35, 40, 40],
    [70, 80, 30, 30],
    [80, 90, 20, 20],
    [100, 120, 60, 60]
])
scores = np.array([0.9, 0.75, 0.8, 0.65, 0.95])

# 设置阈值
iou_threshold = 0.5

# 使用NMS进行框的抑制
selected_indices = nms(boxes, scores, iou_threshold)

# 打印选择的框
for index in selected_indices:
    print(boxes[index], scores[index])

        这个示例代码中,首先定义了一个calculate_iou函数,用于计算两个框的交并比(IoU)。然后定义了一个nms函数,实现了非极大值抑制算法。最后,给出了一个示例数据,包含了一组框的坐标和对应的置信度分数。通过调用nms函数,可以得到经过NMS处理后的选择框的索引,并打印出选择的框及其对应的分数。

        注意,此示例代码仅为演示目的,并未涵盖所有可能的情况。在实际应用中,可能需要根据具体的需求进行适当修改和优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1792715.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

wincc7.5在现有Report中增加页面

已有报告&#xff0c;页面是3页&#xff0c;需要新加1页数据。 在布局文件中&#xff0c;看到有3个项&#xff0c;这个版本的Wincc就是这种布置&#xff1a; 需要在报告内容中加入新内容&#xff0c;分页依据内容上下间的缝隙&#xff08;gap &#xff09;。 这里插入嵌入la…

SwiftUI中Menu和ControlGroup的使用

本篇文章主要介绍一下Menu组件和ControlGroup组件的使用。Menu组件是在iOS 14&#xff08;tvOS 17&#xff09;推出的一个组件&#xff0c;点击后提供一个可选择的操作列表。ControlGroup组件是一个容器视图&#xff0c;以视觉上适当的方式为给定的上下文显示语义相关的控件&am…

【设计模式深度剖析】【3】【行为型】【职责链模式】| 以购物中心客户服务流程为例加深理解

&#x1f448;️上一篇:命令模式 设计模式-专栏&#x1f448;️ 文章目录 职责链模式定义英文原话直译如何理解呢&#xff1f; 职责链模式的角色1. Handler&#xff08;抽象处理者&#xff09;2. ConcreteHandler&#xff08;具体处理者&#xff09;3. Client&#xff08;客户…

Go微服务: 基于rocketmq:server和rocketmq:broker搭建RocketMQ环境,以及生产消息和延迟消费消息的实现

RocketMQ 的搭建 1 ) 配置 docker-compose.yaml 文件 version: 3.5 services:rmqnamesrv:image: foxiswho/rocketmq:servercontainer_name: rmqnamesrvports:- 9876:9876volumes:- ./logs:/opt/logs- ./store:/opt/storenetworks:rmq:aliases:- rmqnamesrvrmqbroker:image: fo…

使用System-Verilog实现FPGA基于DE2-115开发板驱动HC_SR04超声波测距模块|集成蜂鸣器,led和vga提示功能

文章目录 前言一、SystemVerilog——下一代硬件设计语言1.1 语言基础2.2 面向对象编程1.3 接口&#xff08;Interfaces&#xff09;1.4 程序包&#xff08;Packages&#xff09;1.5 数据结构1.6 随机化&#xff08;Randomization&#xff09;1.7 并发性和时序控制1.8 功能增强1…

小程序丨最大填表限制如何开启?

老师在新建填表时&#xff0c;希望设置最大数量限制&#xff0c;若填表达到限制&#xff0c;后续的学生将不能继续提交填表。 通过开启【表格最大限制】功能即可实现&#xff0c;下面就来教大家如何制作吧。 &#x1f50e;如何开启表格最大限制功能&#xff1f; 按照常规流程…

Mac OS 用户开启 8080 端口

开启端口 sudo vim /etc/pf.conf # 开放对应端口 pass out proto tcp from any to any port 8080 # 刷新配置文件 sudo pfctl -f /etc/pf.conf sudo pfctl -e获取本机ip地址 ifconfig en0 | grep inet | grep -v inet6 | awk {print $2}访问指定端口

【UML用户指南】-03-UML的14种图

目录 1、结构图 1、类图&#xff08;class diagram&#xff09; 2、对象图&#xff08;object diagram&#xff09; 3、构件图 &#xff08;component diagram&#xff09; 4、组合结构图 5、包图&#xff08;package diagram&#xff09; 6、部署图&#xff08;deploym…

【LeetCode算法】第100题:相同的树

目录 一、题目描述 二、初次解答 三、官方解法 四、总结 一、题目描述 二、初次解答 1. 思路&#xff1a;二叉树的先序遍历。采用递归的先序遍历方法&#xff0c;首先访问根节点若不同则返回false&#xff0c;其次访问左子树和右子树。在访问左右子树时&#xff0c;需要注意…

gkuubibiih

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

Kubernetes集群安装部署(Anolis OS 8)

本次 Kubernetes 集群是基于 kubeadm 进行部署的&#xff0c;操作系统采用的 Anolis OS 8.9。 主机IP配置k8s192.168.211.112核&#xff0c;4G&#xff0c;20G硬盘k8s2192.168.211.122核&#xff0c;2G&#xff0c;20G硬盘k8s3192.168.211.132核&#xff0c;2G&#xff0c;20G…

【Vue】异步更新 $nextTick

文章目录 一、引出问题二、解决方案三、代码实现 一、引出问题 需求 编辑标题, 编辑框自动聚焦 点击编辑&#xff0c;显示编辑框让编辑框&#xff0c;立刻获取焦点 即下图上面结构隐藏&#xff0c;下面结构显示&#xff0c;并且显示的时候让它自动聚焦。 代码如下 问题 “…

带Tkinter界面的小验证加密程序——Python课程作业案例分析

Python课程作业案例分析 作业题目要求实现结果动图题目分析主要库介绍和说明实现源码及注释作业题目要求 某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的。加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,…

持续监控和优化的简单介绍

DevOps 监控提供了有关生产环境状况的全面且最新的信息&#xff0c;以及有关其服务、基础设施和应用程序的详细信息。通过从日志和指标中收集数据&#xff0c;您可以在软件开发生命周期的每个步骤中监控合规性和性能。 监控不仅仅针对生产问题&#xff0c;它涵盖了规划、开发、…

python --对象属性、类属性、类方法和静态方法

对象属性和类属性 --掌握--对象属性 目标掌握对象属性的使用 对象属性&#xff0c;有时也称实例属性、普通属性、公有属性 、或者直接叫属性 在类内部&#xff0c;访问对象属性语法&#xff1a; self.对象属性名 在类外部&#xff0c;访问对象属性语法&#xff1a; 对象名.对…

关系代数与规范化

本文是根据自己的理解&#xff0c;结合实践整理所得&#xff0c;有兴趣的可以参考学习。

掌握Django文件处理:一步步构建上传功能

创建模型 首先先进入我们的testsite项目下&#xff0c;打开members/models.py文件&#xff0c;先添加我们保存文件的数据模型&#xff1a; class Document(models.Model):name models.CharField(max_length255)file models.FileField(upload_touploads/) # uploads/ 是文件…

大模型基架:Transformer如何做优化?

大模型的基础模式是transformer&#xff0c;所以很多芯片都实现先专门的transformer引擎来加速模型训练或者推理。本文将拆解Transformer的算子组成&#xff0c;展开具体的数据流分析&#xff0c;结合不同的芯片架构实现&#xff0c;分析如何做性能优化。 Transformer结构 tr…

CTF本地靶场搭建——GZ:CTF安装

GZ:CTF 项目地址:https://gitcode.com/GZTimeWalker/GZCTF GZCTF 是一款开源的网络安全竞技平台&#xff0c;由开发者GZTimeWalker维护。该项目旨在提供一个环境&#xff0c;让网络安全爱好者和专业人士能够实践他们的技能&#xff0c;通过解决各种安全问题&#xff08;即“…

流量分析——一、蚁剑流量特征

君衍. 一、Webshell特征流量分析二、环境介绍三、使用Wireshark进行流量分析1、环境说明2、HTTP追踪流分析3、蚁剑请求体中代码块解读 四、使用BurpSurite进行流量分析1、环境配置2、抓包分析 六、总结 一、Webshell特征流量分析 对于重保、护网等攻防演练的防守方来说&#x…