目标检测中的非极大值抑制(NMS)是什么?
时间:2026-11-11 来源:华清远见
非极大值抑制(Non-Maximum Suppression, NMS)是目标检测后处理中的一种去重算法:模型通常会在同一个目标周围输出很多重叠的候选框,每个框带有类别和置信度。NMS 的目标是保留每个目标最可靠的一个框,抑制掉与它高度重叠的其他框。
基本流程
假设已有候选框集合 (B),每个框有置信度 (s):
1.先按置信度从高到低排序;
2.取出当前置信度最高的框 (M),加入最终结果;
3.计算剩余框与 (M) 的 IoU(交并比);
4.删除与 (M) 的 IoU 大于阈值(Nt)的框;
5.在剩余框中重复步骤 2–4,直到没有框为止。
伪代码:
NMS(B, threshold):
result = []
sort B by confidence descending
while B not empty:
M = B.pop_first() # 当前最高分框
result.append(M)
for box in B:
if IoU(M, box) > threshold:
remove box from B
return result
关键点
IoU 阈值:常见取 0.5、0.6、0.7 等。
o阈值太低:抑制太强,可能误删靠近的不同目标;
o阈值太高:抑制太弱,同一个目标可能保留多个框。
按类别分别做 NMS:多类别检测中,通常对每个类别独立执行 NMS,避免不同类别的框互相抑制。
先做置信度过滤:一般先去掉低置信度框,再做 NMS,减少计算量。
计算复杂度:朴素实现约为(O(N2)),框很多时可能较慢。
为什么需要 NMS
目标检测模型,尤其是基于锚框或密集预测的方法,会在同一目标附近产生多个高分框。NMS 通过“保留最高分、抑制高重叠框”的贪心策略,得到更干净、更简洁的检测结果。
常见变体
Soft-NMS:不是直接删除高 IoU 框,而是降低其置信度,适合密集目标;
GIoU-NMS / DIoU-NMS:用 GIoU、DIoU 替代 IoU 判断重叠;
Class-wise NMS:按类别分别抑制;
Batched NMS:GPU 上批量并行实现;
NMS-free 检测器:如 DETR 类方法,通过集合预测减少对 NMS 的依赖。
一句话总结:NMS 是目标检测中按置信度贪心保留最优框、删除与已保留框高度重叠候选框的后处理去重方法。

