【论文解析】YOLOv10论文解析与VisDrone数据集训练


论文标题:YOLOv10:Real-Time End-to-End Object Detection
论文作者源码:Github | YOLOv10
YOLOv9还没出来多久,清华团队的YOLOv10算法就已经出来,而且在速度和精度上都赶超v8和v9,下面我们一起看看YOLOv10算法
在这里插入图片描述

一、文章摘要

背景和动机:YOLOs系列架构中,依赖非最大值抑制(NMS)进行后处理阻碍了YOLO的端到端部署,这对推理延迟产生不利影响。此外,YOLOs模型中各组分的设计缺乏全面、彻底思考,导致计算冗余明显,由此产生的受约束的模型能力也导致了较差的性能。

作者的方法和思想:提出一种consistent dual assignment 策略,解决后处理中冗余预测的问题,它同时带来了具有竞争力的性能和低推理延迟;其次,引入了基于效率-精度驱动的整体模型设计策略,从效率和精度两个角度对YOLOs的各个组成部分进行了全面优化,大大降低了计算开销,提升了性能。

实验结果:大量的实验表明,YOLOv10在各种模型尺度上都达到了最先进的性能和效率。例如,YOLOv10-S在COCO上类似的AP下比RT-DETR-R18快1.8倍,同时参数数量和FLOPs减少2.8倍。与YOLOv9-C相比,在相同性能下,YOLOv10-B的延迟减少了46%,参数减少了25%


二、方法论和思想

2.1 Consistent Dual Assignments for NMS-free Training

在训练过程中,YOLOs架构通常利用TAL(Task Alignment Learning)为每个实例分配多个正样本。但是,YOLOs需要依赖NMS的后处理,导致部署的推理效率不够理想。虽然以前的研究探索一对一匹配来抑制冗余预测,但它们通常会引入额外的推理开销或产生次优性能。因此,作者引入Dual label assignments 和 Consistent matching metric来解决上述问题。
在这里插入图片描述

双重标签匹配 Dual label assignments

与一对多分配不同,一对一匹配只为每个基本事实分配一个预测,避免了 NMS 后处理。然而,它导致了弱监督,这导致了次优的准确性和收敛速度。因此,作者引入双重标签分配(dual label assignments )策略,以结合这两种策略的优点。
作者为YOLOs引入一对一头部,它保留了一对多头部的相同结构,并采用与原始一对多分支相同的优化目标,但利用一对一匹配来获得标签分配。在训练期间,两个头部与模型联合优化。

在推理过程中,作者丢弃一对多的头部并利用一对一的头部进行预测。 这使得 YOLO 能够用于端到端部署,而不会产生任何额外的推理成本。此外,在一对一匹配中,我们采用top_1选择方法,实现了与匈牙利匹配相同的性能,训练时间更少。

一致匹配度量 Consistent matching metric

在标签分配过程中,一对一和一对多方法都采用一种度量来定量评估预测与实例之间的一致性水平。为了实现两个分支的预测感知匹配,作者采用了一个统一的匹配度量:
m ( α , β ) = s ⋅ p α ⋅ I o U ( b ^ , b ) β m(α, β) = s·p^α ·IoU(\widehat{b}, b)^β m(α,β)=spαIoU(b ,b)β

其中 p p p为分类得分, b b b b ^ \widehat{b} b 为表示预测和实例的边界框, s s s表示空间先验,指示预测的锚点是否在实例内。 α α α β β β是平衡语义预测任务和位置回归任务影响的两个重要超参数。作者将一对一和一对多指标记为 m o 2 o = m ( α o 2 o , β o 2 o ) m_{o2o}=m(α_{o2o}, β_{o2o}) mo2o=m(αo2o,βo2o) m o 2 m =

### YOLOv9模型在VisDrone数据集上的训测试 #### 准备工作 为了能够在VisDrone数据集上顺利运行YOLOv9模型,首先需要完成一系列准备工作。这包括但不限于设置合适的开发环境以及获取必要的软件包和支持库。 对于环境搭建而言,建议创建一个新的Python虚拟环境来隔离项目依赖项,并确保安装了特定版本的PyTorch框架以及其他可能需要用到的支持工具或库[^3]。具体来说: - 创建并激活一个全新的Python虚拟环境; - 安装指定版本号的PyTorch(例如`pip install torch==1.11.0 torchvision torchaudio`); - 下载官方发布的YOLOv9源码仓库到本地计算机; #### 数据预处理 接下来是对VisDrone数据集本身做出适当调整以便于后续建模工作的开展。考虑到原始图像尺寸差异较大等因素,在实际应用前通常还需要执行一些额外的数据清洗和标准化操作,比如裁剪、缩放等变换措施以适应网络输入需求[^1]。 此外,按照惯例应当把整个数据集合合理划分为三个独立子集——即训集、验证集及最终评测使用的测试集,从而使得实验设计更加科学严谨[^2]。 #### 模型定制化配置 尽管提到并未更改原有的YOLOv5s架构设定,但在切换至更先进的YOLOv9版本时,则有必要重新审视默认参数选项是否仍然适用当前任务场景下的最优解法。此时可以通过编辑相应的`.yaml`文件来进行微调优化,如调整锚框大小、类别数量定义等方面的内容。 #### 开始训过程 一旦上述各项前期筹备活动均已完成之后,就可以着手启动正式的训流程了。一般情况下会通过命令行界面提交作业脚本给GPU集群调度管理系统负责分配计算资源直至迭代结束为止。期间需密切关注损失函数收敛情况及其伴随产生的各类中间产物保存路径规划等问题。 ```bash !python train.py --data visdrone.yaml --weights yolov9.pt ``` #### 性能评估环节 当一轮完整的周期结束后便进入到至关重要的结果分析阶段。利用之前预留出来的那部分未曾见过的真实样本作为评判标准之一,以此衡量新构建出来的目标识别系统的泛化能力究竟达到了何种水平。同时也可以借助可视化手段直观展示不同条件下所得出结论之间的异同之处,进而为进一步改进提供方向指引。 ```python from utils.general import check_img_size, non_max_suppression, scale_coords from models.experimental import attempt_load import cv2 import numpy as np def detect(image_path='test.jpg', weights='best.pt'): device = 'cuda' if torch.cuda.is_available() else 'cpu' model = attempt_load(weights, map_location=device) # 加载最佳权重 imgsz = check_img_size(640, s=model.stride.max()) # 输入图片尺寸校验 img = cv2.imread(image_path) # 图像预处理... pred = model(img)[0] det = non_max_suppression(pred, conf_thres=0.25, iou_thres=0.45) for *xyxy, conf, cls in reversed(det[0]): label = f'{model.names[int(cls)]} {conf:.2f}' plot_one_box(xyxy, im0, label=label, color=colors(c), line_thickness=3) detect() ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值