【超详细】DEIM:最强实时目标检测算法-Visdrone2019无人机数据集实战

【超详细】DEIM:最强实时目标检测算法-Visdrone2019无人机数据集实战

主要内容如下:

一、论文解析
二、基于DEIM-D-FINE-S训练Visdrone2019无人机数据集
1、Visdrone2019数据集介绍
2、模型训练、验证及测试
3、onnx导出与测试
4、与YOLOv8\11进行结果对比

服务器:NVIDIA RTX4090 24G
运行环境:Python=3.8(要求>=3.8),torch2.3.1+cu121(要求>=2.0.1)
Visdrone2019-COCO格式数据集百度AI stduio下载链接https://aistudio.baidu.com/datasetdetail/226107/0
Visdrone-YOLO格式数据集下载链接https://aistudio.baidu.com/datasetdetail/295374

arXiv: https://arxiv.org/abs/2412.04234
Project webpagehttps://www.shihuahuang.cn/DEIM/
GitHubhttps://github.com/ShihuaHuang95/DEIM

训练和使用结果
(1)map50高于YOLOv8将近6个点达47%,训练显存占用较大,batchsize为8需要20G,训练速度比YOLOv8慢一倍,12小时左右;
(2)onnx推理速度要慢于YOLOv8,需要9-10ms;
(3)检出率比较高,但是误检和同一个目标出现两个重叠框但不同类别现象较多。

一、论文解析

DEIM(DETR with Improved Matching for Fast Convergence)是一篇关于加速基于Transformer架构(DETR)的实时目标检测的训练框架的论文。以下是该论文的详细解析:

1 研究背景

目标检测是计算机视觉中的一个基本任务,广泛应用于自动驾驶、机器人导航等领域。实时目标检测要求模型不仅能精准检测目标,还要以极低的延迟运行。DETR(Detection Transformer)是一种基于Transformer的端到端目标检测框架,通过使用匈牙利算法进行一对一(O2O)匹配,消除了对手工设计的非极大值抑制(NMS)的需求,但其收敛速度慢成为一大挑战。

2 研究问题

DETR模型在训练过程中存在慢收敛的问题,主要原因是其一对一(O2O)匹配机制导致正样本数量稀少,且存在大量低质量匹配。这限制了模型的有效学习,尤其是对小目标的检测。

3 解决方案

为了解决上述问题,DEIM提出了以下两个主要策略:

密集O2O匹配(Dense O2O)
通过增加每张图像中的目标数量,生成更多的正样本,从而提供更密集的监督信号,加速模型收敛。
这可以通过经典的数据增强技术(如马赛克和混合)轻松实现,这些技术在保持一对一匹配框架的同时,每张图像生成额外的正样本。
匹配感知损失(MAL, Matchability-Aware Loss)
一种新的损失函数,优化不同质量级别的匹配,特别是低质量匹配,提升模型性能。
MAL通过将匹配查询与目标之间的IoU(交并比)与分类置信度结合,根据匹配质量调整惩罚。
相比传统的Varifocal Loss(VFL),MAL在处理低质量匹配时更有效,特别是在训练的早期阶段。

在这里插入图片描述

4 实验验证

在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-LDEIM-D-FINE-X在NVIDIA T4 GPU上分别以124 FPS和78 FPS的速度达到了54.7%和56.5%的AP。

在这里插入图片描述


在这里插入图片描述

5 结论

DEIM通过密集O2O匹配和匹配感知损失,有效解决了DETR模型的慢收敛问题,提升了实时目标检测的性能,为该领域设定了新的基准。DEIM通过增加正样本数量和优化低质量匹配,显著提升了DETR模型的训练效率和检测性能。

二、基于DEIM-D-FINE-S训练Visdrone2019无人机数据集

1 环境安装

步骤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 

2 Visdrone2019数据集准备

2.1 简介

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个类

2.2 数据集制作

注意:这里直接下载已处理好的coco格式的Visdrone2019数据集进行训练,同时注意该数据集图片命名已改变,但其他无影响。
下载链接Vidrone2019-COCO格式数据集

3 配置文件修改

3.1 数据集配置文件修改

新建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# your dataset classes 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:~ shuffle:False num_workers:4 drop_last:False collate_fn:type: BatchImageCollateFunction 

3.2 训练过程配置参数修改

注意:这边训练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显存。

在这里插入图片描述

4 模型训练

这里仅训练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文件。将下面的网页用谷歌浏览器打开,如果没有内容大概率是路径错误。

在这里插入图片描述


可视化结果如下

在这里插入图片描述

5 模型验证

对数据集进行验证的命令依然是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 

5.1 maxDets=100验证

Visdrone数据集验证结果如下【maxDets=100】,map50=0.474

在这里插入图片描述


Visdrone数据集测试集结果如下【maxDets=100】,map50=0.396

在这里插入图片描述

5.2 maxDets=300验证

maxDets:该指标的意思是分别保留测试集的每张图上置信度排名第1、前10、前100个预测框,根据这些预测框和真实框进行比对,来计算AP、AR等值。但是,在WidePerson等密集目标数据集中,尽管绝大部分图片中目标的数量在100以内,但却存在某些图片中包含近200个目标,那么我们再使用maxDets=100就不符合要求了,因此改成300进行验证测试。
修改:前往环境中faster_coco_eva依赖包进行修改,改一行即可:
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

在这里插入图片描述

6 模型测试

测试的命令如下

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

在这里插入图片描述

7 onnx推理与可视化

注意:需安装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 

7.1 导出onnx

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打开,显示如下

在这里插入图片描述

7.2 运行官方的onnx推理脚本

注意:结果与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(右)

在这里插入图片描述

7.3 运行自定义onnx推理脚本

