大家好!今天我们来聊聊目标检测中的关键算法------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(两个不同目标)!

💻 四、代码实现(Python版)
python
import numpy as np
def 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不仅是学术界的宠儿,更是工业界的常客:
- 自动驾驶 :精确检测车辆、行人🚶♂️,避免同一目标重复计数;
- 医学影像 :定位肿瘤病灶🔬,辅助医生诊断;
- 安防监控 :人脸识别👮,确保一人一框;
- 卫星图像分析 :识别建筑物、农田等🏢。
⚙️ 六、NMS变体与改进
传统NMS(Hard NMS)简单高效,但存在场景局限:
- 缺点 :密集目标易漏检(阈值难调)❌;
- 改进方案 :
- Soft-NMS :不直接删除,而是降低重叠框的置信度 ;
- Adaptive NMS :根据目标密度动态调整阈值;
- 无NMS模型 :如YOLOv10,从网络结构设计上避免冗余框。
💎 七、总结
- NMS是什么 :目标检测的后处理算法,用于去除冗余框 ;
- 核心思想 :保留局部最高分框 ,抑制与其高度重叠的框;
- 关键参数 :IoU阈值(常用0.5~0.7);
- 代码实现 :10行Python即可搞定(排序 + IoU计算 + 迭代抑制);
- 适用场景 :任何输出多个候选框的目标检测模型(YOLO、SSD等)。
🌟 一句话牢记NMS:
"只留最自信的框,重叠太高的删光光!
今天的分享就到这里啦,欢迎评论区讨论!👇如果喜欢,记得点赞,收藏哦~~⭐️