DEIM 实时目标检测算法与 Visdrone2019 数据集实战
解析了 DEIM 论文及其在 VisDrone2019 数据集上的应用。DEIM 通过密集 O2O 匹配和匹配感知损失解决 DETR 慢收敛问题。实战部分涵盖环境搭建、数据集准备、配置文件修改、模型训练验证及 ONNX 导出。实验表明该算法在小目标检测上精度提升显著,但显存占用高且推理速度略慢于 YOLOv8。文中包含常见报错解决方案。

解析了 DEIM 论文及其在 VisDrone2019 数据集上的应用。DEIM 通过密集 O2O 匹配和匹配感知损失解决 DETR 慢收敛问题。实战部分涵盖环境搭建、数据集准备、配置文件修改、模型训练验证及 ONNX 导出。实验表明该算法在小目标检测上精度提升显著,但显存占用高且推理速度略慢于 YOLOv8。文中包含常见报错解决方案。

DEIM(DETR with Improved Matching for Fast Convergence)是一篇关于加速基于 Transformer 架构(DETR)的实时目标检测训练框架的论文。
目标检测是计算机视觉中的基本任务,广泛应用于自动驾驶、机器人导航等领域。实时目标检测要求模型不仅能精准检测目标,还要以极低的延迟运行。DETR 是一种基于 Transformer 的端到端目标检测框架,通过使用匈牙利算法进行一对一匹配,消除了对手工设计的非极大值抑制的需求,但其收敛速度慢成为一大挑战。
DETR 模型在训练过程中存在慢收敛的问题,主要原因是其一对一匹配机制导致正样本数量稀少,且存在大量低质量匹配。这限制了模型的有效学习,尤其是对小目标的检测。
为了解决上述问题,DEIM 提出了以下两个主要策略:
密集 O2O 匹配(Dense O2O): 通过增加每张图像中的目标数量,生成更多的正样本,从而提供更密集的监督信号,加速模型收敛。这可以通过经典的数据增强技术(如马赛克和混合)轻松实现,这些技术在保持一对一匹配框架的同时,每张图像生成额外的正样本。
匹配感知损失(MAL, Matchability-Aware Loss): 一种新的损失函数,优化不同质量级别的匹配,特别是低质量匹配,提升模型性能。MAL 通过将匹配查询与目标之间的 IoU(交并比)与分类置信度结合,根据匹配质量调整惩罚。相比传统的 Varifocal Loss(VFL),MAL 在处理低质量匹配时更有效,特别是在训练的早期阶段。
![训练过程可视化]
在 COCO 数据集上的实验表明,DEIM 显著加速了 DETR 模型的收敛,减少了 50% 的训练时间,同时提升了检测精度。与现有的实时检测器(如 YOLO 系列和 RT-DETR)相比,DEIM 在性能和训练效率上均表现出色,尤其是在小目标检测方面有显著提升。
当与 RT-DETR 和 D-FINE 集成时,DEIM 在减少训练时间的同时提高了性能。特别是与 RT-DETRv2 集成时,DEIM 在 NVIDIA 4090 GPU 上单天训练就达到了 53.2% 的平均精度(AP)。
![模型对比图]
DEIM 训练的实时模型在没有额外数据的情况下,超越了领先的实时目标检测器。例如,DEIM-D-FINE-L 和 DEIM-D-FINE-X 在 NVIDIA T4 GPU 上分别以 124 FPS 和 78 FPS 的速度达到了 54.7% 和 56.5% 的 AP。
![速度对比图]
DEIM 通过密集 O2O 匹配和匹配感知损失,有效解决了 DETR 模型的慢收敛问题,提升了实时目标检测的性能,为该领域设定了新的基准。
步骤 1:创建环境
conda create -n deim python=3.8.13
步骤 2:安装 torch 版本要求大于 2.0.1,这里安装 2.3.1。
# CUDA 11.8
conda install pytorch==2.3.1 torchvision==0.18.1 torchaudio==2.3.1 pytorch-cuda=11.8-c pytorch -c nvidia
# CUDA 12.1
conda install pytorch==2.3.1 torchvision==0.18.1 torchaudio==2.3.1 pytorch-cuda=12.1-c pytorch -c nvidia
# CPU Only
conda install pytorch==2.3.1 torchvision==0.18.1 torchaudio==2.3.1 cpuonly -c pytorch
步骤 3:安装 deim 其他依赖 注意:calflops 安装或训练报错可见文末常见问题。
conda activate deim
pip install -r requirements.txt
VisDrone 数据集是由天津大学等团队开源的一个大型无人机视角的数据集,官方提供的数据中训练集是 6471、验证集是 548、测试集 1610 张。数据集共提供了以下 12 个类,分别是:'忽略区域', 'pedestrian', 'people', 'bicycle', 'car', 'van','truck', 'tricycle', 'awning-tricycle', 'bus', 'motor', 'others',其中忽略区域、others 是非有效目标区域,本项目中予以忽略,只使用'pedestrian', 'people', 'bicycle', 'car', 'van','truck', 'tricycle', 'awning-tricycle', 'bus', 'motor'10 个类。
注意:这里直接下载已处理好的 coco 格式的 Visdrone2019 数据集进行训练,同时注意该数据集图片命名已改变,但其他无影响。
新建 DEIM-main/configs/dataset/custom_xulvisdrone.yml 文件,内容如下: 注意修改项:类别 num_classes、训练集图像路径 img_folder、训练集 coco 标签 ann_file、验证集图像路径 img_folder、验证集 coco 标签 ann_file 四项。另外,验证测试集精度修改验证集图像路径 img_folder、验证集 coco 标签 ann_file 两项即可。
task: detection
evaluator:
type: CocoEvaluator
iou_types: ['bbox',]
num_classes: 10
remap_mscoco_category: False
train_dataloader:
type: DataLoader
dataset:
type: CocoDetection
img_folder: DEIM-main/visdrone2019_coco/train2017
ann_file: DEIM-main/visdrone2019_coco/annotations/instances_train2017.json
return_masks: False
transforms:
type: Compose
ops: ~
shuffle: True
num_workers: 4
drop_last: True
collate_fn:
type: BatchImageCollateFunction
val_dataloader:
type: DataLoader
dataset:
type: CocoDetection
img_folder: DEIM-main/visdrone2019_coco/val2017
ann_file: DEIM-main/visdrone2019_coco/annotations/instances_val2017.json
return_masks: False
transforms:
type: Compose
ops:
注意:这边训练 configs/deim_dfine/deim_hgnetv2_s_coco.yml,它是层层调用其他配置文件,优先采用 configs/deim_dfine/dfine_hgnetv2_s_coco.yml 和 configs/base/deim.yml 内容。
所有具体步骤如下:【默认 640 训练只需修改步骤二和步骤四】
步骤一:保存路径 + epoch 设置 configs/deim_dfine/deim_hgnetv2_s_coco.yml 修改 epoch 和保存路径等参数,默认 132epoch。
步骤二:设置自定义数据集 configs/deim_dfine/dfine_hgnetv2_s_coco.yml 修改自定义数据集文件调用。
步骤三:训练尺寸 configs/base/deim.yml 修改训练尺寸,默认 640,Mosaic 尺寸设置【切成 4 块】。
步骤四:batch_size 设置 configs/base/dataloader.yml 修改 total_batch_size【由原先 32 改为 8】,640*640 大概需要 20G 显存。
这里仅训练 deim_dfine-s 模型,模型输入尺寸 640*640,训练 132 轮,且利用官网 coco 预训练权重进行微调!
训练命令如下:
# deim_dfine_hgnetv2_s_coco_120e.pth 为 coco 预训练权重
python train.py -c configs/deim_dfine/deim_hgnetv2_s_coco.yml --use-amp --seed=0 -t deim_dfine_hgnetv2_s_coco_120e.pth
训练中,可利用 tensorboard --logdir=outputs/deim_hgnetv2_s_coco/summary 终端运行可视化训练过程,summary 中包含一个 events.out.tfevents.xxx 文件。将下面的网页用谷歌浏览器打开,如果没有内容大概率是路径错误。
可视化结果如下:
对数据集进行验证的命令依然是 train.py,启用–test-only 参数仅验证不训练。 验证的命令如下:
# best_stg2.pth 为训练 132 轮最佳 map50:95 的精度权重
python train.py -c configs/deim_dfine/deim_hgnetv2_s_coco.yml --test-only -r outputs/deim_hgnetv2_s_coco/best_stg2.pth
VisDrone 数据集验证结果如下【maxDets=100】,map50=0.474。 VisDrone 数据集测试集结果如下【maxDets=100】,map50=0.396。
maxDets:该指标的意思是分别保留测试集的每张图上置信度排名第 1、前 10、前 100 个预测框,根据这些预测框和真实框进行比对,来计算 AP、AR 等值。但是,在 WidePerson 等密集目标数据集中,尽管绝大部分图片中目标的数量在 100 以内,但却存在某些图片中包含近 200 个目标,那么我们再使用 maxDets=100 就不符合要求了,因此改成 300 进行验证测试。 修改:前往环境中 faster_coco_eval 依赖包进行修改,改一行即可: anaconda3/envs/yolov7/lib/python3.8/site-packages/faster_coco_eval/core/cocoeval.py
VisDrone 数据集验证结果如下【maxDets=300】,map50=0.475。 VisDrone 数据集测试集结果如下【maxDets=300】,map50=0.397。
测试的命令如下:
python tools/inference/torch_inf.py -c configs/deim_dfine/deim_hgnetv2_s_coco.yml -r outputs/deim_hgnetv2_s_coco/best_stg2.pth --input visdrone2019_coco/images/test/0000006_00159_d_0000001.jpg --device cuda:0
注意:原代码不带类别,只有索引,可自己在绘图时自行加入! 结果可视化如下,置信度阈值 0.4:
注意:需安装 onnx 和 onnxruntime 等。
pip install onnx==1.14.1-i https://pypi.tuna.tsinghua.edu.cn/simple
pip install onnxruntime-gpu==1.18.1-i https://pypi.tuna.tsinghua.edu.cn/simple
python tools/deployment/export_onnx.py -c configs/deim_dfine/deim_hgnetv2_s_coco.yml -r outputs/deim_hgnetv2_s_coco/best_stg2.pth
利用 netron 打开,显示如下:
注意:结果与 pth 存在偏差,可能是预处理影响。
python tools/inference/onnx_inf.py --onnx outputs/deim_hgnetv2_s_coco/best_stg2.onnx --input visdrone2019_coco/images/test/0000006_00159_d_0000001.jpg
可视化如下:onnx(左)、pth(右)
注意:该脚本无 torch,只包含 numpy、opencv 和 onnxruntime 三个依赖。 推理速度如下:
VisDrone2019 实验结果对比如下:
报错 1:RuntimeError: CUDA error: device-side assert triggered 原因:数据集配置有误,导致类别 id 与 yaml 文件中的索引号匹配不上导致的,这边自定义数据集要求 ID 索引从 0 开始,如 10 个类,则对应 0-9。
报错 2:Could not load library 2 libcudnn cnn train.so.8. Error. /usr/local/cuda-12.1/lib64/ibcudnn cnn train.so.8: undefined symbol 原因:安装 calflops 会携带装 nvidia-cudnn-cu12,而环境 nvidia-cudnn-cu12 容易与系统的 cudnn 冲突导致报错。所以要么把系统里面的 cudnn 去掉 (不推荐,如果部署其他的如 Tensor t 时会出现问题,反而更麻烦)。要么把虚拟环境中的 cudnn 去掉 (推荐),如 pip uninstall nvidia-cudnn-cu12。
报错 3:ModuleNotFoundError: No module named 'calflops' 原因:与报错 2 冲突,因此我们将 engine/misc/profiler_utils.py 相关内容注释,该 calflops 仅计算 FLOPs 等功能。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online