目标检测学习笔记合集:YOLO、DETR 与 RT-DETR 完整合集 目标检测学习笔记合集YOLO、DETR 与 RT-DETR 完整合集按知识主题整合概念、例题、答疑与纠错目录仅列主章节复盘与学习方法集中在文末。文章目录目标检测学习笔记合集YOLO、DETR 与 RT-DETR 完整合集一、预测骨架密集检测与集合检测二、训练分配、匹配代价与后处理三、RT-DETR编码器、查询与解码器四、去噪监督与训练推理差异五、复盘、对照速查与改进方向一、预测骨架密集检测与集合检测读 RT-DETR 的 Ultralytics 源码时query 的含义、匈牙利匹配与无 NMS 等疑问都会指向同一个问题YOLO 和 DETR 两条路线的本质区别是什么。因此先把预测、分配和后处理放在同一框架中比较再理解实时化改造。路线比较的核心两条路线 90% 的骨架是共享的分岔发生在「head 怎么出框」和「训练时怎么分配正样本」——YOLO 是每个格子都抢答、再删重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)——中心点加宽高与图像尺寸解耦。图中心点—宽高和两角点是常见框表示归一化坐标需分别结合图像宽高换算公式与像素边界约定应按具体实现确认。解码器答疑集合并行预测与自回归生成的区别学 DETR 之前我刚看完 Transformer 的语言模型讲法脑子里全是「因果 mask、逐词生成、KV 缓存」。于是我很自然地以为 DETR 的解码器也是从左到右逐个生成 100 个物体——完全错了。LLM 式解码器自回归一次生成一个 token用因果 mask 挡住未来推理时靠 KV 缓存提速DETR 的解码器100 个 query并行解码一次前向全部输出没有因果 mask没有逐词生成。两者共享的只有「自注意力 交叉注意力 FFN」这套积木。DETR 的 query 之间做自注意力是为了互相商量「这个物体归谁」而不是为了按顺序生成。分清这两件事之后DETR 的很多设计比如为什么可以一次输出整个集合就顺理成章了。二、训练分配、匹配代价与后处理分岔点一分配方式——TAL 一对多 vs 匈牙利一对一这是两条路线最深的分岔也是后续一切差异收敛速度、NMS 有无的根源。图示例一对一分配的交叉配对总代价为 4按第一行最小值贪心会留下总计 101 的组合匹配是离散分配过程训练损失随后按配对计算。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 都盯着同一个物体时会互相抑制最终只有一个留下来报高分。三、RT-DETR编码器、查询与解码器沿着 HGNetV2、AIFI 和 RTDETRDecoder 的源码可以逐项分析DETR 的三笔债收敛慢、编码器重、小目标差RT-DETR 分别怎样改进。实时化改造的核心RT-DETR 没有推翻 DETR它只做了三件事——编码器做减法、查询做加法、监督做乘法。DETR 的三笔债问题原因收敛慢原版 500 epoch匈牙利一对一匹配正样本太少图里 3 个物体就只有 3 个正样本训练早期监督信号极度稀疏且匹配每轮都在震荡编码器重原版对所有特征 token 做全局自注意力O(N²)token 一多推理就慢小目标差只用 C5 单尺度特征1/32 分辨率小目标在这个尺度上只剩几个像素RT-DETR 的目标保留「端到端、无 NMS」的优点把速度做到 YOLO 级别。三笔债对应三板斧。第一板斧编码器做减法——AIFI CCFFAIFIAttention-based Intra-scale Feature Interaction尺度内特征交互只对最高层 S5做自注意力。S5 是 20×20 400 个 token计算量可控而且高层语义最完整做全局交互收益最大。低层 P3/P4 分辨率高、token 多做注意力算不起而且它们更需要的是定位细节而非全局语义——这个取舍本身就是后续改进的切入点比如给 P4 加一路轻量 AIFI。CCFF跨尺度特征融合就是把 YOLO 那套 FPN PAN 搬了过来——自顶向下把语义传给低层自底向上把细节传回高层。它和 YOLO 的 PAN/FPN 几乎同构唯一区别是融合块结构位置YOLOv8YOLOv11RT-DETRConcat 后的融合模块C2fC3k2RepC3RepC3 是重参数化模块训练时多分支类似 RepVGG推理时把多分支卷积核融合成一条部署零额外开销——这是 RT-DETR 从 YOLO 工程经验里直接借来的钱。第二板斧查询做加法——查询选择 可变形注意力1. IoU-aware Query Selection8400 选 300原版 DETR 的 query 是随机初始化的可学习 embedding训练初期两眼一抹黑。RT-DETR 的做法三路特征投影到 256 维展平拼接 → 8400 个 token80²40²20² ↓ enc_score_head 给每个 token 打分 ↓ 取 top-300 作为初始 query 查询内容 被选中 token 的特征不是随机 embedding 参考框 初始 anchor enc_bbox_head 预测的修正量查询从「盲人」变成了「带着先验知识的侦探」——训练一开始就知道去哪儿看收敛自然快。我卡过的一个问题「编码器都能给每个 token 打分了为什么还需要解码器」答案打分只是初筛哪些位置像物体解码器才是精修和消歧——同一位置可能有多个物体重叠、框需要逐层修正、query 之间还要互相商量「这个物体归谁」。初筛便宜精修昂贵分工不同。2. 可变形注意力O(N²) → O(N)原版解码器的交叉注意力要对 8400 个 token 全量计算。可变形注意力的做法每个 query 以参考框为中心只采样少数几个点每头每尺度 4 个点8 头 × 3 尺度 96 个点而不是 8400 个偏移量是学出来的——模型自己决定看参考框附近的哪几个位置用双线性插值取特征再加权求和权重也学出来多尺度天然融合三个尺度各采 4 个点相当于问「三个层级的证人」。3. 逐层精修解码器 6 层每层做同一件事采样 → 预测框偏移 → 更新参考框。第 1 层出粗框第 6 层出精框每一层都有辅助 loss浅层学粗、深层学细梯度也更充分。顺带一个小知识为什么框回归用 MLP多层非线性而分类只用一层 Linear框偏移和特征的关系是非线性的类别分数近似线性可分——把复杂度花在刀刃上。四、去噪监督与训练推理差异第三板斧监督做乘法——CDN 对比去噪训练一对一匹配的正样本太少3 个物体 3 个正样本这个债怎么还RT-DETR 借用 DN-DETR 的思路人为造一批「已知答案的仿写题」图去噪查询与监督损失属于训练支路推理不需要真实标注或该加噪分支具体输出层、top-k 与后处理规则应以相应 DETR/RT-DETR 实现为准。取 GT 框 [0.5, 0.5, 0.3, 0.3] ↓ 加两类噪声类别噪声 框噪声→ [0.52, 0.47, 0.31, 0.28] ↓ 生成 100 个「去噪查询」拼在 300 个正常查询前面 ↓ 解码器的任务从噪声框还原出 GT ↓ 匹配预先确定不需要匈牙利算法我最初的本能反应是加噪声不是让任务更难吗怎么会加速收敛方向想反了——去噪查询带来的全是好处维度正常查询去噪查询匹配匈牙利算法每轮震荡预先确定稳定正样本数3 个100 个作用主任务辅助任务教会模型「框偏移怎么算」类比一对一是「把 3 道开放式大题」去噪是「额外给 100 道「改错题」——答案就藏在题目旁边学生解码器先靠改错题学会解题手法再迁移到大题上」。工程细节attn_mask 保证正常查询看不见去噪查询、各组去噪查询互不可见否则等于偷看答案训练就泄漏了。训练与推理的不对称维度训练推理查询总数300 100 400300去噪查询有无dn_metaNone解码器输出每层都输出、都算 loss只用最后一层匈牙利匹配有无后处理无展平打分 → top-k → 过滤无 NMS推理时整条链路没有 NMS——这是 DETR 系和 YOLO 最本质的工程差异。五、复盘、对照速查与改进方向总表三笔债、三板斧、三家对比DETR 的债 vs RT-DETR 的还法DETR 的问题RT-DETR 的解法对应模块编码器太重只对 S5 做注意力其余卷积融合AIFI CCFF查询质量差、收敛慢从 8400 个 token 里选 top-300 当查询IoU-aware Query Selection解码器注意力太贵参考框附近稀疏采样O(N²)→O(N)可变形注意力一对一监督稀疏GT 加噪造 100 个已知答案的正样本CDN 对比去噪小目标差C3/C4/C5 多尺度CCFF 多尺度采样YOLO vs RT-DETR 速查把基础路线的比较扩展到 RT-DETR维度YOLOv8/v11RT-DETR后处理top-k NMS无 NMS正样本分配TAL一对多、动态匈牙利一对一损失BCE CIoU DFLVFL L1 GIoUHead逐网格密集预测300 个稀疏 query编码器PAN/FPNAIFI仅 S5 CCFF骨干自研 CSP 系HGNetV2 / ResNetYOLO 与 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 个物体」上空转了半天——同一个积木搭出来的房子户型可以完全不同迁移知识时要先问「哪些假设在这里不成立」。RT-DETR 要点RT-DETR 的三板斧编码器做减法AIFI 只管 S5、查询做加法8400 选 300 可变形采样、监督做乘法去噪造正样本。AIFI 只对 S5 做注意力的理由token 少算得起、语义强收益大低层要的是定位细节交给卷积。查询选择是初筛、解码器是精修——「编码器能打分为什么还要解码器」的答案是分工不同。去噪训练不是把任务变难而是造了一百道已知答案的改错题匹配稳定、正样本 3→100attn_mask 防偷看答案。RepC3 的重参数化和「FPNPAN 同构」说明RT-DETR 是 DETR 的骨架 YOLO 的工程经验。RT-DETR 阅读复盘与后续改进思路读源码之前我以为 RT-DETR 是「把 DETR 加速」的一个工程 trick 集合逐模块对完才发现每个 trick 都精确对应 DETR 的一笔债改进不是堆料是对问题的逐条偿还。我踩过最深的坑是去噪训练直觉上「加噪声 更难 更慢」但那是把「去噪」当成了主任务的负担——它是并行的辅助任务题目自带答案。另一个顿悟是「编码器打分了为什么还要解码器」打分是 O(N) 的初筛精修是带交互的 O(K) 深加工便宜的活和贵的活不能让同一个模块干。把“YOLO 路线 → DETR 路线 → RT-DETR 实时化”连起来后可以尝试以 P2 小目标支路、尺度感知 top-k 等为候选改进方向再验证其是否确实解决了对应问题。