犀牛鸟 2026 研究笔记 estelledc.github.io

第 9 章 · RT-DETR——实时 Transformer 检测器的突破

开场:两个世界的碰撞

在目标检测领域,长期存在两个相对独立的阵营:

YOLO 阵营:以卷积为核心,极致追求速度,工程优先,anchor→anchor-free 演进。特点是简单、快、好部署。

DETR 阵营:以 Transformer 为核心,追求架构优雅,一出生就是 NMS-Free。特点是端到端、精度高,但速度慢、训练难。

RT-DETR 是第一个成功打破这两个阵营壁垒的模型——它证明了 Transformer 检测器也可以做到实时速度。这就像有人用纯电动车跑出了和燃油赛车一样的圈速——打破了”电动车跑不快”的固有认知。


DETR 家族简史

要理解 RT-DETR,需要先了解它的”家族”。

初代 DETR (2020, Facebook)

DETR 的核心思想:把目标检测当作一个集合预测问题——输入一张图,直接输出一组检测结果,不需要 anchor、NMS、手工设计的后处理。

初代 DETR 的架构:
  图像 → CNN Backbone → Transformer Encoder → Transformer Decoder → 检测结果
                                                    ↑
                                              learnable queries (100个)

初代 DETR 的问题很明显:训练需要 500 个 epoch 才能收敛(YOLOv8 只需要 300-500 epoch 但每个 epoch 更快),小目标检测效果差(因为 CNN backbone 输出的特征图只有一个尺度),推理速度慢。

Deformable DETR (2021)

用 Deformable Attention 替代标准 Attention——不看全图所有位置,只看每个 query 周围的少量采样点。训练收敛速度提升 10 倍以上。但引入了 CUDA 自定义算子,部署更复杂。

DINO (2023)

在 Deformable DETR 基础上增加了对比学习和混合 query 选择,在 COCO 上达到了 DETR 系列的 SOTA。但仍然不是实时的——推理速度约 20-30 FPS,达不到 YOLO 系列 100+ FPS 的水平。

RT-DETR (2023, 百度)

RT-DETR 的突破:在保持 DETR 家族”端到端、NMS-Free”优势的同时,把推理速度提升到实时水平(T4 GPU 上 100+ FPS)。


RT-DETR 的架构

整体结构

输入图像
    │
    ▼
┌─────────────────────┐
│  CNN Backbone        │   特征提取
│  (ResNet / HGNetv2)  │   输出 S3, S4, S5 三个尺度
└───┬───┬───┬─────────┘
    │   │   │
    ▼   ▼   ▼
┌─────────────────────┐
│  Hybrid Encoder      │   特征融合 + 全局建模
│  (AIFI + CCFM)       │   这是 RT-DETR 的核心创新
└───┬───┬───┬─────────┘
    │   │   │
    ▼   ▼   ▼
┌─────────────────────┐
│  IoU-aware Query     │   从 Encoder 输出中选 Top-K
│  Selection           │   作为 Decoder 的初始 query
└─────────┬───────────┘
          │
          ▼
┌─────────────────────┐
│  Transformer Decoder │   Query 和图像特征交互
│  (6 层)              │   输出最终检测结果
└─────────────────────┘

Backbone: HGNetv2

RT-DETR 默认使用百度自研的 HGNetv2 作为 backbone。HGNetv2 的设计目标是”GPU 友好”——用大量的标准 Conv 替代 Depthwise Conv(Depthwise Conv 虽然理论 FLOPs 低,但在 GPU 上由于内存访问模式不友好,实际速度可能并不快)。

HGNetv2 vs ResNet:
  ResNet-50:  25.6M params, 4.1G FLOPs, 适合通用场景
  HGNetv2-L:  更少 FLOPs 但更高精度, GPU 推理速度更快

关键设计:
  - 大量 3×3 标准 Conv(GPU 优化最好的算子)
  - 用 LCNet 风格的 Stem(快速下采样)
  - ESE Attention(轻量通道注意力)

Hybrid Encoder: AIFI + CCFM

这是 RT-DETR 最核心的创新——用一个混合编码器替代原来的多层 Transformer Encoder。

AIFI (Attention-based Intra-scale Feature Interaction)

# AIFI: 只在最小尺度 (S5, 20×20) 做自注意力
class AIFI(nn.Module):
    def __init__(self, dim, num_heads=8):
        super().__init__()
        self.attn = nn.MultiheadAttention(dim, num_heads)
        self.ffn = FFN(dim)

    def forward(self, s5):
        # s5: [batch, 20*20, dim]
        # 只在 S5 做自注意力:20×20=400 个 token
        # 相比在全部尺度做(400+1600+6400=8400):计算量减少 441 倍
        out = self.attn(s5, s5, s5)
        return self.ffn(out)

