视频封面

视频元信息

  • 课程来源:吴恩达深度学习专项课程(Deep Learning Specialization)
  • 所属模块:卷积神经网络(CNN)—— 目标检测(Object Detection)
  • 本节主题:非极大值抑制(Non-Max Suppression, NMS)
  • 视频时长:约 8 分钟(480 秒)

内容摘要(TL;DR)

本节讲解目标检测中的非极大值抑制(NMS)算法。核心问题:YOLO 算法在 19×19 网格上会输出大量重叠的边界框,同一个物体会被多个网格同时检测到。NMS 通过"先丢弃低置信度框 → 选出最高概率框 → 抑制与它高 IOU 重叠的框"的循环流程,最终只保留每个物体一个最优预测框。多类别检测时需对每个类别独立执行一次 NMS。


一、问题背景:为什么需要非极大值抑制 [00:29]

在 YOLO 目标检测中,图像被划分为 19×19 的网格(grid)。理论上,一辆车只有一个中心点(midpoint),因此应该只被分配给一个网格单元来负责预测。

And this is a 19 x 19 grid. Now while technically this car has just one midpoint so it should be assigned just a one grid cell.

但实际运行时会出现问题:

  • 算法在训练和推理时,多个相邻网格都可能认为"车辆中心点在我这里",从而各自输出一个边界框(bounding box)。
  • 结果是:同一个物体周围出现大量重叠的候选框,而非只有理想的一个。

理解:这是卷积网络"平移不变性"带来的副作用——相邻网格的特征高度相似,导致它们对同一物体的响应都很强。

易错点:很多初学者以为"一个物体只会被一个网格检测到",这是理想假设,实际中不是。这正是 NMS 存在的根本原因。

NMS 要解决的核心矛盾:一个目标 → 多个重叠预测框 → 需要去重,只保留最好的那个。


二、NMS 的核心思想与直观演示 [02:18]

NMS 的英文全称是 Non-Max Suppression,即"非极大值抑制"。

non-max means that you're going to output your maximal probability classifications, but suppress the close by ones that are non-maximal.

直观流程演示(视频用颜色高亮说明):

  1. 假设有三个候选框,置信度分别是 0.9、0.8、0.7、0.6。
  2. 先看置信度最高的 0.9 框 → 高亮它,输出为最终预测("这里有一辆车")。
  3. 检查其余所有框,凡是与 0.9 框 IOU 重叠很高的(如 0.6、0.7 的框)→ 全部抑制(darken 变暗)。
  4. 在剩余的框里再找置信度最高的 → 比如 0.8 → 高亮输出。
  5. 再抑制与 0.8 框高 IOU 重叠的框。
  6. 重复直到所有框要么被高亮输出,要么被抑制。

So now every rectangle has been either highlighted or darkened, and if you just get rid of the darkened rectangles, you'll be left with just the highlighted ones and these are your two final predictions.

最终结果:只留下两个高亮框,即两个最终预测。

思考:这个过程本质是"贪心算法"——每次选当前最优,然后排除与它冲突的,逐步收敛。

关键词解释:

  • IOU(Intersection over Union,交并比):两个框交集面积 ÷ 并集面积,取值 0~1,衡量两个框重叠程度。IOU 越高,说明两个框越可能指向同一个物体。

三、NMS 算法详细步骤 [03:54]

视频给出标准算法流程,以单目标(仅检测汽车)为例简化说明。

前置:网络输出

  • 输入 19×19 网格 → 输出 19×19×8 的输出体(output volume)。
  • 每个网格位置输出:Pc(是物体的概率) + 边界框参数(bx, by, bh, bw)。
  • 简化例子中只有 1 个类别,故没有 C1、C2、C3 类别分量。
  • 361 个位置(19² = 361,视频口误说成 161)各输出一个预测。

注:视频原文说 "361 which is 19 squared, which is 161 positions",其中 161 为口误,正确应为 361。

算法三步

第一步:丢弃低置信度框

discard all the predictions of the bounding boxes with Pc less than or equal to some threshold. Let's say 0.6.

  • 设定阈值(如 0.6)。
  • 所有 Pc ≤ 阈值 的框直接丢弃,认为该位置没有物体。
  • 理解:这一步大幅减少候选框数量,降低后续计算量,也过滤掉噪声。

第二步:循环选最优框

while there are any remaining bounding boxes that you have not yet discarded or processed, repeatedly pick the box with the highest probability of the highest Pc and then output that as a prediction.

  • 只要还有未处理的框:
    • 选出 Pc 最高的框 → 输出为最终预测(对应视频中"高亮")。

第三步:抑制高重叠框

discard any remaining box with a high overlap with a high IOU with the box that you just output in the previous step.

  • 将所有与刚输出框 IOU 超过阈值的剩余框丢弃(对应视频中"变暗")。
  • 回到第二步,重复,直到所有框都被处理(要么输出,要么丢弃)。

易错点:

  • 阈值有两个:Pc 阈值(过滤低置信度)和 IOU 阈值(判断重叠)。二者作用不同,别混淆。
  • 循环条件容易写错,必须是"还有未处理的框"就继续。

NMS 的本质:输出极大值(最高 Pc),抑制非极大值(高 IOU 的邻居框)。 名字由此而来。


四、多类别目标的处理方式 [07:06]

视频最后说明:如果实际要检测三类物体——行人(pedestrians)、汽车(cars)、摩托车(motorcycles):

  • 输出向量会多出三个额外分量(对应三个类别的概率 C1、C2、C3)。
  • 正确做法是:对每个输出类别独立执行一次 NMS,即运行三次。

If you actually trying to detect three objects... the right thing to do is to independently carry out non-max suppression three times, one on each of the output classes.

理解:因为"行人框"和"汽车框"即使重叠,也不应该互相抑制——它们代表不同物体。所以必须按类别分开做 NMS。

易错点:如果对所有类别混在一起做一次 NMS,会导致不同类别的物体互相抑制,漏检严重。

多类别 NMS = 对每个类别分别做一次 NMS,共 N 次(N 为类别数)。

拓展【拓展】:在工程实现中(如 PyTorch 的 torchvision.ops.nms),多类别 NMS 通常通过给每个框的坐标加上"类别偏移量"来实现一次批量处理,但逻辑上仍等价于按类别独立执行。


五、本节小结与下节预告 [07:38]

  • NMS 是 YOLO 目标检测流程中不可或缺的后处理步骤。
  • 实现了 NMS 的目标检测算法,能取得相当不错的效果。
  • 视频最后预告:还有一个让算法效果大幅提升的重要思想——锚框(Anchor Boxes),将在下一节讲解。

before wrapping up our discussion of the YOLO algorithm, there's just one last idea I want to share with you which makes the algorithm work much better, which is the idea of using anchor boxes.

思考:NMS 解决"重复检测",Anchor Boxes 解决"一个网格检测多个物体"的问题,两者是 YOLO 完整流程中互补的两个关键组件。


关键标签 / 关键词

非极大值抑制 NMS Non-Max Suppression 目标检测 Object Detection YOLO IOU 交并比 边界框 Bounding Box 置信度 Pc 网格 19x19 多类别检测 锚框 Anchor Boxes 吴恩达 深度学习 CNN 卷积神经网络


生成时间:2026-10-11 00:51:14 生成平台:VideoNote www.xygy.top