当前位置: 首页 > news >正文

目标检测中的非极大值抑制(NMS):步骤与Python实现

目标检测中的非极大值抑制(NMS):步骤与Python实现

非极大值抑制(Non-Maximum Suppression, NMS)是目标检测中用于去除多余边界框的关键步骤。在目标检测任务中,模型通常会为每个目标预测多个边界框,这些边界框可能会有重叠。NMS通过保留最佳的边界框并移除其他重叠的边界框来减少冗余。

NMS的步骤

  1. 置信度排序:按照每个边界框的置信度(通常是物体存在的得分)进行降序排序。
  2. 选择最高得分的边界框:从排序后的列表中选择置信度最高的边界框,将其添加到最终的检测结果中。
  3. 计算交并比(IoU):对于剩余的每个边界框,计算它与已选择边界框的IoU。
  4. 移除重叠边界框:如果某个边界框与已选择的边界框的IoU超过了预设的阈值(如0.5),则认为这两个框表示的是同一个目标,移除置信度较低的边界框。
  5. 重复:继续选择剩余边界框中置信度最高的,重复计算IoU和移除过程,直到所有边界框都被检查过。

NMS的Python实现

以下是使用Python和NumPy库实现NMS的示例代码:

import numpy as npdef 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])iou = interArea / float(boxAArea + boxBArea - interArea)return ioudef non_max_suppression(boxes, scores, iou_threshold=0.5):"""非极大值抑制boxes: 边界框列表,每个框是一个[x1, y1, x2, y2]的数组scores: 每个边界框对应的得分列表iou_threshold: IoU阈值"""# 按得分排序idxs = np.argsort(scores)[::-1]selected = []while len(idxs) > 0:# 选取得分最高的边界框current = idxs[0]selected.append(current)# 计算与其他边界框的IoUfor i in range(1, len(idxs)):if iou(boxes[current], boxes[idxs[i]]) > iou_threshold:breakelse:  # 如果没有超过阈值的框,继续idxs = idxs[1:]return selected# 示例数据
boxes = np.array([[100, 100, 210, 210], [120, 120, 220, 220], [150, 150, 250, 250]])
scores = np.array([0.9, 0.8, 0.7])
selected_boxes = non_max_suppression(boxes, scores, iou_threshold=0.5)
print("Selected boxes:", selected_boxes)

在这段代码中,我们首先定义了一个函数iou来计算两个边界框的交并比。然后,我们实现了non_max_suppression函数,它接受边界框列表、得分列表和一个IoU阈值,返回经过NMS处理后的边界框索引列表。

结论

NMS是目标检测中不可或缺的一步,它通过移除多余的边界框来提高检测的准确性。通过上述代码示例,我们可以在Python中轻松实现NMS算法,以优化目标检测模型的性能。

✅作者简介:热爱科研的人工智能开发者,修心和技术同步精进

❤欢迎关注我的知乎:对error视而不见

代码获取、问题探讨及文章转载可私信。

☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

🍎获取更多人工智能资料可点击链接进群领取,谢谢支持!👇

点击领取更多详细资料


http://www.mrgr.cn/news/31494.html

相关文章:

  • 华为大咖说 | 浅谈智能运维技术
  • 计算机毕业设计Python+大模型斗鱼直播可视化 直播预测 直播爬虫 直播数据分析 直播大数据 大数据毕业设计 机器学习 深度学习
  • 【数据结构 | C++】字符串关键字的散列映射
  • 面试击穿mysql
  • 光刻机上下游产业链(方便选股)
  • vue3使用VueQuill插入自定义按钮
  • Pybullet 安装过程
  • 无人机视角电力巡检资产检测与异常判别数据集
  • C++11——function与bind
  • QTableWidget的setRowCount
  • 【ShuQiHere】 探索 IEEE 754 浮点数标准:以 57.625 和 -57.625 为例
  • JVM基础
  • 【有啥问啥】OpenAI o1的思考之前训练扩展定律、后训练扩展定律与推理扩展定律:原理与应用详解
  • 基于Python与K-Means的自动化视频分类方法
  • 举例说明偏差的计算方式和在计算协方差中的作用
  • 欠款管理代码———未来之窗行业应用跨平台架构
  • 下载 B 站封面的正确方式
  • 系统架构设计师 SOA与微服务架构篇
  • 聊聊Thread Local Storage
  • 02.06、回文链表
  • Track 09:X-XMCL
  • 十种果冻的做法
  • Python习题 191:将英文句子转为每个单词组成的列表
  • 秒懂Linux之消息队列与信号量(了解)
  • 酸枣病虫害智能化防控系统的探索与实践,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建枣类作物种植场景下酸枣病虫害智能检测识别系统
  • 第二十一节:学习Redis缓存数据库的Hash操作(自学Spring boot 3.x的第五天)