4. 目标检测基础理论:IoU、NMS、Anchor 与感受野

各位同学,欢迎来到第四讲。今天我们要啃的这四块骨头——IoU、NMS、Anchor 和感受野——是目标检测的基石。说白了,你后面写的每一行检测代码,都绕不开它们。我当年刚入行时,觉得这些概念太简单,结果第一次调模型就栽了大跟头。嗯,咱们今天就把它们彻底讲透。

4.1 IoU(交并比)—— 检测框的“重合度尺子”

IoU 的全称是 Intersection over Union,中文叫交并比。它衡量的是两个框的重叠程度。

计算公式很简单:

IoU = (A ∩ B) / (A ∪ B)

也就是两个框的交集面积,除以它们的并集面积。结果在 0 到 1 之间。0 表示完全不重叠,1 表示完全重合。

为什么需要 IoU?

在工业视觉里,我们经常要判断模型预测的框准不准。比如检测一个螺丝,模型画了个框,人工标注的框也在那。怎么量化“准不准”?用 IoU。通常 IoU > 0.5 就算检测到了,但工业场景要求更高,我见过最严的客户要求 IoU > 0.85。

核心用途:

  • 评估指标: mAP(平均精度均值)的计算基础就是 IoU。
  • NMS 的输入: 后面马上讲。
  • 损失函数: 比如 GIoU、DIoU、CIoU,都是 IoU 的变体,用来直接优化框的位置。

我的经验: 有一次做 PCB 缺陷检测,模型预测的框总是偏大。我查了 IoU 分布,发现大部分框的 IoU 在 0.6 左右,但召回率很高。后来我把 NMS 的 IoU 阈值从 0.5 调到 0.3,效果立竿见影。所以,阈值不是死的,要根据你的数据调。

4.2 NMS(非极大值抑制)—— 把重复框“干掉”

NMS,全称 Non-Maximum Suppression。它的作用很简单:一个物体只保留一个最好的框。

你想想看,模型在推理时,会在同一个物体周围预测出很多框,有的偏左,有的偏右,有的置信度高,有的低。NMS 就是把这些框里“最不靠谱”的去掉,只留下置信度最高的那个。

NMS 的步骤:

  1. 把所有预测框按置信度从高到低排序。
  2. 选置信度最高的框,保留它。
  3. 计算这个框与其他所有框的 IoU。
  4. 如果 IoU 大于某个阈值(比如 0.5),就把那个框删掉。
  5. 重复步骤 2-4,直到没有框剩下。

避坑指南: 我曾经在一个密集小目标检测项目里,NMS 阈值设得太高(0.7),结果两个挨得很近的螺丝被当成一个物体,漏检了。后来我把阈值降到 0.3,又配合 Soft-NMS,才把召回率提上来。记住:密集场景用低阈值,稀疏场景用高阈值。

NMS 的变体:

方法 核心思想 适用场景
标准 NMS 直接删除 IoU 大于阈值的框 通用场景
Soft-NMS 不直接删除,而是降低置信度 密集小目标
DIoU-NMS 考虑框中心点距离 遮挡场景

4.3 Anchor 机制—— 预设的“模板框”

Anchor,中文叫锚框或先验框。它是目标检测里一个非常巧妙的设计。

我个人的理解是:Anchor 就是一组预设好的、不同大小和长宽比的框。模型在训练时,不是直接预测物体的坐标,而是预测“相对于这些预设框的偏移量”。

为什么需要 Anchor?

因为直接预测坐标太难了。一张 1000x1000 的图,物体可能出现在任何位置,大小也千差万别。模型要同时学位置和大小,收敛很慢。有了 Anchor,模型只需要学“微调”——比如“这个框往右移 5 个像素,宽度放大 10%”。

Anchor 的设计原则:

  • 尺度: 通常用 3 种尺度,比如 32x32、64x64、128x128。
  • 长宽比: 通常用 3 种比例,比如 1:1、1:2、2:1。
  • 组合: 3 种尺度 × 3 种比例 = 9 个 Anchor。

工业实战要点:

  • Anchor 大小要匹配你的目标: 检测螺丝用 32x32 的 Anchor,检测汽车用 128x128 的。
  • 用 K-means 聚类: 我习惯在训练前,用 K-means 对训练集的标注框做聚类,得到最适合当前数据集的 Anchor 尺寸。YOLOv3 就是这么干的。
  • Anchor 不是越多越好: 太多 Anchor 会引入大量负样本,拖慢训练速度。

4.4 感受野计算—— 神经元“看到了多大区域”

感受野(Receptive Field),指的是卷积神经网络中,某一层的一个神经元,对应到输入图像上的区域大小。

说白了,就是“这个神经元看到了多大的原图”。

计算公式:

RF_n = RF_{n-1} + (kernel_size - 1) × stride_product

其中 stride_product 是前面所有层步长的乘积。

举个例子:

假设一个网络有三层卷积,每层 kernel_size=3,stride=1。

  • 第一层:RF = 3
  • 第二层:RF = 3 + (3-1)×1 = 5
  • 第三层:RF = 5 + (3-1)×1×1 = 7

所以第三层的神经元,看到了原图上 7x7 的区域。

我的经验: 在工业缺陷检测中,感受野必须覆盖目标。比如检测 100x100 的划痕,如果感受野只有 30x30,模型就看不到划痕的全貌,容易漏检。我一般会算一下网络最后一层的感受野,确保它至少是目标尺寸的 1.5 倍。

感受野与 Anchor 的关系:

Anchor 的大小应该与感受野匹配。如果感受野是 30x30,你却设了一个 100x100 的 Anchor,那模型看到的区域根本装不下这个 Anchor,预测就会不准。

4.5 知识体系总览

下面这张图,把今天讲的四个概念串起来了。你可以看到它们之间的依赖关系。

目标检测基础理论关系图 目标检测四大基础概念关系图 IoU NMS Anchor 感受野 核心依赖关系 • IoU 是 NMS 的输入:NMS 依赖 IoU 计算框之间的重叠度。 • Anchor 与感受野匹配:Anchor 大小不能超过感受野,否则模型看不到全貌。 • 三者共同决定检测精度:IoU 评估、NMS 去重、Anchor 定位、感受野覆盖。 工业实战建议 1. 用 K-means 聚类 Anchor 尺寸,匹配你的目标。 2. NMS 阈值根据密集程度调整,密集用低阈值。 3. 感受野至少覆盖目标尺寸的 1.5 倍。

本章小结:

  • IoU 是评估框重合度的尺子,也是 NMS 和损失函数的基础。
  • NMS 负责去重,一个物体只留一个框。
  • Anchor 是预设的模板框,模型学的是偏移量。
  • 感受野决定了神经元能看到多大区域,必须覆盖目标。

这四个概念,你掌握了,后面学 YOLO、Faster R-CNN 就会轻松很多。我当年就是没搞懂 Anchor 和感受野的关系,调了半个月的参都没效果。嗯,希望你别走我的弯路。