D-FINE环境搭建&推理测试

引子

        在目标检测领域,内卷严重的实时目标检测 (Real-time Object Detection) 领域,性能与效率始终是难以平衡的核心问题。绝大多数现有的 SOTA 方法仅依赖于更先进的模块替换或训练策略,导致性能逐渐趋于饱和。前阵子YOLOv11横空出世(感兴趣的童鞋可以移步YOLOv11环境搭建&推理测试_yolo11测试-优快云博客),我一直感觉实时目标检测已经差不多到头了,这不,又来了一篇卷的文章。这才过去这么短的时间,为了打破这一性能和效率的瓶颈,来自中科大的研究团队提出了 D-FINE,重新定义了边界框回归任务。OK,那就让我们开始吧。

一、模型介绍

        不同于传统的固定坐标预测,D-FINE 创新了两种方法:细粒度分布优化 (FDR) 和全局最优定位自蒸馏 (GO-LSD)。通过将回归任务转化为细粒度的分布优化任务,D-FINE 不仅显著简化了优化难度,还能够更精确地建模每条边界的不确定性。此外,D-FINE 将定位知识 (Localization Knowledge) 融入到模型输出,通过高效的自蒸馏策略在各层共享这些知识,因而在不增加额外训练成本的前提下,实现了性能的进一步显著提升。凭借这些创新,D-FINE 在 COCO 数据集上以 78 FPS 的速度取得了 59.3% 的平均精度 (AP),远超 YOLOv10、YOLO11、RT-DETR v1/v2/v3 及 LW-DETR 等竞争对手,成为实时目标检测领域新的领跑者。目前,D-FINE 的所有代码、权重以及工具已开源,包含了详细的预训练教程和自定义数据集处理指南。

        让我们看下与YOLOv11的对比,左边是D-FINE的超大杯,右边是YOLOv11的,大眼看过去,对于逆光模糊的场景,D-FINE确实效果要好很多。

二、环境安装

代码仓库

git clone GitHub - Peterande/D-FINE: D-FINE: Redefine Regression Task of DETRs as Fine-grained Distribution Refinement 💥💥💥

环境安装

docker run --rm -it --gpus=all -v /datas/work/zzq:/workspace pytorch/pytorch:2.0.1-cuda11.7-cudnn8-devel bash

cd /workspace/D-FINE/D-FINE-master

pip install -r requirements.txt -i Simple Index

pip install onnx -i https://pypi.tuna.tsinghua.edu.cn/simple

pip install onnxsim -i https://pypi.tuna.tsinghua.edu.cn/simple

三、测试推理

(1)训练

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

(2)测试

CUDA_VISIBLE_DEVICES=0,1,2,3 torchrun --master_port=7777 --nproc_per_node=4 train.py -c configs/dfine/dfine_hgnetv2_${model}_coco.yml --test-only -r model.pth

(3)推理

python tools/inference/torch_inf.py -c configs/dfine/dfine_hgnetv2_x_coco.yml -r models/dfine_x_obj2coco.pth --im-file bus.jpg --device cuda:0

(4)导出

python tools/deployment/export_onnx.py --check -c configs/dfine/dfine_hgnetv2_x_coco.yml -r models/dfine_x_obj2coco.pth

首先,我们需要创建一个自定义的 Text 类,其中包含一个 append 方法,可以将文本追加到 Text 控件中。接着,我们可以使用 Python 标准库中的 io.StringIO 类来捕获 print 输出,并将其重定向到我们自定义的 Text 控件中。具体实现代码如下: ```python import io import sys import tkinter as tk class CustomText(tk.Text): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def append(self, text): self.insert(tk.END, text) self.see(tk.END) class RedirectText: def __init__(self, text_ctrl): self.output = io.StringIO() self.text_ctrl = text_ctrl def write(self, string): self.output.write(string) self.text_ctrl.append(string) def flush(self): pass def main(): root = tk.Tk() text_ctrl = CustomText(root) text_ctrl.pack() redirect = RedirectText(text_ctrl) sys.stdout = redirect # 在这里开始你的代码,可以使用 print() 打印输出,将会重定向到 text_ctrl 中 root.mainloop() if __name__ == '__main__': main() ``` 在这个例子中,我们创建了一个 CustomText 类,这个类继承自 tkinter 的 Text 类,但是添加了一个新的方法 append,当我们调用这个方法时,可以将给定的文本追加到 Text 控件的末尾,同时将其滚动到最近添加的一行的位置。 然后,我们创建了一个叫做 RedirectText 的类,这个类实现了 write 方法,该方法将输出字符串写入一个 io.StringIO 实例,并且使用前面定义的 CustomText 控件的 append 方法,将输出字符串重定向到 Text 控件中。 最后,在我们的 main 函数中,我们创建了 CustomText 控件和 RedirectText 实例,并使用 sys.stdout = redirect 语句将 sys.stdout 对象(负责标准输出)重定向为 RedirectText 的实例。然后,我们可以开始编写任何需要输出的 Python 代码,所有的输出都将被重定向到 Text 控件中。 希望这个示例代码对您有所帮助!
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

要养家的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值