# RT-DETR
## 论文
`DETRs Beat YOLOs on Real-time Object Detection`
- https://arxiv.org/abs/2304.08069
## 模型结构
RT-DETR是一种端到端的实时物体检测器,它建立在视觉转换器(Vision Transformer)架构之上:
模型利用主干网络的最后三个阶段的输出特征{S3,S4,S5}作为编码器的输入;
混合编码器通过度内特征交互(AIFI)和跨尺度特征融合模块(CCFM)将多尺度特征转换成图像特征序列;
随后采用loU感知查询选择从编码器输出的特征序列中选择固定数量的特征,作为解码器的初始目标查询;
最后解码器通过辅助预测头迭代优化目标查询,生成边界框和置信度得分。
## 算法原理
1、主干网络:对于 backbone 部分,采用了经典的 ResNet 和可缩放的 HGNetv2 两种,两种 backbone 各训练了两个版本 ,以 HGNetv2 为 backbone 的 RT-DETR 包括 L 和 X 版本,以ResNet 为 backbone 的RT-DETR 则包括 RT-DETR-R50 和 RT-DETR-R101 。
RT-DETR-R50/101 做主干方便和现有的 DETR 变体进行对比,而 RT-DETR-HGNet-L/X 则用来和现有的实时检测器进行对比,值得注意的是,HGNetv2是由百度自家研发的主干结构。
与YOLO相似的地方在于,RT-DETR最终会输出三种不同尺寸的特征图,它们相对于输入图像的分辨率下采样倍数分别是 8 倍、16 倍和 32 倍。
2、混合编码器:RT-DETR 采用了一层 Transformer 的 Encoder ,其包括度内特征交互(AIFI)和跨尺度特征融合模块(CCFM)两部分。
它首先将二维的 S5 特征拉成向量,然后交给 AIFI 模块处理,其数学过程就是多头自注意力与 FFN,随后,再将输出 Reshape 回二维,记作 F5,以便去完成后续的所谓的“跨尺度特征融合”。
CCFM模块是由 2 个 1×1 卷积和 N 个 RepBlock 构成的,通过调整 CCFM 中 RepBlock 的数量和 Encoder 的编码维度分别控制 Hybrid Encoder 的深度和宽度,同时对 backbone 进行相应的调整即可实现检测器的缩放。
3、loU:在训练期间约束检测器对高 IoU 的特征产生高分类分数,对低 IoU 的特征产生低分类分数。从而使得模型根据分类分数选择的 Top-K 特征对应的预测框同时具有高分类分数和高 IoU 分数。
4、解码器:支持不同层数的灵活推理,无需重训练。
## 环境配置
### Docker(方法一)
```
docker pull image.sourcefind.cn:5000/dcu/admin/base/pytorch:2.1.0-ubuntu20.04-dtk24.04.2-py3.10
docker run -it --name=RT-DETR --network=host --privileged=true --device=/dev/kfd --device=/dev/dri --shm-size=16G --group-add video --cap-add=SYS_PTRACE --security-opt seccomp=unconfined -v /path/your_code_data:/home/RT-DETR -v /opt/hyhal/:/opt/hyhal/:ro bash # 为以上拉取的docker的镜像ID替换
cd RT-DETR
# 安装依赖
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install -r requirements.txt
```
### Dockerfile(方法二)
```
docker build --no-cache -t rtdetr:latest .
docker run -it --name=RT-DETR --network=host --privileged=true --device=/dev/kfd --device=/dev/dri --shm-size=16G --group-add video --cap-add=SYS_PTRACE --security-opt seccomp=unconfined -v /path/your_code_data:/home/RT-DETR -v /opt/hyhal/:/opt/hyhal/:ro rtdetr /bin/bash
cd RT-DETR
# 安装依赖
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install -r requirements.txt
```
### Anaconda(方法三)
1、关于本项目DCU显卡所需的特殊深度学习库可从光合开发者社区下载安装: https://developer.hpccube.com/tool/
```
DTK软件栈:dtk24.04.2
python:python3.10
pytorch:2.1.0
torchvision:0.16.0
onnxruntime:1.15.0
```
`Tips:以上dtk软件栈、python、pytorch等DCU相关工具版本需要严格一一对应`
2、其他非特殊库直接按照下面步骤进行安装
```
cd RT-DETR
# 安装依赖
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install -r requirements.txt
```
## 数据集
### 训练数据集
`Coco2017`
仅需要annotations_trainval2017.zip、val2017.zip、train2017.zip作为数据集。可通过[scnet](http://113.200.138.88:18080/aidatasets/coco2017) 或[官网链接](https://cocodataset.org/#download) 进行下载,下载后的压缩包需要解压缩。通过官网下载和解压完整数据集的代码如下:
ps:本仓库内已准备了小数据集供训练测试,位于RT-DETR/dataset/
```
cd RT-DETR/datasets
wget -i url.txt
# 解压
apt-get update
apt-get install unzip
unzip annotations_trainval2017.zip;unzip val2017.zip;unzip train2017.zip
```
数据集目录结构如下:
```
RT-DETR/datasets:
── train2017
│ └── ...
── val2017
│ └── ...
── annotations
│ └── ...
```
### 推理数据集
推理测试所用数据已保存在RT-DETR/datasets/000000033109.jpg
## 训练
运行代码时会默认下载辅助模型,存储目录为/root/.cache/torch/hub/checkpoints/
### 单机多卡
```
cd RT-DETR
HIP_VISIBLE_DEVICES=0,1,2,3;torchrun --nproc_per_node=4 rtdetr_pytorch/tools/train.py -c rtdetr_pytorch/configs/rtdetr/rtdetr_r18vd_6x_coco.yml
# -c 配置文件路径
# -r 恢复训练的权重加载路径
```
注:如果挂载目录不是"/home/RT-DETR",需要修改RT-DETR/rtdetr_pytorch/configs/dataset/coco_detection.yml和RT-DETR/rtdetr_pytorch/configs/rtdetr/rtdetr_r18vd_6x_coco.yml中的对应路径。
## 推理
权重可通过[scnet](http://113.200.138.88:18080/aimodels/findsource-dependency/rt-detrv1/-/tree/main/pytorch) 或 [官网链接](https://github.com/lyuwenyu/storage/releases/tag/v0.1)进行下载,通过官网下载的代码如下:
```
cd RT-DETR
wget -i model/url.txt -P model/
```
onnx_infer.py内可以修改onnx模型目录和数据集目录,推理代码如下:
```
cd RT-DETR
# 1、导出onnx文件,以r18vd_6x为例
HIP_VISIBLE_DEVICES=0 python rtdetr_pytorch/tools/export_onnx.py \
-c rtdetr_pytorch/configs/rtdetr/rtdetr_r101vd_6x_coco.yml \
-r model/rtdetr_r101vd_6x_coco_from_paddle.pth \
-f model/onnx/rtdetr_r101vd_6x_coco.onnx \
--check
# -c 模型配置文件的存储目录
# -r 源模型的目录
# -f onnx模型的导出目录
# --check 检查onnx模型是否导出完成
# 2、运行推理
python onnx_infer.py
```
注:如果挂载目录不是"/home/RT-DETR",需要修改RT-DETR/rtdetr_pytorch/configs/dataset/coco_detection.yml和RT-DETR/rtdetr_pytorch/configs/rtdetr/rtdetr_r18vd_6x_coco.yml中的对应路径。
## 评估
评估代码如下:
```
CUDA_VISIBLE_DEVICES=0,1,2,3 torchrun --nproc_per_node=4 rtdetr_pytorch/tools/train.py \
-c rtdetr_pytorch/configs/rtdetr/rtdetr_r101vd_6x_coco.yml \
-r model/rtdetr_r101vd_6x_coco_from_paddle.pth \
--test-only
# -c 配置文件路径
# -r 权重加载路径
# --test-only 只进行评估
```
## result
默认推理结果为:
### 精度
| | 测试参数 | 软件栈 | final loss |
| ---------------------------- | ------------------------------- | ---------- | ---------- |
| A800 * 4 (80G,1410 Mhz) | config=rtdetr_r18vd_6x_coco.yml | cuda11.8 | 9.390466 |
| k100ai * 4 (64G,1400 Mhz) | config=rtdetr_r18vd_6x_coco.yml | dtk24.04.2 | 9.400760 |
## 应用场景
### 算法类别
`目标检测`
### 热点应用行业
`制造,交通,电商,广媒,医疗`
## 预训练权重
- http://113.200.138.88:18080/aimodels/findsource-dependency/rt-detrv1/-/tree/main/pytorch
- https://github.com/lyuwenyu/storage/releases/tag/v0.1
## 源码仓库及问题反馈
- https://developer.sourcefind.cn/codes/modelzoo/rt-detr_pytorch
## 参考资料
- https://github.com/lyuwenyu/RT-DETR/tree/v1.0