RF-DETR:SOTA 实时目标检测模型
RF-DETR 是由 Roboflow 开发并基于 Transformer 的实时目标检测模型架构,采用 Apache 2.0 许可证发布。
RF-DETR 是第一个在 Microsoft COCO 基准测试中超过 60 AP 的实时模型,同时在基础尺寸下具有竞争力。它还在 RF100-VL 目标检测基准测试中实现了最先进的性能,该基准测试衡量模型对现实世界问题的领域适应性。RF-DETR 的速度与当前实时目标检测模型相当。
( 60AP 是什么概念,知识补充:
当一个模型在 COCO 基准测试中达到 60 AP 时,意味着它的平均精度达到了 60%,这是一个非常高的水平。以下是几个关键点来理解这个分数的意义:
(1)高难度的评估标准
COCO 的 AP 计算方式非常严格,因为:
- 它不仅考虑了 IoU=0.5 的情况,还综合了更高 IoU 阈值(如 0.75)的表现。
- 模型需要在不同大小的目标上都能有良好的表现。
(2)与现有方法对比
在 COCO 目标检测任务中,60 AP 已经接近甚至超过了许多经典模型的表现。例如:
- Faster R-CNN (早期的经典模型)在 COCO 上的 AP 大约在 30-40 左右。
- YOLOv5/v7 等现代模型在默认配置下可以达到 50 AP 左右。
- SOTA 模型 (如 Swin Transformer、DINO 等)在某些情况下可以达到 60 AP 或更高。
因此,60 AP 表明你的模型已经处于当前最先进的水平,尤其是在复杂场景和高精度要求的情况下。
(3)实际应用中的价值
60 AP 不仅是一个理论上的高分,也意味着模型在实际应用中可能具有很高的可靠性。例如:
- 在自动驾驶领域,模型需要对小目标(如行人、交通标志)进行精准检测。
- 在视频监控中,模型需要在复杂背景中准确定位目标。
)
基于DETR架构结合了DINOv2,在T4 GPU上处理每张图片约6毫秒,
有两个版本:
RF-DETR-base:参数量29M
RF-DETR-large:参数量128M
RF-DETR 足够小巧,可以在边缘设备上运行,能同时兼顾精度和实时性,使其成为需要强大准确性和实时性能的部署的理想模型。
实时推理:
模型变体:
RF-DETR 有两种变体:RF-DETR-B 29M RFDETRBase 和 RF-DETR-L 128M RFDETRLarge 。初始化任一类别时,将自动加载相应的 COCO 预训练检查点。
输入分辨率:
两种模型变体都支持可配置的输入分辨率。通常,更高的分辨率可以通过捕捉更多细节来提高预测质量,尽管它可能会减慢推理速度。您可以通过在初始化模型时传递 resolution 参数来调整分辨率。 resolution 的值必须是 56 的倍数。
训练:
1、数据集结构
RF-DETR 期望数据集采用 COCO 格式。将您的数据集分为三个子目录: train 、 valid 和 test 。每个子目录应包含自己的 _annotations.coco.json 文件,该文件包含该特定分割的注释,以及相应的图像文件。以下是目录结构的示例:
dataset/
├── train/
│ ├── _annotations.coco.json
│ ├── image1.jpg
│ ├── image2.jpg
│ └── ... (other image files)
├── valid/
│ ├── _annotations.coco.json
│ ├── image1.jpg
│ ├── image2.jpg
│ └── ... (other image files)
└── test/├── _annotations.coco.json├── image1.jpg├── image2.jpg└── ... (other image files)
Roboflow 允许您从头开始创建目标检测数据集或将现有数据集从 YOLO 等格式转换为 COCO JSON 格式进行训练。您还可以探索 Roboflow 宇宙,以找到适用于各种用例的预标记数据集。
2、微调
您可以从预训练的 COCO 检查点微调 RF-DETR。默认情况下,将使用 RF-DETR-B 检查点。为了快速开始,请参阅我们的微调 Google Colab 笔记本。
from rfdetr import RFDETRBase
model = RFDETRBase()
model.train(dataset_dir=<DATASET_PATH>, epochs=10, batch_size=4, grad_accum_steps=4, lr=1e-4)
3、批大小(Batch size)
不同的 GPU 拥有不同数量的 VRAM(视频内存),这限制了它们在训练过程中一次可以处理的数据量。为了使训练在任何机器上都能良好工作,您可以调整两个设置: batch_size 和 grad_accum_steps 。这些设置控制每次处理多少个样本。关键是保持它们的乘积等于 16——这是我们推荐的总体批处理大小。例如,在像 A100 这样的强大 GPU 上,设置 batch_size=16 和 grad_accum_steps=1 。在像 T4 这样的较小 GPU 上,使用 batch_size=4 和 grad_accum_steps=4 。我们使用一种称为梯度累积的方法,该方法通过逐步收集更新并在调整权重之前模拟较大批次的训练来让模型模拟使用较大批次的训练。
4、多 GPU 训练
您可以使用 PyTorch 的分布式数据并行(DDP)在多个 GPU 上微调 RF-DETR。创建一个 main.py 脚本来初始化您的模型,然后像往常一样调用 .train() ,然后在终端中运行它。
python -m torch.distributed.launch \
--nproc_per_node=8 \
--use_env \
main.py
将 8 中的 --nproc_per_node argument 替换为你想使用的 GPU 数量。这种方法为每个 GPU 创建一个训练进程,并自动分配工作负载。请注意,你的有效批量大小会乘以 GPU 的数量,因此你可能需要调整你的 batch_size 和 grad_accum_steps 以保持相同的整体批量大小。
5、结果检查点
在训练过程中,将在指定的输出目录中保存两个模型检查点(常规权重和基于 EMA 的权重集)。EMA(指数移动平均)文件是模型权重随时间平滑的版本,通常能带来更好的稳定性和泛化能力。
6、载并运行微调模型
from rfdetr import RFDETRBase
model = RFDETRBase(pretrain_weights=<CHECKPOINT_PATH>)
detections = model.predict(<IMAGE_PATH>)
7、ONNX 导出
RF-DETR 支持将模型导出为 ONNX 格式,这可以实现与各种推理框架的互操作性,并可以提高部署效率。要导出您的模型,只需初始化它并调用 .export() 方法即可。
from rfdetr import RFDETRBase
model = RFDETRBase()
model.export()
开源地址:
https://github.com/roboflow/rf-detr?tab=readme-ov-file#fine-tuning