• 下载项目

项目地址:

https://github.com/Intellindust-AI-Lab/DEIM

        打开网页后,可以选择下载方式,本次用的是下载zip的方式,将下载得到的文件解压到E:\DEIM-main目录下:

接下来,跟着项目的README.md文件,一步一步部署和运行项目。


1、预训练模型

在GitHub的项目网页中,列出了下面两种预训练模型:

两种模型都很优秀,根据需要选择基于D-FINE或RT-DERT的DEIM模型。

如果想深入了解这两个模型,它们的项目地址:

https://github.com/lyuwenyu/RT-DETR/blob/main/README_cn.md

以及

https://github.com/Peterande/D-FINE/blob/master/README_cn.md

可以打开以上网址了解或下载。


两种模型的适用场景:

两种模型分别适用哪些应用场景,我问了豆包,总结如下:

        基于 DEIMv2 技术改进的 D-FINE(如 DEIM-D-FINE)和 RT-DETRv2(及结合 DEIMv2 的版本),由于核心设计目标和性能侧重不同,适用场景存在明显差异,具体如下:

  • 基于 DEIMv2 的 D-FINE(如 DEIM-D-FINE)适用场景

        DEIM-D-FINE 的核心优势是在保持实时性的同时,通过 DEIM 的训练优化策略进一步提升检测精度,尤其强化了小目标和复杂场景的表现,因此更适合对精度有较高要求、且需要平衡速度的场景:

  • 安防监控:需检测远距离小目标(如远处行人、车辆细节),同时要求实时反馈(如异常行为预警)。
  • 无人机巡检:航拍场景中目标尺度差异大(从近处大型设备到远处小型部件),需高精度识别故障或异常,且无人机算力有限,需高效模型。
  • 智能驾驶(低算力场景):如低速自动驾驶(园区、港口),需检测周边行人、障碍物(包括小目标如锥桶),同时适配车载中端芯片(如 NVIDIA Jetson 系列)。
  • 工业质检:生产线中检测微小缺陷(如电子元件的划痕、焊点瑕疵),要求高精度且实时响应(不影响生产节拍)。

    基于 DEIMv2 的 RT-DETRv2 适用场景

        RT-DETRv2 本身是面向极致实时性的检测器,结合 DEIMv2 后进一步优化了效率和多尺度适应性,更适合对速度要求苛刻、硬件资源受限的场景:

  • 移动端实时应用:如手机端视频特效(实时手势 / 物体跟踪)、短视频内容审核(快速识别违规物体),需在低功耗移动芯片(如骁龙、天玑)上实现毫秒级推理。
  • 高速实时追踪:如体育赛事直播中的运动员实时追踪、车流监控中的高速车辆计数,要求模型在高帧率(30fps 以上)下稳定运行。
  • 边缘计算设备:如嵌入式摄像头(智能门铃、家用监控),硬件算力有限(通常为 ARM 架构),需轻量化模型满足实时性(延迟<50ms)。
  • 大规模部署场景:如城市级摄像头联网监控,需在服务器集群中同时处理数千路视频流,模型需兼顾单路速度和资源占用(降低显存 / 内存消耗)。

核心差异总结

维度 基于 DEIMv2 的 D-FINE 基于 DEIMv2 的 RT-DETRv2
性能侧重 精度优先,兼顾实时性(尤其小目标) 速度优先,极致效率(多尺度适配)
硬件适配 中端算力设备(如 Jetson、中端 GPU) 低算力设备(移动端、边缘设备)
场景关键词 小目标、复杂场景、高精度需求 高速实时、大规模部署、低功耗

        选择时需根据场景的精度需求、硬件算力、实时性要求三者平衡:高精度 + 中小算力选 DEIM-D-FINE;高速度 + 低算力选 DEIMv2 优化的 RT-DETRv2。


模型下载

        我下载了以上所有的yml文件和checkpoint文件,并上传到百度网盘,方便没法上科学网时下载。

https://pan.baidu.com/s/1n86W_Ud2XE2h3iscXWPzVQ?pwd=2emu   提取码2emu


2、快速开始

  • 配置环境

按要求,创建conda环境并安装requirements.txt中指定的包。

conda create -n deim python=3.11.9
conda activate deim
pip install -r requirements.txt

        需要注意的是,cuda版本应该是11.8或12.1、12.4,因为requirements.txt中要求torch>=2.0.1,环境的python=3.11,符合这两个条件的cuda版本只有11.8和12.1、12.4,可以在下面的网页查询到合适的版本:

https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/linux-64/

查询的结果:

        Windows系统下,直接安装requirements.txt,会安装一个CPU版的pytorch,无法使用GPU。所以需要把requirements.txt中的pytorch和torvision去掉,手动安装这两个(CUDA版的),然后再自动安装requirements.txt中的其余包。

