4. 目标检测基础理论
各位同学,欢迎来到第四讲。今天我们要啃的这四块骨头——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 的步骤:
- 把所有预测框按置信度从高到低排序。
- 选置信度最高的框,保留它。
- 计算这个框与其他所有框的 IoU。
- 如果 IoU 大于某个阈值(比如 0.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 和损失函数的基础。
- NMS 负责去重,一个物体只留一个框。
- Anchor 是预设的模板框,模型学的是偏移量。
- 感受野决定了神经元能看到多大区域,必须覆盖目标。
这四个概念,你掌握了,后面学 YOLO、Faster R-CNN 就会轻松很多。我当年就是没搞懂 Anchor 和感受野的关系,调了半个月的参都没效果。嗯,希望你别走我的弯路。