为什么只在 S5 做注意力? RT-DETR 的关键洞察是:低分辨率特征(S5)包含了最丰富的语义信息,高分辨率特征(S3)主要提供位置细节。对语义信息做全局建模(自注意力)收益大,对位置细节做全局建模收益小——因为位置信息本身就是局部的。

CCFM (CNN-based Cross-scale Feature-fusion Module)

CCFM: 用卷积(而非注意力)做跨尺度融合

        S3 (80×80) ←─── 上采样 ─── S4 (40×40) ←─── 上采样 ─── S5' (20×20)
        │                           │                           │
        ├── RepBlock ───→           ├── RepBlock ───→           │
        │                           │                           │
        P3 (80×80) ──── 下采样 ──→ P4 (40×40) ──── 下采样 ──→ P5 (20×20)

CCFM 的设计理念和 YOLO 的 PAN 类似——双向融合。但 RT-DETR 用 RepBlock(训练时多分支、推理时合并为单个 Conv 的模块)代替普通 Conv,在不增加推理成本的前提下提升了融合质量。

IoU-aware Query Selection

初代 DETR 使用 learnable queries——100 个随机初始化的可学习向量。这导致了收敛慢的问题(模型需要从零学会每个 query 应该负责图像的哪个区域)。

RT-DETR 改用”从 Encoder 输出中选择”的策略:

# IoU-aware Query Selection
def select_queries(encoder_output, num_queries=300):
    # encoder_output: [batch, H*W, dim]

    # 用一个小网络预测每个位置的"目标存在概率"和"IoU 质量"
    cls_score = cls_head(encoder_output)   # [batch, H*W, num_classes]
    iou_score = iou_head(encoder_output)   # [batch, H*W, 1]

    # 综合分数 = 分类分数 * IoU 分数
    combined_score = cls_score * iou_score

    # 选 Top-300 个位置作为初始 query
    topk_indices = combined_score.max(dim=-1).values.topk(300).indices

    # 用这些位置的特征初始化 Decoder 的 query
    queries = encoder_output[topk_indices]
    return queries

为什么叫”IoU-aware”? 因为选择时不仅看分类分数,还看 IoU 质量分数。一个位置可能分类很自信(”这是一个人”),但框的质量很差(IoU 只有 0.3)。IoU-aware 选择避免了”自信但不准确”的位置被选中。

Transformer Decoder

RT-DETR 的 Decoder 有 6 层,每层包含:

class DecoderLayer(nn.Module):
    def forward(self, query, memory):
        # 1. Self-Attention: query 之间互相通信(去重的关键)
        query = self.self_attn(query, query, query)

        # 2. Cross-Attention: query 和图像特征(memory)交互
        #    使用 Deformable Attention:每个 query 只看少量采样点
        query = self.cross_attn(query, memory)

        # 3. FFN: 前馈网络
        query = self.ffn(query)

        return query

6 层 Decoder 足以让 query 之间充分”沟通”——避免两个 query 检测同一个目标。这就是 RT-DETR 天然 NMS-Free 的原因。


RT-DETR 的灵活缩放

RT-DETR 有一个独特的特性:可以通过调整 Decoder 层数来灵活控制速度-精度 trade-off,而不需要重新训练。

RT-DETR-L (6 层 Decoder): mAP 53.0, 延迟 9.3ms    ← 完整版
RT-DETR-L (5 层 Decoder): mAP 52.5, 延迟 8.1ms    ← 去掉最后一层
RT-DETR-L (4 层 Decoder): mAP 51.8, 延迟 7.0ms    ← 去掉最后两层
RT-DETR-L (3 层 Decoder): mAP 50.6, 延迟 5.8ms    ← 只留一半

这在 YOLO 系列中做不到——你不能从 YOLOv8m 上”去掉几层”来变成一个更快的版本,因为 YOLO 的特征流是紧密耦合的。RT-DETR 的 Decoder 层是相对独立的,去掉后面几层只会降低”去重的充分性”和”检测的精细度”,但不会破坏整个模型。


性能对比

模型 Backbone 参数量 FLOPs COCO mAP 延迟 (T4 TRT)
YOLOv8s CSPDarknet 11.2M 28.6G 44.9 7.07ms
YOLOv8m CSPDarknet 25.9M 78.9G 50.2 9.50ms
YOLOv8l CSPDarknet 43.7M 165.2G 52.9 12.39ms
RT-DETR-R50 ResNet-50 42M 136G 53.1 9.3ms
RT-DETR-R101 ResNet-101 76M 259G 54.3 13.5ms
RT-DETR-L HGNetv2-L 32M 110G 53.0 9.3ms
RT-DETR-X HGNetv2-X 67M 234G 54.8 15.6ms

