状态:草稿(2026-10-13),部分实测。 IoU、锚框、NMS 的示例是在笔记本 CPU 上直接运行得到的值(
code/05_boxes.py, 1秒以内)。论文中的数据引自原文并附带了相应的条件。硬件配置以等级形式记录。 编写规则:以实测数据为基础,无法测量的标注为“未实测”。
目录
- 1. 什么是检测,以及 IoU
- 2. R-CNN (2014):为每个候选区域运行 CNN
- 3. Fast R-CNN (2015):CNN 仅在整张图上运行一次
- 4. Faster R-CNN (2015):寻找候选区域也由网络完成
- 5. 接下来:FPN
- 6. 局限性
- 7. 与我们项目的关联
- 参考文献
1. 什么是检测,以及 IoU
分类是指“这张图里有什么”,而 检测是指“有什么、在什么地方、有多少个”。输出的是每个物体的 (x1, y1, x2, y2) 边界框、类别以及置信度。
边界框的准确程度通过 IoU(Intersection over Union,交并比)来衡量。它是两个边界框的相交面积除以合并面积得到的值,完全重合时为 1,不重合时为 0。手动计算的结果如下(实测)。
| 真实边界框 | 预测边界框 | IoU |
|---|---|---|
| (0, 0, 10, 10) | (5, 0, 15, 10) 重合一半 | 0.333 |
| (0, 0, 10, 10) | (5, 5, 15, 15) 仅边缘重合 | 0.143 |
| (0, 0, 10, 10) | (1, 1, 11, 11) 错位 1 格 | 0.681 |
| (0, 0, 10, 10) | (20, 20, 30, 30) 分离 | 0.000 |
即使“重合一半”,IoU 也不是 0.5 而是 0.33。仅仅错位 1 格,IoU 就会降至 0.68。物体越小,几个像素的误差对 IoU 的影响就越大,这就是为什么像乒乓球这样小的物体很难进行边界框检测的原因之一。检测论文中的“AP”和“mAP”是指将超过 IoU 阈值(通常为 0.5,COCO 为 0.5–0.95 的平均值)的预测视为正确,并在此基础上计算出的精准率-召回率曲线下面积(计算过程将在第 6 篇中亲自尝试)。
检测的根本难k题在于 无法预先知道物体的数量和大小。它不像分类那样可以固定输出单元的数量。双阶段检测器给出的回答是:“首先充裕地提取出可能存在物体的候选区域,然后对每个候选区域运行分类器。”
2. R-CNN (2014):为每个候选区域运行 CNN
Girshick 等人提出的 R-CNN 是将第 1 篇中 AlexNet 展示的 CNN 特征成功引入检测领域的开端。
- 候选边界框:通过合并颜色和纹理相似区域的经典算法(选择性搜索,selective search),每张图片大约提取 2,000 个候选区域。
- CNN 特征:针对每个候选区域裁剪图片并缩放到 227×227(包含周围 16 像素的边距),然后输入 CNN。
- 分类与校正:针对每个类别使用线性 SVM 进行判定,并单独训练一个用于微调边界框位置的回归器。仅边界框校正就使 mAP 提升了 3–4 个点。
结果(论文):PASCAL VOC 2010 mAP 53.7%,VOC 2012 53.3%(比以往最高水平相对高出 30% 以上),ILSVRC2013 检测 31.4%(OverFeat 为 24.3%)。然而, 每张图片在 GPU 上耗时 13 秒,在 CPU 上耗时 53 秒。这是因为需要为 2,000 个候选区域分别运行 CNN。这就好比重叠的候选区域对相同的像素重复计算了 2,000 次。
3. Fast R-CNN (2015):CNN 仅在整张图上运行一次
解决方法是改变顺序。让 整张图片通过一次 CNN 生成特征图,然后在 该特征图上 裁剪出候选边界框。
- RoI 池化:在特征图上将大小各异的候选区域划分为固定大小(VGG16 为 7×7),并提取每个单元格的最大值。只有这样,才能输入到后面的全连接层中。
- 多任务损失:将分类损失和边界框校正损失(smooth L1:误差小于 1 时为平方,大于 1 时为绝对值)相加,在同一个网络中进行联合训练。它将 R-CNN 中分别训练 SVM 和回归器的多个阶段合并为一个。
结果(论文,VGG16,单张数据中心 GPU):训练耗时 9.5 小时(R-CNN 为 84 小时),每张测试图片耗时 0.32 秒(比 R-CNN 快 213 倍 )。VOC 2007 mAP 66.9%(07 数据)·70.0%(07+12),VOC 2012 65.7%·68.4%。然而,此时剩下的瓶颈已经不是 CNN,而是 提取候选边界框的选择性搜索(selective search) 。在下一篇论文(Faster R-CNN)的表格中,selective search + Fast R-CNN 每张图耗时 1830ms,而 Fast R-CNN 本体仅需 0.3 秒左右,这意味着其余大部分时间都花在寻找候选区域上。
4. Faster R-CNN (2015):寻找候选区域也由网络完成
Ren 等人将寻找候选区域本身替换为了 CNN 特征之上的一个小网络—— RPN(Region Proposal Network,区域生成网络)。由于 RPN 与检测器共享特征图,因此获取候选区域几乎是免费的。
锚框
RPN 在特征图的每个单元格中预先放置了 k 个 基准边界框(锚框) 。默认设置为面积 128²·256²·512² × 长宽比 1:1·1:2·2:1 = 9 个。模型会为每个锚框输出两类信息:
- 该锚框中是否存在物体(物体/背景得分)
- 需要将锚框平移和缩放多少才能契合物体(4 个校正值)
核心思想是不从零开始直接猜出边界框,而是去预测“从基准边界框需要修改多少”。由于大物体、小物体、长条形物体各自从相似的锚框出发,因此训练变得更容易。
动手尝试:铺设锚框与贴标签
我们在 1000×600 的图片上、以特征图步幅 16 尝试铺设了锚框(实测)。
| 项目 | 我们的计算 | 论文 |
|---|---|---|
| 特征图单元格数 | 62×37 = 2,294 | 约 2,400 (60×40) |
| 锚框数 | 20,646 | 约 20,000 |
| 未超出图片范围的锚框 | 8,044 | 约 6,000(用于训练) |
最后一行似乎取决于决定锚框中心和大小的细节规则(四舍五入、中心点放在单元格的什么位置),其原因未做单独确认。
标签规则为:IoU 超过 0.7 为正样本(物体),小于 0.3 为负样本(背景),两者之间则从训练中排除。我们放置了一个宽 180 × 高 240 的物体(例如:画面中运动员的上半身)并尝试贴标签。
IoU>0.7 양성 0개, IoU<0.3 음성 7,502개, 사이(무시) 542개, 가장 잘 맞는 앵커 IoU 0.659
가장 잘 맞는 앵커 [232, 168, 488, 424] → 보정값 tx,ty,tw,th = [0.117, 0.016, -0.352, -0.065]
正样本数为 0。如果 9 种锚框的大小和比例与该物体并不完全匹配,则可能没有 IoU 超过 0.7 的锚框。因此,论文中附加了一条规则:“对于每个真实边界框,IoU 最高的锚框也被视为正样本”。如果没有这条规则,该物体将在训练中被完全忽略。这个例子展示了锚框设计(大小和比例)必须与数据的物体形状相匹配,并且当不匹配时,需要用规则来填补漏洞。
校正值采用的是 tx = (정답 중심 x − 앵커 중심 x) / 앵커 너비, tw = log(정답 너비 / 앵커 너비) 的形式。通过除以锚框大小并使用对数,使得大物体和小物体的误差成为大小相近的数字。
NMS:清除重叠的候选区域
由于同一个物体会产生多个相似的候选区域,因此通过 非极大值抑制(NMS)来进行整理。保留得分最高的边界框,删除与其 IoU 超过阈值的其余边界框,然后重复此过程。我们用两位运动员半重叠站立场景下的 4 个候选区域(运动员 A 对应 0 和 1,运动员 B 对应 2 和 3)进行了测试(实测)。
| NMS 阈值 | 剩余候选区域 | 结果 |
|---|---|---|
| 0.3 | [0] | 漏掉 运动员 B(A 和 B 的 IoU 为 0.33) |
| 0.5 | [0, 2] | 正确答案 |
| 0.9 | [0, 2, 1] | 运动员 A 被捕获 两次 (0 和 1 的 IoU 为 0.86) |
无法仅凭一个阈值同时区分“相互重叠的不同物体”和“同一物体的重复检测”。这就是 NMS 在人群拥挤的场景中表现薄弱的原因,也是第 8 篇中的 DETR 试图消除 NMS 的动机。
结果(论文)
RPN 通过 NMS(阈值 0.7)将候选区域减少到约 2,000 个,测试时仅使用 300 个。它以比 selective search 的 2,000 个更少的候选区域实现了更高的准确率。
| 项目 | 值 | 条件 |
|---|---|---|
| 速度 | 每张图 198ms(约 5fps) | VGG-16,单张数据中心 GPU。selective search + Fast R-CNN 为 1,830ms |
| VOC 2007 | mAP 73.2% | 07+12 训练 |
| VOC 2012 | mAP 70.4% | 07++12 训练 |
| COCO test-dev | AP@0.5 42.7, AP@[.5,.95] 21.9 | VGG-16,trainval 训练 |
5. 接下来:FPN
如果物体大小各异,单张特征图是不够的。FPN(Feature Pyramid Network,特征金字塔网络,2017)将深层特征放大 2 倍向下传递(自顶向下),并通过 1×1 卷积与相同分辨率的浅层特征对齐,从而构建出 相加 的金字塔。小物体在髙分辨率层中寻找,大物体在低分辨率层中寻找。这与第 3 篇中的 U-Net 构思相似。如果在 Faster R-CNN 中加入 FPN(ResNet-101),其 COCO test-dev AP 为 36.2(单模型)。
6. 局限性
- 速度慢。 双阶段(候选区域 → 判定)虽然准确,但对于实时应用而言过于笨重。5fps 远远无法满足每秒 60 张图片的乒乓球视频的需求。第 6 篇的单阶段检测器正是针对这一问题。
- 人工设定的参数多。 锚框的大小和比例、IoU 0.7/0.3 的阈值、NMS 的阈值全都是由人工设定的。正如第 4 节实验所展示的,如果这些数值与数据不匹配,就会悄悄产生漏洞。
- 小物体。 步幅为 16 的特征图上的一个单元格大小为 16×16 像素。直径为 3–12px 的乒乓球比单个单元格还要小。
7. 与我们项目的关联
TT Score 不通过 边界框来寻找球,而是通过 热力图中寻找(第3篇)。因为上述三个局限性都对应于乒乓球。相反,物体检测器用于寻找人。精细姿态分析采用“自顶向下(top-down)”的方法,即先用人体检测器(RTMDet)找到人体的边界框,然后裁剪出该边界框来寻找关节(TT Score模型剖析第4篇)。检测器 → 裁剪后精确判定的结构与两阶段检测器的思路是一样的。
TT小结。 即使只重叠一半,IoU也是0.33。边界框匹配比想象中要严格得多。
参考文献
- Girshick, R., Donahue, J., Darrell, T., Malik, J. (2014). Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation. CVPR 2014. https://arxiv.org/abs/1311.2524
- Girshick, R. (2015). Fast R-CNN. ICCV 2015. https://arxiv.org/abs/1504.08083
- Ren, S., He, K., Girshick, R., Sun, J. (2015). Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks. NeurIPS 2015. https://arxiv.org/abs/1506.01497
- Lin, T.-Y. et al. (2017). Feature Pyramid Networks for Object Detection. https://arxiv.org/abs/1612.03144
- 示例代码与输出:此文件夹中的
code/05_boxes.py,code/05_boxes.out.txt