状态:草稿 (2026-10-13),部分实测。 匈牙利与 GIoU 示例是在笔记本电脑 CPU 上直接运行的值(
code/08_hungarian.py, 1秒以内)。论文数值采用原文数据并连同条件一并搬运,硬件则按级别记录。 写作规则:以实测数据为基础,未能测出的标记为“未实测”。
目录
1. 人工设计的组件
在第 5、6 篇的检测器中,有许多人工设定的组件。包括锚框的大小和比例、为锚框附加正负样本标签的 IoU 阈值、用于消除重复的 NMS 及其阈值。这些组件如果设定得好就能运作,但如果数据发生变化就得重新设定,如果设定错误就会悄悄产生漏洞(第 5 篇的“0 个正样本”、“删除了选手 B 的 NMS”)。
Carion 等人的 DETR (DEtection TRansformer) 改变了问题。检测的正确答案是 边界框的集合。它没有顺序,也没有重复。既然如此,如果模型从一开始就 输出集合 进行训练,是不是就不需要锚框和 NMS 了呢?
2. 架构:N 个查询槽
- CNN 主干网络(如 ResNet-50 等)生成特征图。
- Transformer 编码器通过自注意力机制混合特征图各个位置之间的关系(第 7 篇)。
- Transformer 解码器输入了参与训练的 N=100 个查询槽。每个槽通过交叉注意力机制查看编码器输出,并通过自注意力机制查看彼此。
- 每个槽上的小型 MLP 输出 类别(包含“无物体”)和一个边界框。
槽与槽之间能够互相查看这一点很重要。由于可以在网络内部学习到“那个物体由相邻的槽负责了,所以我来负责别的”,因此消除了消除重复所需的 NMS。实际上,论文报告称如果在最后一层输出上应用 NMS,AP 反而会稍微下降。
3. 训练:1:1 配对
输出有 100 个,正确答案通常有几个。应该将哪个输出与哪个正确答案进行比较来计算损失呢?DETR 寻找的是 成本最小的 1:1 配对。
짝 비용(정답 i, 슬롯 j) = −p_j(정답 i 의 클래스) + 5 · L1(상자) + 2 · (1 − GIoU(상자))
(权重 λ_L1 = 5, λ_iou = 2 为论文中的值。)一旦配对确定,配对的槽学习正确的类别和边界框,未配对的槽学习“无物体”。由于“无物体”对应绝大多数槽,因此将其损失减少到十分之一(与第 4 篇 focal loss 相同的不平衡问题)。解码器的所有层输出也都应用了相同的配对损失,并设置了辅助损失。
这种配对是经典的 分配问题,通过库恩(Kuhn)于 1955 年提出的 匈牙利算法来解决。
GIoU:不重叠也能告知距离
如果两个边界框不重叠,IoU 无论多远都是 0。如果用作损失,则没有梯度。 GIoU(广义交并比,Generalized IoU)使用包围两个边界框的最小框 C,减去“C 内的空白空间”部分。
GIoU = IoU − |C 에서 두 상자의 합집합을 뺀 넓이| / |C| (−1 ~ 1)
手算结果如下(实测)。
| 正确答案 (0,0,10,10) 对比 | IoU | GIoU |
|---|---|---|
| (0,0,10,10) 相同 | 1.000 | +1.000 |
| (5,0,15,10) 半重叠 | 0.333 | +0.333 |
| (12,0,22,10) 相隔 2 格 | 0.000 | −0.091 |
| (30,0,40,10) 相隔 20 格 | 0.000 | −0.500 |
IoU 均为 0,但 GIoU 越远越小。从而产生了将边界框拉向正确答案方向的梯度。
4. 亲自尝试:匈牙利算法
贪心法不行的原因
这是两名选手重叠站立场景中三个槽的成本。槽 0 跨在两名选手之间,与两者都算契合;槽 1 仅与选手 A 契合;槽 2 与选手 B 相当契合。
슬롯 0 슬롯 1 슬롯 2
선수 A 0.9 1.0 6.0
선수 B 0.8 6.0 3.0
如果“按顺序从剩余槽中选择对每个正确答案最便宜的”,A 先拿走槽 0 (0.9),B 接受槽 2 (3.0),总成本为 3.9 。匈牙利算法找到的是 A–槽 1、B–槽 0,总成本为 1.8 (实测)。先选择的一方获胜的方式从整体来看可能会吃亏。如果在训练中使用贪心配对,槽 2 就会错误地学习选手 B,而槽 1 会学习“无物体”。
实现与验证
我们用 numpy 直接编写了使用势能(对偶变量)的 O(n²m) 版本(正确答案 n ≤ 槽 m)。核心在于“逐个增加配对,但如果存在能通过改变现有配对来降低成本的更便宜路径(增广路径),则沿着该路径反转配对”。
| 确认 | 结果(实测) |
|---|---|
| 在 200 个随机 4×7 问题中,总成本与排列组合穷举完全一致 | 200/200 |
| 正确答案 10 × 槽 100 | 0.2ms |
| 正确答案 50 × 槽 100 | 1.4ms |
| 正确答案 100 × 槽 100 | 8.1ms |
| 正确答案 300 × 槽 300 | 67.6ms |
如果用排列组合全部看一遍,仅正确答案 10 × 槽 100 的组合数就达到 6.3×10¹⁹。匈牙利系列算法在多项式时间内(呈 n³ 形式)求解。DETR 的一张图(几十个正确答案 × 100 个槽)在毫秒级,因此不会成为训练的瓶颈。在实际业务中,经常使用 SciPy 的 linear_sum_assignment(修改后的 Jonker–Volgenant 算法)。
使用 DETR 的公式成本(类别概率 + 5·L1 + 2·(1−GIoU))将 3 个正确答案(两名选手、球)与 6 个槽进行配对时,每个正确答案都会附加到最合理的槽上,其余 3 个槽则分配为“无物体”(code/08_hungarian.out.txt).
5. 论文数值
| 模型(COCO 验证) | AP | 小物体 AP_S | 大物体 AP_L | 参数量 | GFLOPs | FPS |
|---|---|---|---|---|---|---|
| Faster R-CNN-FPN+(R50) | 42.0 | 26.6 | 53.4 | 4,200万 | 180 | 26 |
| DETR(R50) | 42.0 | 20.5 | 61.1 | 4,100万 | 86 | 28 |
(论文表 1。Faster R-CNN 侧是带有 GIoU 损失、随机裁剪增强、约 109 个 epoch 的强化版。速度通过 TorchScript 模型测得,未明确指定 GPU。)
- 大物体 +7.8,小物体 −5.5。 编码器的全局注意力能看到整幅图像,因此对大物体很强,但由于特征图只有一种分辨率(1/32),因此对小物体较弱。没有第 5 篇 FPN 那样的多重分辨率。
- 训练时间长。 对比模型为 500 个 epoch,消融实验用的是 300 个 epoch,300 个 epoch 用 16 张数据中心 GPU 花费了 3 天。在训练初期,槽和正确答案的配对每步都在变,每个槽要负责什么并未确定,因此收敛缓慢。
6. 后续研究:减少弱点
| 模型 | 改动之处 | 数值(论文,COCO) |
|---|---|---|
| Deformable DETR(2021) | 用只看基准点周围 几个采样点 (K=4) 的注意力代替全局注意力。使用多种分辨率 | 50 epoch 43.8 AP,AP_S 26.4(DETR 500 epoch 20.5)。训练 GPU 时间 325 对 2,000 |
| DN-DETR(2022) | 向正确答案边界框加入噪声并输入解码器,使其恢复原始边界框的 去噪训练 — 绕过不稳定的配对 | 在相同设置下 +1.9 AP,以一半的 epoch 获得相近的准确率 |
| DINO(2023) | 强化去噪训练 + 改进查询初始化 | ResNet-50 12 epoch 49.4 AP,24 epoch 51.3 AP。Swin-L + Objects365 预训练达到 test-dev 63.3 AP |
| RT-DETR(2024) | 面向实时的混合编码器 | R50 53.1 AP,108fps(推理用数据中心 GPU,TensorRT FP16,640×640)。Apache-2.0 |
DETR 的“集合预测 + 1:1 配对”成为了后来检测的标准工具。第 6 篇中 YOLOv10 去除 NMS 的方法(一对一检测头)以及第 11 篇中 SAM 3 的检测器(DETR 系列)也都是基于这一思想。
7. 局限性与我们的项目
- 小物体仍然很困难。虽然后续模型大幅减少了这一问题,但要将直径只有几个像素的乒乓球作为边界框集合来查找,相比热力图方法(第 3 篇)并不占优势。
- 配对决定训练。 成本权重(类别 1、L1 5、GIoU 2)决定了“什么被视为同一个物体”。如果改变这些值,模型学到的东西也会改变。
- 在我们的项目中, 目前还没有直接使用 DETR 系列。不过,作为寻找乒乓球桌文字的候选方案,SAM 3 的检测器属于 DETR 系列(第 11 篇),并且当未来需要人手和球拍边界框时,能够无需 NMS 部署的 RT-DETR (Apache-2.0) 是避开第 6 篇 AGPL 问题的候选者(未实测)。
从下一篇文章开始是分割。这是只需点击一下即可涂抹任何内容的 Segment Anything (SAM)。
Titi 小贴士。 依次选择最便宜的是 3.9,而匈牙利算法是 1.8。先选的人拿走所有东西的方式在团体赛中是吃亏的。
参考文献
- Carion, N., Massa, F., Synnaeve, G., Usunier, N., Kirillov, A., Zagoruyko, S. (2020). End-to-End Object Detection with Transformers. ECCV 2020. https://arxiv.org/abs/2005.12872
- Kuhn, H. W. (1955). The Hungarian method for the assignment problem. Naval Research Logistics Quarterly, 2(1–2), 83–97. https://doi.org/10.1002/nav.3800020109
- Rezatofighi, H. et al. (2019). Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression. CVPR 2019. https://arxiv.org/abs/1902.09630
- Zhu, X. et al. (2021). Deformable DETR: Deformable Transformers for End-to-End Object Detection. ICLR 2021. https://arxiv.org/abs/2010.04159
- Li, F. et al. (2022). DN-DETR: Accelerate DETR Training by Introducing Query DeNoising. CVPR 2022. https://arxiv.org/abs/2203.01305
- Zhang, H. et al. (2023). DINO: DETR with Improved DeNoising Anchor Boxes for End-to-End Object Detection. ICLR 2023. https://arxiv.org/abs/2203.03605
- Zhao, Y. et al. (2024). DETRs Beat YOLOs on Real-time Object Detection. CVPR 2024. https://arxiv.org/abs/2304.08069
- SciPy
linear_sum_assignment: https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.linear_sum_assignment.html - 匈牙利算法的时间复杂度总结: https://en.wikipedia.org/wiki/Hungarian_algorithm
- 示例代码与输出:此文件夹中的
code/08_hungarian.py,code/08_hungarian.out.txt