关于torch的版本,按照项目要求是>=2.0.1,但是安装了2.0.1后会出错,提示:

Disabling PyTorch because PyTorch >= 2.1 is required but found 2.0.1+cu118

如果安装了2.1.1的pytorch,运行中会报错:

AttributeError: module 'torch.utils._pytree' has no attribute 'register_pytree_node'. Did you mean: '_register_pytree_node'?

经实践,合适的版本是2.1.0,安装torch的指令:

pip install torch==2.1.0+cu118 torchvision==0.16.0+cu118 --index-url https://download.pytorch.org/whl/cu118

  • 准备数据集     

        首先,准备图片,并将其存放在同一个文件夹内。我这里从coco数据集中选了200张图片作为实验数据,如果使用自己的图片,方法相同。

        然后,选择一个标注软件进行标注。常见的标注软件有CVAT、labelme、makesense.ai等,这里选择了makesense.ai,相对来说简单易用。

  • makesense.ai的使用方法:

        打开网址https://www.makesense.ai/,在网页中直接就可以进行操作。打开网页后点击:Get Starteted

然后:

选择100个文件:

选择标注类型:       

两种模式的区别:

  • 目标检测(Object Detection):“框”出每个物体,告诉模型“图里有猫、狗,分别在哪”。
  • 图片识别/分类(Image Classification):“整图”打标签,告诉模型“这张图就是猫,别管它在哪”。

这里选目标检测。

网页出现了选择类别标签的界面:

        可以在网页上随时输入类别标签,也可以提前编辑好物体的类别,每一类占一行存为txt文件后,点击:Load labels from file导入txt文件。

导入成功:

点击Start project开始标注,使用多边形工具:

在标注过程中可以随时编辑和增加标签:

标注完成后,导出标注结果:

选择了coco格式:

点击Export,浏览器会下载得到的标注文件,其内容如下:

至此,得到了训练集的100张图片的标注文件。

用同样的方法,再标注100张图片,作为验证集。

        按照项目的要求,如果使用自定义数据,使用以下的文件结构:

        按照要求,创建目录并将前面步骤训练集的100张图片复制到E:\DEIM-main/dataset/images/train/,验证集的100张图片复制到E:\DEIM-main/dataset/images/val/。训练集和验证集的标注文件复制到E:\DEIM-main/dataset/,并分别将文件名改为:instances_train.json和instances_val.json:

  • 修改配置

  修改custom_detection.yml,它的文件位置在:

需要修改的内容:

 修改后的实际文件:

task: detection

evaluator:
  type: CocoEvaluator
  iou_types: ['bbox', ]

num_classes: 58 # your dataset classes
remap_mscoco_category: False

train_dataloader:
  type: DataLoader
  dataset:
    type: CocoDetection
    img_folder: dataset/images/train
    ann_file: dataset/annotations/instances_train.json
    return_masks: False
    transforms:
      type: Compose
      ops: ~
  shuffle: True
  num_workers: 1
  drop_last: True
  collate_fn:
    type: BatchImageCollateFunction


val_dataloader:
  type: DataLoader
  dataset:
    type: CocoDetection
    img_folder: dataset/images/train
    ann_file: dataset/annotations/instances_val.json
    return_masks: False
    transforms:
      type: Compose
      ops: ~
  shuffle: False
  num_workers: 4
  drop_last: False
  collate_fn:
    type: BatchImageCollateFunction

 3、使用方法

  •  训练:

        在项目中给出了一条训练的指令:

CUDA_VISIBLE_DEVICES=0,1,2,3 torchrun --master_port=7777 --nproc_per_node=4 train.py -c configs/deim_dfine/deim_hgnetv2_${model}_coco.yml --use-amp --seed=0

