【目标检测】非极大值抑制(Non-Maximum Suppression, NMS)步骤与实现

步骤

  1. 置信度排序:首先根据预测框的置信度(即预测框包含目标物体的概率)对所有预测框进行降序排序。
  2. 选择最佳预测框:选择置信度最高的预测框作为参考框。
  3. 计算IoU:计算其他所有预测框与参考框的交并比(Intersection over Union, IoU)。
  4. 抑制:删除IoU高于某个阈值的所有预测框,因为这些框与参考框重叠太多,可能是重复预测。
  5. 迭代:从剩余的预测框中选择置信度最高的作为新的参考框,重复步骤3和4,直到所有预测框都被处理。

代码实现

导入必要的库

import numpy as np

定义计算IoU的函数

def iou(boxA, boxB):# 计算两个边界框的交集坐标xA = max(boxA[0], boxB[0])yA = max(boxA[1], boxB[1])xB = min(boxA[2], boxB[2])yB = min(boxA[3], boxB[3])# 计算交集面积interArea = max(0, xB - xA) * max(0, yB - yA)# 计算每个边界框的面积boxAArea = (boxA[2] - boxA[0]) * (boxA[3] - boxA[1])boxBArea = (boxB[2] - boxB[0]) * (boxB[3] - boxB[1])# 计算并集面积unionArea = boxAArea + boxBArea - interArea# 计算IoUiou = interArea / unionArea if unionArea != 0 else 0return iou

定义NMS函数

def nms(boxes, scores, iou_threshold):picked = []  # 存储被选择的边界框索引indexes = np.argsort(scores)[::-1]  # 按分数降序排列索引while len(indexes) > 0:current = indexes[0]picked.append(current)  # 选择当前最高分的边界框indexes = indexes[1:]  # 移除当前最高分的索引# 检查剩余边界框与当前选择框的IoU,如果大于阈值则抑制indexes = [i for i in indexes if iou(boxes[current], boxes[i]) <= iou_threshold]return picked

示例使用

# 假设boxes和scores是模型预测的边界框和分数
boxes = np.array([[50, 50, 100, 100], [60, 60, 110, 110], [200, 200, 300, 300]])
scores = np.array([0.9, 0.75, 0.8])# 设置IoU阈值
iou_threshold = 0.5# 执行NMS
picked_boxes = nms(boxes, scores, iou_threshold)print("Selected box indices:", picked_boxes)

注意

  • 边界框通常以(x1, y1, x2, y2)的格式表示,其中(x1, y1)是左上角坐标,(x2, y2)是右下角坐标。

Code

完整示例代码已上传至:Machine Learning and Deep Learning Algorithms with NumPy
此项目包含更多AI相关的算法numpy实现,供大家学习参考使用,欢迎star~

备注

个人水平有限,有问题随时交流~

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

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

相关文章

【数据结构】建堆算法复杂度分析及TOP-K问题

【数据结构】建堆算法复杂度分析及TOP-K问题 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;数据结构 文章目录 【数据结构】建堆算法复杂度分析及TOP-K问题前言一.复杂度分析1.1向下建堆复杂度1.2向上建堆复杂度1.3堆排序复杂度 二.TOP-K问…

深度学习1-简介

人工智能&#xff08;AI&#xff09;旨在打造模仿智能行为的系统。它覆盖了众多方法&#xff0c;涵盖了基于逻辑、搜索和概率推理的技术。机器学习是 AI 的一个分支&#xff0c;它通过对观测数据进行数学模型拟合来学习决策制定。这个领域近年来迅猛发展&#xff0c;现在几乎&a…

前端地位蹭蹭蹭Up!!!

作者&#xff1a;溪饱鱼 链接&#xff1a;juejin.cn/post/7283642910301192244 顺便吆喝一句&#xff0c;如果你本科学历&#xff0c;对技术大厂有向往&#xff0c;对前后端测试岗位有兴趣&#xff0c;不对大厂外包有100%的排斥&#xff0c;可以看看这里&#xff0c;薪酬待遇确…

Ruby语言详解

Ruby语言详解 Ruby&#xff0c;作为一种简单快捷的面向对象脚本语言&#xff0c;自20世纪90年代由日本人松本行弘&#xff08;Yukihiro Matsumoto&#xff09;开发以来&#xff0c;便以其独特的魅力和强大的功能赢得了全球开发者的青睐。Ruby不仅继承了Perl、Smalltalk、Eiffe…

​ ​【Linux】-----工具篇(多模式编辑器vim介绍及配置)

目录 认识常用三种模式 基本操作 Ⅰ、进入/打开vim Ⅱ、模式转换 Ⅲ、退出vim 命令集 Ⅰ、命令模式下 移动光标 删除文字 复制 替换 撤销 批量化注释 批量化去注释 Ⅱ、底行模式下 列出行号 跳转至指定行 查找字符 保存文件 退出vim 查看文件 分屏操作 vim的简…

论文阅读:面向自动驾驶场景的多目标点云检测算法

论文地址:面向自动驾驶场景的多目标点云检测算法 概要 点云在自动驾驶系统中的三维目标检测是关键技术之一。目前主流的基于体素的无锚框检测算法通常采用复杂的二阶段修正模块,虽然在算法性能上有所提升,但往往伴随着较大的延迟。单阶段无锚框点云检测算法简化了检测流程,…

CUE-云原生配置语言

