资讯动态

【目标检测学习笔记 01】YOLO 与 DETR:两条路线的分岔与汇合

发布时间:2026/10/2 6:28:48 来源:尧图企业网站定制
这是《目标检测学习笔记》系列的开篇。缘起我在读 RT-DETR 的 Ultralytics 源码时发现很多困惑query 是什么、匈牙利匹配在干什么、为什么没有 NMS追到底都是同一个问题——YOLO 和 DETR 这两条路线的本质区别是什么。所以这个系列第一篇不写代码先把两条路线放在同一张桌子上对比清楚。这一篇的核心一句话两条路线 90% 的骨架是共享的分岔发生在「head 怎么出框」和「训练时怎么分配正样本」——YOLO 是每个格子都抢答、再删重DETR 是派一组查询直接报答案。本系列导航01 YOLO 与 DETR两条路线的分岔与汇合本篇02 从 DETR 到 RT-DETR实时化改造的三板斧一、先看同两条路线共享的骨架把 YOLOv8 和 DETR 摆在一起会发现它们的主体结构惊人地相似阶段YOLOv8/v11DETRBackboneCSP 系卷积网络ResNet / HGNetV2NeckFPN PAN 多尺度融合DETR 原版只有 C5RT-DETR 补上了 FPNPANHead逐网格密集预测一组 query 集合预测训练分配TAL 一对多匈牙利匹配一对一后处理NMS无 NMS也就是说「卷积提特征 多尺度融合」这一整套两边都要用。真正的分岔从 Head 开始出框的方式不同训练时「谁是正样本」的分配逻辑不同后处理也不同。下面按这三个分岔点逐一展开。二、YOLO 路线密集预测 一对多 NMSYOLO 的世界观物体藏在特征图的格子里那就让每个格子都来抢答。以 640×640 输入、8 倍下采样的特征图为例80×80 6400 个格子每个位置都要预测——「在每个位置预测多个 anchor 的偏移和类别」这句话里的位置指的就是特征图上的每个格子不是物体的位置——这是我卡过的第一个点训练之初模型并不知道物体在哪所以无差别地让所有格子都出框。三个关键词密集预测三层特征图加起来 8400 个候选框80²40²20²大量预测是背景一对多分配TAL训练时一个 GT 会分配给多个正样本格子让它们一起去拟合这个目标——正样本越多监督信号越密收敛越快NMS 去重正因为一个物体有多个框抢答推理时就必须用非极大值抑制NMS把重叠的重复框删掉只留一个。三、DETR 路线集合预测 一对一 无 NMSDETR 的世界观完全不同检测不是「每个格子答一遍」而是「输出一个物体的集合」。DETR 维护一组固定数量的查询query——原版 100 个每个 query 可以理解成一个「可学习的物体探测器」通过交叉注意力去图像特征里「认领」一个物体输出形状是[B, 100, 4]框和[B, 100, 91]类别100 个预测之间没有顺序是一个集合——哪个 query 对应哪个物体不重要重要的是集合整体和 GT 集合对得上训练时用匈牙利算法把 100 个预测和 GT 做一对一最优匹配剩下的 query 全部学习「背景」。两个我当时卡住的小细节为什么是 91 类不是 81 类逻辑上 COCO 是 80 物体 1 背景 81但 COCO 的类别 ID 是 1~90 里取 80 个有 11 个空号DETR 的输出维度直接对齐了 COCO 的 91 个 ID所以代码里是nn.Linear(256, 91)4 维框是什么每个 query 用 4 个数表示框DETR 用归一化的(cx, cy, w, h)——中心点加宽高与图像尺寸解耦。四、分岔点一分配方式——TAL 一对多 vs 匈牙利一对一这是两条路线最深的分岔也是后续一切差异收敛速度、NMS 有无的根源。YOLO 的 TAL一对多一个 GT 认领多个正样本格子大家一起学。好处是监督信号密集、收敛快代价是同一个物体有多个预测框推理时必须 NMS 收场。DETR 的匈牙利匹配一对一构造一个100 × M的代价矩阵C[i][j]表示预测 i 匹配 GT j 的代价C i , j λ c l s ⋅ 分类代价 λ L 1 ⋅ ∥ b i − b j ∥ 1 λ g i o u ⋅ ( 1 − GIoU ) C_{i,j} \lambda_{cls} \cdot \text{分类代价} \lambda_{L1} \cdot \|b_i - b_j\|_1 \lambda_{giou} \cdot (1 - \text{GIoU})Ci,j​λcls​⋅分类代价λL1​⋅∥bi​−bj​∥1​λgiou​⋅(1−GIoU)DETR 论文的权重是 λ_cls1、λ_L15、λ_giou2——框回归的权重远大于分类。匈牙利算法在这个矩阵里找总代价最小的一对一匹配经典二分图匹配O(n³)。一个 3 预测 × 2 GT 的极简例子实际是 100×MGT1GT2pred1-0.97.95pred27.95-0.9pred35.559.55最优匹配显然是 pred1↔GT1、pred2↔GT2总代价 -1.8pred3 匹配背景。注意代价矩阵只用来「找匹配」匹配之后用另一套 loss 训练代价矩阵本身不参与反向传播。代价是什么一对一意味着一张图 3 个物体就只有 3 个正样本其余全是背景——YOLO 一对多的正样本数在极端情况下是一对一的10 倍。所以 DETR 训练早期「监督信号太稀疏」要 500 epoch 才收敛。这个代价正是第二篇 RT-DETR 用去噪训练来偿还的债。五、分岔点二后处理——NMS vs 过滤「DETR 没有 NMS」这句话容易误读成「DETR 没有后处理」。实际上检测器后处理YOLONMS 过滤低分 坐标转换DETRsoftmax → 每个查询取最大类别概率 → 过滤背景和低分 → cxcywh 转像素坐标无 NMSDETR 省掉的只是 NMS 这一步。它敢省的理由有两个训练时匈牙利匹配已经保证每个 GT 只有一个预测推理时query 之间的自注意力会互相「通气」——两个 query 都盯着同一个物体时会互相抑制最终只有一个留下来报高分。六、一个我踩过的误区DETR 的解码器不是 LLM 的解码器学 DETR 之前我刚看完 Transformer 的语言模型讲法脑子里全是「因果 mask、逐词生成、KV 缓存」。于是我很自然地以为 DETR 的解码器也是从左到右逐个生成 100 个物体——完全错了。LLM 式解码器自回归一次生成一个 token用因果 mask 挡住未来推理时靠 KV 缓存提速DETR 的解码器100 个 query并行解码一次前向全部输出没有因果 mask没有逐词生成。两者共享的只有「自注意力 交叉注意力 FFN」这套积木。DETR 的 query 之间做自注意力是为了互相商量「这个物体归谁」而不是为了按顺序生成。分清这两件事之后DETR 的很多设计比如为什么可以一次输出整个集合就顺理成章了。最需要记住的几句话两条路线 90% 同构分岔只在三处出框方式密集 vs 集合、分配方式一对多 vs 一对一、后处理NMS vs 过滤。YOLO 每个特征图格子都出框不是物体位置才出框DETR 用固定数量的 query 集合预测输出无序。匈牙利匹配 代价矩阵分类 1 : L1 5 : GIoU 2 一对一全局最优代价矩阵不参与反传。DETR 省的是 NMS不是全部后处理它敢省靠的是一对一训练 query 自注意力互相抑制。DETR 解码器是并行集合解码别和 LLM 的自回归解码器搞混。我的复盘我最早的认知是「DETR YOLO 换了个 Transformer head」读完才发现真正的主角是分配逻辑NMS 的有无、收敛的快慢全都是「一对多 vs 一对一」这个选择的下游结果。另一个反思我拿着 LLM 的 Transformer 认知直接套 DETR结果在「解码器怎么输出 100 个物体」上空转了半天——同一个积木搭出来的房子户型可以完全不同迁移知识时要先问「哪些假设在这里不成立」。下一篇讲 DETR → RT-DETR 的实时化改造一对一欠下的「监督稀疏」的债怎么用去噪训练还、O(N²) 的编码器怎么砍、8400 个 token 怎么挑出 300 个 query。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