第 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-R50 和 YOLOv8l 精度相当(53.1 vs 52.9),但 RT-DETR 更快(9.3ms vs 12.39ms)且不需要 NMS
- RT-DETR-L 的参数量比 YOLOv8l 少(32M vs 43.7M),但精度持平
- RT-DETR 在大模型上优势更明显——因为 Transformer 的全局建模能力在大模型上更能发挥
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 完全够用。
读完本章你能做什么
读完这一章,你应该能够:
- 从 DETR → Deformable DETR → DINO → RT-DETR 的演进中理解关键改进
- 解释 RT-DETR 混合编码器(AIFI + CCFM)的设计逻辑
- 说出 RT-DETR 天然 NMS-Free 的原因(Self-Attention 实现去重)
- 理解 IoU-aware Query Selection 相比 learnable query 的优势
- 对比 RT-DETR 和 YOLO 系列的范式差异
导读目录:README.md 上一章:第 8 章 · YOLOv10 下一章:第 10 章 · mmdetection