CUE 是一种服务于云化配置的强类型配置语言&#xff0c;由 Go team 成员 Marcel van Lohiuzen 结合 BCL 及多种其他语言研发并开源&#xff0c;可以说是 BCL 思路的开源版实现CUE 是一种服务于云化配置的强类型配置语言&#xff0c;由 Go team 成员 Marcel van Lohiuzen 结合 B…

AI OS

一&#xff0c;概念 AI OS, 或AI for OS&#xff0c;也就是近一年来伴随着人工智能的热度而衍生出的一个新的概念 - 人工智能操作系统。 为什么提出AI OS的概念&#xff1f; 这是因为人工智能技术的发展势头太过迅猛&#xff0c;尤其在深度学习、大模型等AI技术的突破后&…

微信小程序:vant-weapp 组件库、css 变量

vant-weapp 组件库 前往 vant-weapp 官网 npm 使用限制&#xff1a;不支持依赖于 Node.js 内置库、浏览器内置对象、C 插件 的包。 安装 vant-weapp # 通过 npm 安装 npm i vant/weapp -S --production# 通过 yarn 安装 yarn add vant/weapp --production# 安装 0.x 版本 npm i…

Mac环境报错 error: symbol(s) not found for architecture x86_64

Mac 环境Qt Creator报错 error: symbol(s) not found for architecture x86_64 错误信息 "symbol(s) not found for architecture x86_64" 通常是在编译或链接过程中出现的问题。这种错误提示通常涉及到符号未找到或者是因为编译器没有找到适当的库文件或函数定义。 …

powe bi界面认识及矩阵表基本操作 - 1

powe bi界面认识及矩阵表操作 1. 界面认识1.1 选择数据源1.2 选择相关表及点击加载1.3 表字段显示位置1.4 表属性按钮位置1.5 界面布局按钮认识 2. 矩阵表基本操作2.1 选择矩阵表2.2 创建矩阵表2.3 设置字体大小2.4 行填充&#xff1a;修改高度2.5 列宽&#xff1a;设置列的宽度…

【下厨记】青椒土豆丝的做法和写代码之间的关系

在gap year 的尾声&#xff0c;我决定给自己报个厨艺培训班&#xff0c;精进一下厨艺。讲道理&#xff0c;在这样一个充斥着代码的社区写怎么做土豆丝是不是很不搭界&#xff0c;但其实没有&#xff0c;且听我娓娓道来。论&#xff0c;青椒土豆丝做法和写代码之间的关系。 1.找…

git怎么把本地仓库提交到远程仓库

要把本地仓库的内容推送到远程仓库&#xff0c;你需要先设置远程仓库的URL&#xff0c;然后使用git push命令。以下是步骤和示例代码&#xff1a; 1、在本地创建一个新的git仓库或者进入一个已存在的git仓库目录。 2、添加远程仓库&#xff08;如果尚未添加&#xff09;。使用…

使用RedisTemplate操作executePipelined

前言 RedisTemplate 是 Spring 提供的用于操作 Redis 的模板类&#xff0c;它封装了 Redis 的连接、连接池等管理&#xff0c;并提供了一系列的操作方法来简化 Redis 的使用。其中&#xff0c;executePipelined 方法是 RedisTemplate 中的一个高级特性&#xff0c;用于支持 Re…

【Python实战因果推断】55_因果推理概论5

目录 Consistency and Stable Unit Treatment Values Violations Causal Quantities of Interest Consistency and Stable Unit Treatment Values 在上述方程中&#xff0c;隐含着两个基本假设。第一个假设意味着潜在结果与处理是一致的&#xff1a;当时&#xff0c;。换句…

为什么有了MAC还需要IP?

目录 MAC地址&#xff08;Media Access Control Address&#xff09;IP地址&#xff08;Internet Protocol Address&#xff09;为什么需要两者&#xff1f; IP地址和MAC地址在网络通信中扮演着不同的角色&#xff0c;它们各自有独特的功能和用途。下面是它们的主要区别和为什么…

VitePress Config.mts 详细讲解

VitePress 是一个基于 Vite 的静态站点生成器&#xff0c;专为技术文档和博客设计。它继承了 Vite 的快速开发体验&#xff0c;并提供了一套简洁的配置选项。在本文中&#xff0c;我们将深入探讨 VitePress 的 config.mts 配置文件&#xff0c;这是中高级开发者定制站点的关键所…

详解Vue中nextTick的原理与作用

Vue中的nextTick是一个非常重要的API&#xff0c;它允许开发者延迟回调函数的执行直到下次DOM更新循环之后。这一机制在Vue开发中非常有用&#xff0c;特别是在处理DOM更新和异步操作时。下面将详细解释nextTick的原理与作用。 原理 Vue的DOM更新是异步进行的。当数据发生变化…

Vue3相比于Vue2进行了哪些更新

1、响应式原理 vue2 vue2中采用 defineProperty 来劫持整个对象&#xff0c;然后进行深度遍历所有属性&#xff0c;给每个属性添加getter和setter&#xff0c;结合发布订阅模式实现响应式。 存在的问题&#xff1a; 检测不到对象属性的添加和删除数组API方法无法监听到需要对…

Shader笔记1:基础概念

有相当一部分来自shader圣经 Base of CG Concepts Tangent, Normal and Binormal N&#xff1a;法线&#xff08;Normal, N&#xff09;垂直于表面 T&#xff1a;切线&#xff08;Tangent, T&#xff09;与U方向同向 B&#xff1a;副切线&#xff08;BiTangent, B&#xff09…