几个值得注意的对比:


RT-DETR vs YOLO:范式差异

维度 YOLO 系列 RT-DETR
特征提取 纯卷积 卷积 Backbone + Transformer Encoder
全局信息 靠堆叠卷积层间接获取 Self-Attention 直接获取
检测方式 密集预测(每个位置都预测) 稀疏预测(300 个 query)
去重方式 NMS(后处理) Self-Attention(模型内部)
训练信号 TAL(多对多分配) 匈牙利匹配(一对一分配)
模型缩放 调宽度/深度倍数 调 Decoder 层数
小模型效率 卷积在小模型上更高效 Transformer 开销相对更大
大模型精度 受限于局部感受野 全局建模优势更大
部署难度 简单(标准算子) 较复杂(Deformable Attention 需要 CUDA)

部署挑战:Deformable Attention

RT-DETR 在部署上的最大挑战是 Deformable Attention。这个算子需要根据每个 query 动态计算采样位置,用标准的 ONNX 算子很难表达,通常需要自定义 CUDA 算子。

部署友好度:
  YOLOv8:    ★★★★★  全部是标准 Conv/BN/SiLU,所有框架都支持
  YOLOv10:   ★★★★☆  和 YOLOv8 类似,PSA 用标准 MHSA
  RT-DETR:   ★★★☆☆  Deformable Attention 需要自定义算子
  mmdetection: ★★★☆☆  依赖 mmcv 的 CUDA 算子

这也是为什么 Ultralytics 把 RT-DETR 集成进自己的框架时,做了一些简化——用标准算子近似某些 Deformable 操作,虽然可能略微损失精度,但大幅提升了部署兼容性。


对 YOLO-Master 的启示

RT-DETR 对犀牛鸟参赛者的启示主要在两个方面:

一、MoE 路由器可以借鉴 IoU-aware Query Selection 的思想。 RT-DETR 根据”目标质量”选择 query;YOLO-Master 的路由器根据”目标难度”选择专家。两者都是”自适应选择”的思想——根据输入内容动态决定计算路径。

二、Hybrid Encoder 的”分层处理”思想值得参考。 RT-DETR 在低分辨率做 Attention(全局建模),在跨尺度融合时用 CNN。YOLO-Master 的 MoE 也可以考虑类似的策略——在需要全局信息的层用 MoE(让不同专家专注不同的全局模式),在局部特征层用标准卷积(减少路由开销)。

三、部署约束的警示。 RT-DETR 的 Deformable Attention 限制了它的部署范围。YOLO-Master 的 MoE 路由器如果设计过于复杂(如动态专家数量、条件分支),也会遇到类似的部署问题。设计时应确保路由逻辑可以导出为标准 ONNX 算子。


初学者常见误区

误区一:”RT-DETR 比 YOLO 更先进,所以应该用 RT-DETR”

→ 正确理解:RT-DETR 和 YOLO 各有优势。在小模型场景(嵌入式设备),YOLO 的纯卷积架构更高效。在大模型场景(服务器 GPU),RT-DETR 的全局建模能力更有价值。在部署友好性上,YOLO 胜出。选择哪个取决于你的具体需求——没有绝对的”更先进”。

误区二:”RT-DETR 的 Transformer Encoder 处理所有尺度的特征”

→ 正确理解:这正是 RT-DETR 的核心创新——它只在最小尺度(S5, 20×20)做 Self-Attention,跨尺度融合用 CNN。如果在所有尺度都做 Self-Attention(像 DINO 那样),计算量会增加 20 倍以上,完全无法达到实时。RT-DETR 的”混合”策略(Attention 做全局建模,CNN 做跨尺度融合)是它能达到实时速度的关键。

误区三:”300 个 query 意味着最多只能检测 300 个目标”

→ 正确理解:理论上是的,但 COCO 数据集上每张图平均只有 7 个目标,300 个 query 已经远超需求。在实际应用中,如果你的场景目标数量很多(如人群计数,一张图可能有 1000+ 个人),确实需要增加 query 数量——但这会线性增加 Decoder 的计算量。对于犀牛鸟的 COCO 评测场景,300 个 query 完全够用。


读完本章你能做什么

读完这一章,你应该能够:


导读目录:README.md 上一章:第 8 章 · YOLOv10 下一章:第 10 章 · mmdetection