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

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 npdef calculate_iou(box1, box2):"""计算两个框的交并比(IoU)"""x1, y1, w1, h1 = box1x2, 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 / unionreturn ioudef 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)# 计算当前框与其他框的IoUcurrent_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_indicesreturn 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.mzph.cn/news/848501.shtml

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

相关文章

王道408数据结构CH2_线性表

概述 2 线性表 2.1 基本操作 2.2 顺序表示 线性表的元素从1开始&#xff0c;数组元素下标从0开始 2.2.1 结构体定义 #define Maxsize 50typedef struct{ElemType data[Maxsize];int length; }SqList;#define Initsize 100typedef struct{ElemType *data;int Maxsize ,length;…

Ansible部署 之 zookeeper集群

简介 Ansible是近年来越来越火的一款轻量级运维自动化工具&#xff0c;主要功能为帮助运维实现运维工作的自动化、降低手动操作的失误、提升运维工作效率。常用于自动化部署软件、自动化配置、自动化管理&#xff0c;支持playbook编排。配置简单&#xff0c;无需安装客户端&am…

Github 2024-06-06 Go开源项目日报 Top10

根据Github Trendings的统计,今日(2024-06-06统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10Ollama: 本地大型语言模型设置与运行 创建周期:248 天开发语言:Go协议类型:MIT LicenseStar数量:42421 个Fork数量:2724 次关注人…

详细分析Mysql中的SQL_MODE基本知识(附Demo讲解)

目录 前言1. 基本知识2. Demo讲解2.1 ONLY_FULL_GROUP_BY2.2 STRICT_TRANS_TABLES2.3 NO_ZERO_IN_DATE2.4 NO_ENGINE_SUBSTITUTION2.5 ANSI_QUOTES 前言 了解Mysql内部的机制有助于辅助开发以及形成整体的架构思维 对于基本的命令行以及优化推荐阅读&#xff1a; 数据库中增…

完美解决 mysql 报错ERROR 1524 (HY000): Plugin ‘mysql_native_password‘ is not loaded

文章目录 错误描述错误原因解决步骤 跟着我下面的步骤走&#xff0c;解决你的问题&#xff0c;如果解决不了 私信我来给你解决 错误描述 执行ALTER USER root% IDENTIFIED WITH mysql_native_password BY 123456;报错ERROR 1524 (HY000): Plugin mysql_native_password is not …

AI炒股:获取个股的历史成交价格并画出K线图

任务&#xff1a;获取贵州茅台的近几个月的价格数据&#xff0c;绘制k线图&#xff1b; 在deepseek中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个编写Python脚本的任务&#xff0c;具体步骤如下&#xff1a; 用AKShare库获取股票贵州茅台&#xf…

PID算法在电机速度控制上的应用

目录 概述 1 系统硬件框架 1.1 框架介绍 1.2 硬件实物图 2 STM32Cub生成工程 2.1 软件版本信息 2.2 配置参数 ​编辑2.3 生成项目 3 PID算法实现 3.1 概念 3.2 代码实现 4 其他功能实现 4.1 设置电机速度 4.2 PID算法控制电机 4.3 功能函数的调用 5 测试 5.1 …

3072. 将元素分配到两个数组中 II Rust 线段树 + 离散化

题目 给你一个下标从 1 开始、长度为 n 的整数数组 nums 。 现定义函数 greaterCount &#xff0c;使得 greaterCount(arr, val) 返回数组 arr 中 严格大于 val 的元素数量。 你需要使用 n 次操作&#xff0c;将 nums 的所有元素分配到两个数组 arr1 和 arr2 中。在第一次操…

winscp无法上传,删除,修改文件并提示权限不够的分析

使用winscp删除文件,报了个错如下 根据这个错就去百度,网上大部分都是通过下面这种方法解决: 在winscp端进行设置 输入主机名(即IP地址)、用户名和密码,然后点击高级 在箭头所指位置输入sudo + sftp应用程序的路径 先查询 sudo find / -name sftp-server -print点击Sh…

如何让 AI 自动阅读文档样例,编写符合你需求的代码?

&#xff08;注&#xff1a;本文为小报童精选文章。已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费&#xff09; 痛点 我本科读的计算机专业。当时编程&#xff0c;讲究的就是个扎实。例如哈夫曼编码用来压缩解压文件&#xff0c;那真的是自己一行行代码写过来的。更…

【Pytorch】计算机视觉项目——卷积神经网络TinyVGG模型图像分类(如何使用自定义数据集)

目录 一、前言二、工作流程回顾三、详细步骤流程1. 环境配置2. 数据准备数据集下载数据存储结构&路径查看图片 3. 数据转换4. 自定义数据集&#xff08;Custom Dataset &#xff09;4.1 方法一&#xff1a;使用ImageFolder加载数据集信息查看张量转图片创建DataLoader 4.2 …

Java Web学习笔记12——JavaScript字符串

String&#xff1a; String字符串对象创建方法有两种&#xff1a; 方式一&#xff1a; var str new String("Hello String"); 方式二&#xff1a; var str "Hello String"; 常见的属性和方法&#xff1a; <!DOCTYPE html> <html lang"…

SwiftUI中ContentUnavailableView的使用(iOS 17、tvOS 17推出的新组件)

iOS 17为SwiftUI带来了一个新的组件ContentUnavailableView&#xff0c;它允许我们向用户呈现一个空状态&#xff0c;而不需要创建自定义错误或者无内容视图。 ContentUnavailableView易于使用&#xff0c;可自定义&#xff0c;并且具有用于空搜索状态的预定义视图。 建议在无…

【C语言】详解函数(下)(庖丁解牛版)

文章目录 1. 前言2. 数组做函数形参3. 函数嵌套调用和链式访问3.1 嵌套调用3.2 链式访问 1. 前言 详解C语言函数(上)的链接&#xff1a;http://t.csdnimg.cn/EGsfe 经过对函数的初步了解之后,相信大家已经对C语言标准库里的函数已经有初步的认知了&#xff0c;并且还学会了如…

设计模式-工厂方法(创建型)

创建型-工厂方法 简单工厂 将被创建的对象称为“产品”&#xff0c;将生产“产品”对象称为“工厂”&#xff1b;如果创建的产品不多&#xff0c;且不需要生产新的产品&#xff0c;那么只需要一个工厂就可以&#xff0c;这种模式叫做“简单工厂”&#xff0c;它不属于23中设计…

nvme-cli常见命令分析

一、背景 nvme-cli命令常常用于获取或者设置SSD参数&#xff0c;比如常见的nvme list&#xff0c;nvme id-ctrl等&#xff0c;都是获取SSD的基本信息&#xff0c;也有nvme admin-passthru用于读取或者设置自定义命令。作为使用者&#xff0c;我们并不知道nvme-cli源码怎么实现…

光波长 深入程度

UV深入程度&#xff08;UVC&#xff0c; UVB&#xff0c; UVA&#xff09;https://mp.weixin.qq.com/s?__bizMzkwNTM0Njk3MA&mid2247483934&idx1&sn92d1ba67ead404e7714af11ec0526786&chksmc0f868ebf78fe1fd0610493e6f49a5d90835a20a829a900746906cda12f2fa12…

ultralytics-极市平台打榜

ultralytics 应用教程 ultralytics简介 UltralyticsYOLOv8YOLOv8 基于深度学习和计算机视觉领域的尖端技术,在速度和准确性方面具有无与伦比的性能。其流线型设计使其适用于各种应用,并可轻松适应从边缘设备到云 API 等不同硬件平台。链接 安装教程 作为第三方python包直接…

hcia datacom学习(12):vlan间路由

不同vlan相当于不同网段&#xff0c;如果vlan间没有三层技术&#xff0c;那么它们就无法互相通信。 vlan间路由可以有3种方式&#xff1a; 1.直接使用路由器转发 *路由器本身不需要额外设置&#xff0c;只需配置端口ip作为网关即可。 *路由器不能处理带有vlan标签的数据帧&a…

springboot3 一些听课笔记(1)

文章目录 一、日志框架二、springboot 自动配置三 、springweb3.13.2 自己编写一个messageconvert3.2.2 如果我们想让其支持yaml格式呢&#xff1f; 一、日志框架 springboot底层 默认使用logbacksjf4j作为日志框架。 1、每个 starter 场景&#xff0c;都会导入一个核心场景 …