60 秒回答模板

NMS 用来去掉目标检测中的重复框。实现时先按 score 从高到低排序,取最高分框加入结果,然后计算它和剩余框的 IoU,把 IoU 大于阈值的框删掉;再从剩余框里继续取最高分,重复直到没有候选框。多类别检测通常按类别分别做 NMS。复杂度主要来自排序和两两 IoU 计算,工程上会用向量化、topK 或 batched NMS 优化。

考点 按 score 贪心
难度 真实面经题
回答目标 讲清方法、取舍和追问

深入解析

01

先按分数排序

输入是检测框、类别和置信度。先按 score 降序排列,保证每轮优先处理当前最可信的候选框,这是 NMS 贪心策略的基础。

02

保留最高分框

每轮取当前最高分框加入最终结果,然后把它作为基准框,与剩余候选框逐个计算 IoU,判断是否属于同一个目标的重复预测。

03

按 IoU 阈值抑制

如果某个候选框和基准框的 IoU 超过阈值,就认为重叠过高,将其删除;低于阈值的框继续保留,参与后续轮次。

04

多类别要分别处理

常见做法是同一类别内做 NMS,避免不同类别的框互相抑制。多标签或类别混淆场景要明确类别维度和阈值策略。

05

实现关注复杂度

朴素 NMS 需要排序和多轮 IoU 计算,框很多时成本高。工程中会先做 score 阈值过滤、topK 截断、向量化计算或使用框架内置 batched NMS。

javascript

按 score 排序后的朴素 NMS

function nms(boxes, threshold) {
  const order = [...boxes].sort((a, b) => b.score - a.score);
  const keep = [];

  while (order.length > 0) {
    const current = order.shift();
    keep.push(current);
    for (let i = order.length - 1; i >= 0; i -= 1) {
      if (iou(current, order[i]) > threshold) {
        order.splice(i, 1);
      }
    }
  }

  return keep;
}
  • `iou` 需要明确框坐标格式,例如 `[x1, y1, x2, y2]` 还是 `[x, y, w, h]`。
  • 多类别检测通常先按类别分组,再分别执行 NMS,避免不同类别互相抑制。

易错点

  • 不要忘记先按 score 排序,否则贪心保留的不是最高置信度框。
  • 不要把 IoU 大于阈值理解成保留条件,普通 NMS 通常是抑制条件。
  • 不要在多类别检测中让不同类别无差别互相删除。

面试官追问

IoU 怎么计算?

IoU 等于两个框交集面积除以并集面积,需要先求交集矩形,再计算面积。

NMS 有什么缺点?

遮挡或密集目标中,真实相邻目标可能被误删;阈值选择也会影响召回和精度。

Soft-NMS 和普通 NMS 区别是什么?

Soft-NMS 不直接删除高重叠框,而是降低其分数,能在密集场景保留更多候选。