RT-DETR:基于 Transformer 的实时目标检测器
RT-DETR 实时目标检测完全指南
为什么需要 RT-DETR?
目标检测领域长期被 YOLO 系列主导,它们依靠复杂的非极大值抑制(NMS)后处理步骤来消除冗余框,但这会引入额外的延迟和调参成本。DETR(Detection Transformer)的出现展示了一种端到端、无需 NMS 的全新范式,但其收敛速度慢、对小目标不友好,且实时性远不及 YOLO。RT-DETR(Real-Time DEtection TRansformer)正是为了解决这一矛盾而生——它在保持 Transformer 简洁端到端优点的同时,首次做到了真正的实时检测,并且在速度和精度上全面超越同期的 YOLO 模型。
从 DETR 到 RT-DETR 的演进
传统的 DETR 直接使用 Transformer 将目标检测视为集合预测问题,核心流程是:CNN 骨干提取特征 → 扁平化后加入位置编码 → Transformer 编码器-解码器 → 预测固定数量的边界框。但它有两个主要痛点:
- 编码器计算代价高:对高分辨率特征图的所有空间位置进行全局自注意力,复杂度与特征图像素数的平方成正比。
- 目标查询初始化不稳定:解码器输入的对象查询是随机初始化的,导致训练初期匹配困难,收敛缓慢。
随后的 Deformable DETR 将全局注意力替换为可变形注意力,只关注少数关键采样点,大幅降低了计算量并改善了小目标精度。但即使如此,其编码器仍然在全部多尺度特征层上进行昂贵的交互,难以满足实时需求。
RT-DETR 在此基础上进一步突破,通过高效混合编码器和不确定性最小的查询选择,将 DETR 真正推向了实时领域。
RT-DETR 的核心创新
高效混合编码器(Efficient Hybrid Encoder)
RT-DETR 将编码器拆分为两个串行阶段:基于注意力的内部尺度特征交互(AIFI)和基于 CNN 的跨尺度特征融合(CCFF)。
- AIFI 模块:只在最深层、空间尺寸最小的特征图(通常是 S5,即 1/32 下采样的特征图)上运行单尺度 Transformer 编码器。这样做的依据是,深层特征图已包含丰富的语义信息,在其上进行自注意力可以高效地捕获全局概念,同时计算成本极低。其他浅层特征图则完全不参与自注意力计算,避免了沉重的计算负担。
- CCFF 模块:在 AIFI 之后,使用一个由卷积组成的跨尺度融合结构(包含融合块与过渡层),将更新后的深层特征与浅层特征进行多尺度融合。该模块通过卷积操作进行跨层连接,融合不同分辨率的特征,从而补偿单尺度 Transformer 丢失的局部细节,保证多尺度特征的充分交互。
这一设计将计算量主要集中在少量深层 Token 的自注意力上,其余跨尺度交互全部交由轻量卷积完成。相比 Deformable DETR 在多尺度上运行可变形注意力,RT-DETR 的编码器效率提升了数个量级。
不确定性最小的查询选择(Uncertainty-Minimal Query Selection)
DETR 解码器需要一组“对象查询”(Object Queries)作为初始猜测。传统方法随机初始化这些查询,导致解码器需要很多轮次才能学会关注有物体的区域。后续工作尝试从编码器特征中选择高分类分数的位置来初始化查询,但分类分数高并不一定代表该位置的框回归质量好,存在“分类-回归”不一致问题。
RT-DETR 提出了基于不确定性的选择机制:对特征图中的每个位置,它不仅看分类概率,还预测该位置的框回归不确定性。模型通过额外的分支输出预测框的标准差,然后选择 分类分数高且回归不确定性小 的位置作为初始查询。这意味着那些分类置信度高、同时模型对自己预测的框位置很确定的点才会被选为对象查询。这显著提高了查询的初始化质量,让解码器从一开始就能聚焦在高质量区域,大幅加速收敛并提升精度。
RT-DETR 与 YOLO 系列的关键对比
| 特性 | YOLOv8/v9/v10 | RT-DETR |
|---|---|---|
| 检测范式 | 一阶段密集预测 + NMS | 端到端集合预测,无需 NMS |
| 后处理 | 依赖 NMS 或更复杂的无 NMS 设计 | 原生无 NMS |
| 编码器主干 | CSPDarkNet 或类似结构 | ResNet/PPHGNet 等 + 混合编码器 |
| 多尺度方式 | FPN+PAN 结构 | AIFI + CCFF 混合 |
| 查询机制 | 锚框或无锚网络 | 可学习的对象查询 + 不确定性选择 |
| 实时性 | 极快(尤其小模型) | 同等精度下更快,或同等速度下精度更高 |
| 端到端 | 否(多数依赖 NMS) | 是 |
| 灵活性 | 模型缩放丰富(n/s/m/l/x) | 通过 ResNet 或 HGNet 系列缩放 |
实测中,RT-DETR-R50 在 COCO val2017 上达到 53.1% AP,在 T4 GPU 上保持 108 FPS;而同速度级别的 YOLOv8-L 大约为 52.9% AP,但 YOLO 仍需 NMS。当去除 NMS,RT-DETR 的端到端优势更加突出,尤其在密集场景或需要灵活批次推理的部署场景中。
快速上手:使用官方实现进行推理
RT-DETR 官方实现已集成在 PaddleDetection 中,同时百度也提供了基于 PyTorch 的版本,并已合并到 Hugging Face Transformers。下面以使用最广泛的 PyTorch 实现(来自 lyuwenyu/RT-DETR)为例,展示快速推理。
环境配置
git clone https://github.com/lyuwenyu/RT-DETR.git
cd RT-DETR/rtdetr_pytorch
pip install -r requirements.txt
requirements.txt 中包含 torch>=1.9.0, torchvision, opencv-python, pycocotools 等基础依赖。
下载预训练模型
在项目 README 中提供了不同主干网络的预训练权重链接,例如 ResNet50(rtdetr_r50vd_coco_0052.pth)和 HGNetv2-L 等。可直接使用 wget 下载:
mkdir weights
cd weights
wget https://github.com/lyuwenyu/RT-DETR/releases/download/v1.0/rtdetr_r50vd_coco_0052.pth
Python 推理脚本
创建 detect.py:
import torch
import cv2
from PIL import Image
from torchvision import transforms
from rtdetr_pytorch.model.detr import build_model
from rtdetr_pytorch.util.misc import draw_bbox
# 配置
img_path = "test.jpg"
conf_threshold = 0.5
# 加载模型
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model, postprocessor = build_model(args)
# 若直接使用配置文件,可参考官方 demo.py
# 这里以简化的完整示例展示核心过程
# 实际使用中推荐参考官方的 detect.py 脚本
为让初学者一目了然,这里给出基于 torch.hub 的极简调用方案(部分社区实现已支持 hub):
import torch
import matplotlib.pyplot as plt
# 如果已有 hub 支持
# model = torch.hub.load('lyuwenyu/RT-DETR', 'rtdetr_r50', pretrained=True)
# 或使用 transformers
from transformers import RTDetrForObjectDetection, RTDetrImageProcessor
from PIL import Image
import requests
url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)
processor = RTDetrImageProcessor.from_pretrained("PekingU/rtdetr_r50vd")
model = RTDetrForObjectDetection.from_pretrained("PekingU/rtdetr_r50vd")
inputs = processor(images=image, return_tensors="pt")
with torch.no_grad():
outputs = model(**inputs)
results = processor.post_process_object_detection(outputs, target_sizes=torch.tensor([image.size[::-1]]), threshold=0.5)
for box, score, label in zip(results[0]['boxes'], results[0]['scores'], results[0]['labels']):
print(f"检测到 {model.config.id2label[label.item()]},置信度 {score:.3f},框坐标 {box.tolist()}")
Transformers 版本封装得非常好,几行代码即可完成推理,且模型输出已经提取出最终的框和类别,完全无需 NMS。
可视化结果
可使用 PIL 或 OpenCV 绘制:
from PIL import ImageDraw
draw = ImageDraw.Draw(image)
for box, score, label in zip(results[0]['boxes'], results[0]['scores'], results[0]['labels']):
draw.rectangle(box.tolist(), outline="red", width=3)
draw.text((box[0], box[1]), f"{model.config.id2label[label.item()]}: {score:.2f}")
image.show()
训练自定义数据集
RT-DETR 的训练流程继承了 DETR 的风格,并做了许多面向速度的优化。通常使用 COCO 格式标注数据。
数据准备
将数据集组织为:
dataset/
annotations/
instances_train2017.json
instances_val2017.json
train2017/
00001.jpg
...
val2017/
...
配置文件
RT-DETR 项目提供类似 YOLO 的配置方式(.yml 文件),包含模型结构、数据集路径、优化器等。以 configs/rtdetr/rtdetr_r50vd_6x_coco.yml 为例,修改其中的 num_classes 为自己数据集的类别数,并调整 train_dataloader 和 val_dataloader 的数据根目录。
启动训练
cd rtdetr_pytorch
python tools/train.py -c configs/rtdetr/rtdetr_r50vd_6x_coco.yml
训练过程中会输出损失(分类损失、回归损失、GIoU 损失等),并且默认在训练期间使用 EMA(指数移动平均)来增强模型鲁棒性。RT-DETR 收敛很快,通常 72 个 epoch 就能达到好效果,相比原始 DETR(需 500+ epoch)有数量级的提升。
关键超参说明
lr:初始学习率,对 RT-DETR 通常设为 1e-4,配合余弦退火调度。batch_size:建议根据 GPU 显存尽可能大,RT-DETR 对批次大小较敏感,较大批次有助于不确定性查询选择的稳定性。num_queries:对象查询的数量,默认 300,可适当增加应对密集场景。enc_layers/dec_layers:编码器层数默认 6,解码器层数默认 6,轻量化模型可减少以提速度。
模型部署与优化
RT-DETR 的 PyTorch 模型可直接通过 ONNX 导出,然后在 TensorRT 或 ONNX Runtime 上加速。
导出 ONNX
import torch
from rtdetr_pytorch.model.detr import build_model
model, _ = build_model(args)
model.eval()
dummy_input = torch.randn(1, 3, 640, 640)
torch.onnx.export(model, dummy_input, 'rtdetr.onnx', opset_version=11,
input_names=['input'], output_names=['pred_logits', 'pred_boxes'])
注意 RT-DETR 的最终输出已经是处理过的预测结果,没有复杂的后处理,因此导出后可以直接在部署框架中运行,无需额外添加 NMS 插件。这使得它在 TensorRT 等环境中的部署极为简洁,且推理延迟稳定。
性能调优技巧
- 使用 HGNetv2 主干:相比 ResNet,HGNetv2 在速度和精度上有更好平衡,尤其在小模型上。
- 调整编码器内部尺度:默认 AIFI 只在 S5 层进行,轻量版本可进一步减少编码器层数或隐藏维度。
- 混合精度训练:开启 AMP 可加速训练且几乎不影响精度。
- 量化:部署时可尝试 INT8 量化,RT-DETR 的 Transformer 部分对量化敏感度低于传统卷积结构,精度保持较好。
常见问题
Q:RT-DETR 需要 NMS 吗? A:不需要。它基于集合预测和二分匹配,直接输出无冗余的检测框,这消除了 NMS 调参的困扰,也避免了密集场景下 NMS 导致的漏检。
Q:RT-DETR 对小目标效果如何? A:通过 CCFF 的跨尺度融合和不确定性查询选择,小目标检测能力优于原始 DETR 和许多一阶段网络,但极端小的目标(小于 8×8)仍然有挑战。建议适当增大输入尺寸(如 800 或 960)来提升小目标 AP。
Q:可以在 CPU 上实时运行吗? A:轻量版 RT-DETR(如 R50 的 INT8 模型)可在现代 CPU 上达到 20-30 FPS,适合非极致实时的场景。若需 CPU 实时,可考虑更小的主干网络(如 RT-DETR-ResNet18)。
Q:如何迁移到自己的数据集? A:只需修改配置文件中的类别数和数据路径,从预训练权重开始微调。由于 RT-DETR 的查询选择机制基于分类和回归不确定性,在小数据集上的收敛速度通常优于标准 DETR。
推荐学习资源
- RT-DETR 官方论文 – 全面了解混合编码器和查询选择细节。
- RT-DETR PyTorch 实现 – 最活跃的非官网实现,包含训练和部署示例。
- Hugging Face RT-DETR 文档 – 可直接使用 Transformers 的简洁 API。
- PaddleDetection 官方模型库 – 百度原生实现,提供更多预训练权重和部署工具。
RT-DETR 的出现证明了 Transformer 在实时目标检测中的巨大潜力,它剔除了传统检测流水线中的诸多手工组件,让检测模型更加简洁和鲁棒。无论是研究者还是工业界开发者,都可以从这一新范式中受益。