注意:该脚本无torch,只包含numpy、opencv和onnxruntime三个依赖。
推理速度如下

在这里插入图片描述

8 与YOLOv8\11结果比较

Visdrone2019实验结果对比如下

在这里插入图片描述

9 报错信息

报错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等功能。

在这里插入图片描述

Read more

【AI深究】卷积神经网络:CNN深度解析——全网最详细全流程详解与案例(附Python代码演示)|数学表达、主流变体与架构创新、优缺点与工程建议、调优技巧|经典变体:ResNet、DenseNet详解

【AI深究】卷积神经网络:CNN深度解析——全网最详细全流程详解与案例(附Python代码演示)|数学表达、主流变体与架构创新、优缺点与工程建议、调优技巧|经典变体:ResNet、DenseNet详解

大家好,我是爱酱。本篇将会系统梳理卷积神经网络(Convolutional Neural Network, CNN)的原理、结构、数学表达、典型应用、可视化代码示例与工程实践,帮助你全面理解这一深度学习的“感知基石”。 注:本文章含大量数学算式、详细例子说明及大量代码演示,大量干货,建议先收藏再慢慢观看理解。新频道发展不易,你们的每个赞、收藏跟转发都是我继续分享的动力! 注:本文章颇长超过8000字长、以及大量详细、完整的Python代码、非常耗时制作,建议先收藏再慢慢观看。新频道发展不易,你们的每个赞、收藏跟转发都是我继续分享的动力! 一、CNN的核心定义与结构 卷积神经网络(CNN)是一种专为处理具有类似网格结构的数据(如图像、音频、时序信号)而设计的深度神经网络。其核心思想是通过卷积操作自动提取局部特征,实现空间不变性和参数高效性。 * 英文专有名词:Convolutional Neural Network, CNN * 主要结构: * 卷积层(Convolutional

By Ne0inhk
飞牛NAS有IPV6,想用DDNS-GO动态解析到域名?这简单了!

飞牛NAS有IPV6,想用DDNS-GO动态解析到域名?这简单了!

前言 昨天更新了关于在阿里云上注册域名的内容,通过昨天的内容,想必小伙伴们手上都有域名了吧! * 如何在阿里云上申请注册一个自己的专属顶级域名?我敢说再也没有这么详细的了!(点我跳转) 那么今天咱们就来一场酣畅淋漓的唠嗑!顺带讲讲在飞牛上做好DDNS-GO动态解析!坐好了,准备发车! 域名搞定之后,一定要确认域名状态,在域名列表上找到对应域名的状态,一定要显示“正常”才行 另外点击进入【解析】页面,一定要看到提示【域名的DNS信息配置正确】 如果显示【DNS服务器配置异常】则还要再等等 有很多小伙伴都问:最近的教程好像都没啥流量,为啥不做那些有流量的东西呢?因为小白最近学的就是这些内容,只是怕时间一久就忘记了,所以把这些内容以文字的形式记录下来,方便自己查阅,也能帮到需要的小伙伴! 毕竟……好记性不如烂电脑打字出来……(小白已经好久没有拿笔写字了) 好了,确认了域名状态正确之后,就可以开始今天的教程: 正文开始 教程分为三步: * 获取Access key * 飞牛DDNS-GO * 检查域名解析状态 如果你熟悉整个流程,那绑定的时

By Ne0inhk
[架构之美]若依框架前后端分离版部署全流程详解(本地+服务器+高级配置)

[架构之美]若依框架前后端分离版部署全流程详解(本地+服务器+高级配置)

若依框架前后端分离版部署全流程详解(本地+服务器+高级配置) 若依(RuoYi)作为一款基于SpringBoot和Vue的权限管理系统,凭借其模块化设计和开箱即用的特性广受开发者欢迎。本文将从本地部署、服务器部署、高级配置三个维度,结合常见问题解决方案,详细讲解若依框架前后端分离版的完整部署流程,助力开发者快速上手。 一、本地部署(开发环境) #下载地址 https://www.ruoyi.vip/ #环境准备 JDK >=1.8(推荐1.8版本) Mysql >=5.7.0 (推荐5.7版本) Redis >=3.0 Maven >=3.0 Node >=12 1. 环境准备 * 后端依赖:

By Ne0inhk
Flutter 组件 aws_lambda_dart_runtime_ns 的鸿蒙化适配实战 - 实现 OpenHarmony 分布式端高性能云端协同、冷启动指纹预检与工业级边缘计算核方案

Flutter 组件 aws_lambda_dart_runtime_ns 的鸿蒙化适配实战 - 实现 OpenHarmony 分布式端高性能云端协同、冷启动指纹预检与工业级边缘计算核方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 aws_lambda_dart_runtime_ns 的鸿蒙化适配实战 - 实现 OpenHarmony 分布式端高性能云端协同、冷启动指纹预检与工业级边缘计算核方案 前言 在鸿蒙(OpenHarmony)生态的分布式边缘计算、强云端一体化架构或者是对冷启动耗时有极其严苛要求的 0308 批次企业级应用中。“云原生函数的执行效率与边缘执行环境的指纹预检维度”是衡量整个系统算力调度稳定性的最终质量门禁。面对包含每秒数百万次调用的 Lambda 函数集群、动态变化的 AWS 环境变量、甚至是由于跨域转发产生的 0308 批次请求转发波次。如果仅仅依靠简单的“HTTP 转发”或者是干瘪的裸进程运行。不仅会导致在处理高并发云请求时让系统如同在逻辑废墟中盲人摸象。更会因为运行时环境不兼容。令应用在关键业务触发时瞬间陷入无响应盲区。 我们需要一种“逻辑严密、运行时自适应”的算子调度艺术。 aws_lambda_dart_

By Ne0inhk