这是《目标检测学习笔记》第 02 篇。缘起上一篇把 YOLO 和 DETR 两条路线的分歧讲清了这一篇顺着读 RT-DETR 的源码HGNetV2、AIFI、RTDETRDecoder回答一个问题——DETR 的三笔债收敛慢、编码器重、小目标差RT-DETR 分别是怎么还的。这一篇的核心一句话RT-DETR 没有推翻 DETR它只做了三件事——编码器做减法、查询做加法、监督做乘法。本系列导航01 YOLO 与 DETR两条路线的分岔与汇合02 从 DETR 到 RT-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 的思路人为造一批「已知答案的仿写题」取 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 / ResNet最需要记住的几句话RT-DETR 的三板斧编码器做减法AIFI 只管 S5、查询做加法8400 选 300 可变形采样、监督做乘法去噪造正样本。AIFI 只对 S5 做注意力的理由token 少算得起、语义强收益大低层要的是定位细节交给卷积。查询选择是初筛、解码器是精修——「编码器能打分为什么还要解码器」的答案是分工不同。去噪训练不是把任务变难而是造了一百道已知答案的改错题匹配稳定、正样本 3→100attn_mask 防偷看答案。RepC3 的重参数化和「FPNPAN 同构」说明RT-DETR 是 DETR 的骨架 YOLO 的工程经验。我的复盘读源码之前我以为 RT-DETR 是「把 DETR 加速」的一个工程 trick 集合逐模块对完才发现每个 trick 都精确对应 DETR 的一笔债改进不是堆料是对问题的逐条偿还。我踩过最深的坑是去噪训练直觉上「加噪声 更难 更慢」但那是把「去噪」当成了主任务的负担——它是并行的辅助任务题目自带答案。另一个顿悟是「编码器打分了为什么还要解码器」打分是 O(N) 的初筛精修是带交互的 O(K) 深加工便宜的活和贵的活不能让同一个模块干。到这里「YOLO 路线 → DETR 路线 → RT-DETR 实时化」的主线就通了。后续如果继续这个系列下一个自然是「照着这套逻辑去做自己的改进」——比如 P2 小目标支路、尺度感知 top-k那就是从「读懂」到「改好」的故事了。