命令详解:

  1. CUDA_VISIBLE_DEVICES=0,1,2,3:指定训练可使用的 GPU 设备编号为 0、1、2、3(共 4 张 GPU),限制程序只能访问这些 GPU。

  2. torchrun:PyTorch 官方推荐的分布式训练启动工具,替代了旧的torch.distributed.launch,能自动管理进程和节点通信。

  3. --master_port=7777:指定主节点(master)的通信端口为 7777,用于分布式进程间的初始化通信(需确保端口未被占用)。

  4. --nproc_per_node=4:指定每个节点(当前机器)启动 4 个进程,与可用 GPU 数量(4 张)对应,通常每个进程绑定一张 GPU。

  5. train.py:训练脚本的入口文件。

  6. -c configs/deim_dfine/deim_hgnetv2_${model}_coco.yml:通过-c参数指定训练配置文件路径,其中${model}是一个变量(需提前定义具体模型名称,如largebase等),配置文件包含数据集路径、模型参数、训练超参等设置。

  7. --use-amp:启用混合精度训练(Automatic Mixed Precision),加速训练并减少显存占用。

  8. --seed=0:设置随机种子为 0,保证实验的可复现性。

  9. 更多的训练参数,在项目的train.py中有定义:
     

      # priority 0
        parser.add_argument('-c', '--config', type=str, required=True)   # 配置项,必需的
        parser.add_argument('-r', '--resume', type=str, help='resume from checkpoint')   #  从检查点恢复
        parser.add_argument('-t', '--tuning', type=str, help='tuning from checkpoint')   # 从检查点微调
        parser.add_argument('-d', '--device', type=str, help='device',)      # 设备,可选的
        parser.add_argument('--seed', type=int, help='exp reproducibility')   # 实验可重复性,可选的
        parser.add_argument('--use-amp', action='store_true', help='auto mixed precision training')   #  自动混合精度训练,可选的
        parser.add_argument('--output-dir', type=str, help='output directoy')      # 输出目录,可选的
        parser.add_argument('--summary-dir', type=str, help='tensorboard summary')  #  张量板,用于指定 TensorBoard 日志文件(summary 文件)的存储目录
        parser.add_argument('--test-only', action='store_true', default=False,)       #  仅测试,可选的
    
        # priority 1
        parser.add_argument('-u', '--update', nargs='+', help='update yaml config')     # 更新yaml配置
    
        # env
        parser.add_argument('--print-method', type=str, default='builtin', help='print method')       # 打印方法,默认内置
        parser.add_argument('--print-rank', type=int, default=0, help='print rank id')       # 打印rank id,默认0
    
        parser.add_argument('--local-rank', type=int, help='local rank id')    #  本地rank id

    比如,想要在训练中断后继续原来的检查点训练,就可以增加指令:

    --resume /checkpoints/check007.pth

    再如,想要在预训练模型的基础上微调,就增加指令:

    -t deim_dfine_hgnetv2_n_coco_160e.pth  # 权重文件位于项目的根目录

    或:

    -t /ckpts/deim_dfine_hgnetv2_n_coco_160e.pth   # 当权重文件不在根目录下,就指定目录

        其中的deim_dfine_hgnetv2_n_coco_160e.pth是从项目网页中下载的预训练权重。

  • 根据自己的实际情况修改上面的指令。

        比如我本次训练用的指令:

        CUDA_VISIBLE_DEVICES=0,1 torchrun --master_port=7777 --nproc_per_node=2 train.py -c configs/deim_dfine/deim_hgnetv2_s_coco.yml --use-amp --seed=0

        这是Linux下的命令,如果在Windows下运行,需要把相应的指令根据Windows的格式需要改为:

set CUDA_VISIBLE_DEVICES=0,1 && torchrun --master_port=7777 --nproc_per_node=2 --rdzv_backend=c10d train.py -c configs/deim_dfine/deim_hgnetv2_s_coco.yml --use-amp --seed=0

        本次的Windows机器是单显卡的,要去掉指令中的有关分布式训练的指令,否则会报错,所以最终的实际运行指令是:

set CUDA_VISIBLE_DEVICES=0 && "C:\Users\DY\.conda\envs\deim\python.exe" train.py -c configs/deim_dfine/deim_hgnetv2_s_coco.yml --use-amp --seed=0

        需要注意的是,由于是使用了自定义数据集,所以还需要修改本次训练用的模型的配置,将它的调用yml文件指向自定义的yml:

把第一行的yml修改为custom_detection.yml:


在Windows下运行,会报错:

File "C:\Users\DY\.conda\envs\deim\Lib\site-packages\faster_coco_eval\core\coco.py", line 326, in load_json _data = json.load(io) ^^^^^^^^^^^^^ File "C:\Users\DY\.conda\envs\deim\Lib\json\__init__.py", line 293, in load return loads(fp.read(), ^^^^^^^^^ UnicodeDecodeError: 'gbk' codec can't decode byte 0xac in position 92490: illegal multibyte sequence

        原因是COCO 数据集的标注文件均为 UTF-8 编码,而 Windows 系统默认文件编码为gbk,因此直接读取会导致解码错误。解决方法:

将C:\Users\DY\.conda\envs\deim\Lib\site-packages\faster_coco_eval\core\coco.py的第325行,

 with open(json_file) as io: _data = json.load(io)

改为:

with open(json_file, encoding="utf-8") as io:

即可正常训练。

如果不使用预训练模型,首次训练会自动下载一个权重文件,需要科学网连接:

错漏之处,烦请指正!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