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

非极大值抑制(NMS)详解:目标检测中的“去重神器”

大家好!今天我们来聊聊目标检测中的​​关键算法——NMS(Non-Maximum Suppression,非极大值抑制)​​。无论是YOLO、Faster R-CNN还是SSD,NMS都是它们输出结果的“最后把关人”。本文将带你彻底搞懂NMS的原理和实现!

🤔 一、为什么需要NMS?

想象一下:你用目标检测模型识别下图中的小猫🐱,模型可能输出​​多个重叠的矩形框​​(如下图),每个框都有​​置信度分数​​(表示模型认为框内是猫的概率)。

如果全保留,一只猫会被重复检测多次!这不仅​​浪费计算资源​​,还会导致结果混乱。NMS的作用就是:

1️⃣ ​​保留置信度最高的框​​;

2️⃣ ​​抑制掉与其高度重叠的其他框​​。

最终效果👉 ​​每只猫只对应一个最优框​​!


🔍 二、NMS核心思想

​“非极大值抑制”​​ 这个名字已经剧透了它的工作方式:

  • ​“极大值”​​:指的是​​局部区域内置信度最高​​的框;
  • ​“非极大值”​​:与其重叠度高但分数低的框;
  • ​“抑制”​​:删除这些非极大值框。

简单说:​​每个目标只留一个最自信的框,其他靠太近的统统删掉!​


📝 三、算法流程详解

假设我们有6个候选框(A-F),置信度排序为:​​A < B < C < D < E < F​​(F最自信)。设IoU阈值为0.5。

✅ ​​Step 1: 选出当前最高分框​

从F开始,将其加入​​保留列表​​✅。

✅ ​​Step 2: 计算IoU并抑制重叠框​

计算F与A~E的​​交并比(IoU)​​:

  • IoU > 0.5 👉 认为与F是同一目标,​​删除B和D​​❌;
  • IoU ≤ 0.5 👉 保留A、C、E✅。

✅ ​​Step 3: 处理剩余框,重复上述过程​

剩余框:A、C、E(置信度排序:E > C > A)

  • 选最高分框E加入保留列表✅;
  • 计算E与A、C的IoU:若A和C与E重叠>0.5,则删除。

✅ ​​最终结果​

保留框:​​F和E​​(两个不同目标)!

👉点击了解什么是IOU(交并比)


💻 四、代码实现(Python版)

import numpy as npdef nms(dets, thresh):"""Pure Python NMS实现."""x1 = dets[:, 0]  # 左上角x坐标y1 = dets[:, 1]  # 左上角y坐标x2 = dets[:, 2]  # 右下角x坐标y2 = dets[:, 3]  # 右下角y坐标scores = dets[:, 4]  # 置信度areas = (x2 - x1 + 1) * (y2 - y1 + 1)  # 每个框的面积order = scores.argsort()[::-1]  # 按置信度降序排序keep = []  # 保留的框索引while order.size > 0:i = order[0]  # 当前最高分框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:]])# 计算交集面积w = np.maximum(0.0, xx2 - xx1 + 1)h = np.maximum(0.0, yy2 - yy1 + 1)inter = w * h# 计算IoU = 交集 / (面积1 + 面积2 - 交集)iou = inter / (areas[i] + areas[order[1:]] - inter)# 保留IoU低于阈值的框(不重叠)inds = np.where(iou <= thresh)[0]order = order[inds + 1]  # 更新待处理框索引return keep

🌐 五、实际应用场景

NMS不仅是学术界的宠儿,更是工业界的常客:

  1. ​自动驾驶​​:精确检测车辆、行人🚶‍♂️,避免同一目标重复计数;
  2. 医学影像​​:定位肿瘤病灶🔬,辅助医生诊断
  3. 安防监控​​:人脸识别👮,确保一人一框;
  4. 卫星图像分析​​:识别建筑物、农田等🏢。

⚙️ 六、NMS变体与改进

传统NMS(Hard NMS)简单高效,但存在​​场景局限​​:

  • ​缺点​​:密集目标易漏检(阈值难调)❌;
  • 改进方案​​:
  • Soft-NMS​​:不直接删除,而是​​降低重叠框的置信度​
  • ​Adaptive NMS​​:根据目标密度动态调整阈值;
  • ​无NMS模型​​:如YOLOv10,从网络结构设计上避免冗余框

💎 七、总结

  1. ​NMS是什么​​:目标检测的后处理算法,用于​​去除冗余框​​;
  2. 核心思想​​:​​保留局部最高分框​​,抑制与其高度重叠的框;
  3. ​关键参数​​:IoU阈值(常用0.5~0.7);
  4. ​代码实现​​:10行Python即可搞定(排序 + IoU计算 + 迭代抑制);
  5. ​适用场景​​:任何输出多个候选框的目标检测模型(YOLO、SSD等)。

🌟 ​​一句话牢记NMS​​:

​“只留最自信的框,重叠太高的删光光!​

今天的分享就到这里啦,欢迎评论区讨论!👇如果喜欢,记得点赞,收藏哦~~⭐️

http://www.dtcms.com/a/332813.html

相关文章:

  • 基于 Vue2+Quill 的富文本编辑器全方案:功能实现与样式优化
  • 列式存储与行式存储:核心区别、优缺点及代表数据库
  • Flink Stream API 源码走读 - map 和 flatMap
  • ETH持续上涨推动DEX热潮,交易活跃度飙升的XBIT表现强势出圈
  • MySQL 全面指南:从入门到精通——深入解析安装、配置、操作与优化
  • 从阻塞到异步:Java IO 模型进化史 ——BIO、NIO、AIO 深度解析
  • Cherryusb UAC例程对接STM32 SAI播放音乐和录音(下)=>USB+SAI+TX+RX+DMA控制WM8978播放和录音实验
  • 【嵌入式FreeRTOS#补充1】临界区
  • K-means 聚类算法学习笔记
  • 解锁PostgreSQL专家认证增强驱动引擎
  • 打靶日常-sql注入(手工+sqlmap)
  • 136-基于Spark的酒店数据分析系统
  • Python Sqlalchemy数据库连接
  • 紫金桥RealSCADA:国产工业大脑,智造安全基石
  • 【已解决】在Spring Boot工程中,若未识别到resources/db文件夹下的SQL文件
  • JavaScript 防抖(Debounce)与节流(Throttle)
  • 易道博识康铁钢:大小模型深度融合是现阶段OCR的最佳解决方案
  • 【Trans2025】计算机视觉|UMFormer:即插即用!让遥感图像分割更精准!
  • Notepad++插件开发实战指南
  • Radar Forward-Looking Imaging Based on Chirp Beam Scanning论文阅读
  • 《WINDOWS 环境下32位汇编语言程序设计》第1章 背景知识
  • 【Linux】探索Linux虚拟地址空间及其管理机制
  • C# HangFire的使用
  • 概率论基础教程第2章概率论公理(习题和解答)
  • 在 Linux 服务器搭建Coturn即ICE/TURN/STUN实现P2P(点对点)直连
  • HarmonyOS 实战:用 @Observed + @ObjectLink 玩转多组件实时数据更新
  • pyecharts可视化图表-pie:从入门到精通(进阶篇)
  • Python 数据可视化:柱状图/热力图绘制实例解析
  • 概率论基础教程第2章概率论公理
  • 享元模式C++