当前位置:   article > 正文

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

yolov10论文


论文标题: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 = m ( α o 2 m , β o 2 m ) m_{o2m}=m(α_{o2m}, β_{o2m}) mo2m=m(αo2m,βo2m) 。这些指标会影响一对一和一对多这两个头部的标签分配和监督信息。

在双重标签分配中,一对多分支提供了比一对一分支更丰富的监督信号。因此,作者朝着一对多的头部优化的方向对一对一的头部进行优化。这样使得一对一头部在推理过程中可以提供更高质量的样本,从而获得更好的性能。

为此,作者分析了一对一和一对多两个头部之间的监督差距。由于训练期间的随机性,作者从使用相同值初始化的两个头开始开始检查并产生相同的预测,即一对一头和一对多头为每个预测实例对生成相同的 p p p I o U IoU IoU。作者注意到,两个分支的回归目标不冲突,因为匹配的预测共享相同的目标,并且忽略不匹配的预测。因此,监管差距在于不同的分类目标。

作者将其与预测的最大IoU表示为 u ∗ u^* u,最大的一对一和一对多匹配分数分别为 m o 2 o ∗ m^*_{o2o} mo2o m o 2 m ∗ m^*_{o2m} mo2m 。假设一对多分支产生了正样本 Ω Ω Ω,而一对一分支选择了使用度量 m o 2 o , i m_{o2o},i mo2o,i= m o 2 o ∗ m^*_{o2o} mo2o 的第 i i i个预测,则作者可以推导出一对多分支的分类目标 t o 2 m , j t_{o2m,j} to2m,j = u ∗ ⋅ m o 2 m , j m o 2 m ≤ u ∗ u^*·\frac{m_{o2m,j}}{m_{o2m}}≤u^* umo2mmo2m,ju。对于 j ∈ Ω j∈Ω jΩ和一对一任务的对齐损失 t o 2 o , i = u ∗ ⋅ m o 2 o , i m o 2 o = u ∗ t_{o2o,i} = u^*·\frac{m_{o2o,i}}{m_{o2o}}=u^* to2o,i=umo2omo2o,i=u。因此,可以通过不同分类目标的1-Wasserstein距离来推导两个分支之间的监督差距:
在这里插入图片描述
作者观察到,随着 t o 2 m , i t_{o2m,i} to2m,i 的增加,差距在缩小,即 i i i Ω Ω Ω中的排名更高。当 t o 2 m , i t_{o2m,i} to2m,i = u ∗ u^* u时,差距达到最小,即 i i i Ω Ω Ω中最佳的正样本,如Figure2(a)所示。为了实现这一点,作者提出了保持一致的匹配度量,即 α o 2 o = r ⋅ α o 2 m α_{o2o}=r·α_{o2m} αo2o=rαo2m β o 2 o = r ⋅ β o 2 m β_{o2o}=r·β_{o2m} βo2o=rβo2m,这意味着 m o 2 o ∗ m^*_{o2o} mo2o= m o 2 m r m^r_{o2m} mo2mr。因此,对于一对多头来说最佳的阳性样本对于一对一头来说也是最佳的。因此,两个头可以一致和谐地优化。为了简便,作者将 r r r设为1,默认 α o 2 o = α o 2 m α_{o2o}=α_{o2m} αo2o=αo2m β o 2 o = β o 2 m β_{o2o}=β_{o2m} βo2o=βo2m。为了验证改进的监督对齐,作者在训练后统计了一对多结果前1/5/10中一对一匹配对的数量。如Figure2(b)所示,在一致的匹配度量下,对齐得到了改善。为了更全面地理解数学证明,请参考附录。

2.2 Holistic Efficiency-Accuracy Driven Model Design

作者探讨了模型架构表现出不可忽略的计算冗余和约束能力,这阻碍了其实现高效率和性能的潜力。因此,作者从效率和准确性的角度全面执行YOLOs的模型设计。
在这里插入图片描述

高效驱动模型设计 Efficiency driven model design
  • (1)Lightweight classification head:作者简单地对分类头采用轻量级架构,它由两个深度可分离卷积组成,内核大小为 3×3,然后是 1×1 卷积
  • (2)Spatial-channel decoupled downsampling:利用点卷积对通道维数进行调整,然后利用深度卷积进行空间下采样,这样做可以最大化下采样期间的信息保留,导致与延迟减少竞争的性能。
  • (3)Rank-guided block design:YOLOs通常对所有阶段使用相同的基本构建块,但在深层阶段和大模型容易表现出更多的冗余、因此,作者利用内在秩来分析每个阶段的冗余性,并提出了一种秩引导的块设计方案,旨在通过紧凑型架构设计减少被显示为冗余的阶段的复杂性。首先,作者提出了一个CIB结构,它采用深度卷积进行空间混合和高效的点卷积进行通道混合,如Figure3(b)所示。它可以作为高效的基本构建块,嵌入到ELAN结构。然后,作者提倡一种秩引导的块分配策略,在保持竞争力的同时实现最佳效率。作者在附录中也给出了秩引导的块分配策略,请参考附录。
准确驱动模型设计 Accuracy driven model design
  • (1)Large-kernel convolution:采用大核深度卷积是扩大感受野和增强模型能力的有效方法,然而,简单地在所有阶段利用它们可能会在用于检测小物体的浅层特征中引入污染(噪声),同时也在高分辨率阶段引入显著的I/O开销和延迟。因此作者将CIB块中第二个3×3深度卷积的核大小增加到7×7。此外,作者采用结构重新参数化技术来引入另一个 3×3 深度卷积分支来缓解优化问题,而无需推理开销。此外,随着模型大小的增加,其感受野自然扩大,这得益于使用大内核卷积递减。因此,作者只对小模型尺度采用大核卷积。

  • (2)Partial self-attention (PSA):由于自注意力机制表现出较高的计算复杂度和内存占用,因此作者提出一个有效的部分自我注意(PSA)模块,如Figure 3©所示,在1×1卷积之后,作者将跨通道的特征均匀地划分为两部分,只将一部分输入由多头自注意力模块 (MHSA) 和前馈网络 (FFN) 组成的 NPSA 块。然后通过 1×1 卷积连接和融合两部分。此外,作者遵循将query和key的维度分配给MHSA中值的一半,并将LayerNorm替换为BatchNorm进行快速推理。此外,PSA只在分辨率最低的阶段4之后放置,避免了自注意二次计算复杂度的过度开销。


三、实验分析

作者选择YOLOv8作为baseline model,通过无 NMS 训练采用一致的双重分配,并在此基础上进行整体效率-精度驱动模型设计,推出了 YOLOv10 模型。YOLOv10 与 YOLOv8 具有相同的变体,即 N / S / M / L / X。此外,作者通过简单地增加YOLOv10-M的宽度比例因子,推导出一种新的变体YOLOv10-B。作者的实验采用training-from-scratch设置,在COCO上验证了所提出的检测器。此外,所有模型的延迟在带有TensorRT FP16的T4 GPU上进行了测试。
具体的实验细节和实验结论,请参考论文和附录,这里就不展开阐述了。


四、YOLOv10算法在VisDrone数据集的训练

  • 一、VisDrone2019数据集
    1、作者基于YOLOv8算法改进的,因此很多训练方式跟v8很类似,这里先下载YOLOv10代码,这里就不过多展示;
    2、针对VisDrone2019数据集的介绍,这里就不多阐述,这边给出VisDrone数据集下载链接: VisDrone2019 ;或者作者已经整理好相应百度网盘链接: VisDrone 提取码:htmg
    3、将VisDrone.yaml配置文件放置到 yolov10-main/ultralytics/cfg/datasets目录下,这里给出VisDrone.yaml文件配置:
train: datasets/VisDrone/train/images  # train images (relative to 'path')  6471 images
val: datasets/VisDrone/val/images  # val images (relative to 'path')  548 images
test: datasets/VisDrone/test/images  # test images (optional)  1610 images

# Classes
names:
  0: pedestrian
  1: people
  2: bicycle
  3: car
  4: van
  5: truck
  6: tricycle
  7: awning-tricycle
  8: bus
  9: motor

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

注意:这里训练、验证和测试记得修改为自己数据集的路径!

  • 二、实验的配置参数与训练

对于训练的超参数的设定,请参考 ultralytics/cfg/default.yaml 文件,这里就不展示了。

本文训练VisDrone数据集时,在代码根目录下创建了main.py,代码如下:

from ultralytics import YOLOv10

if __name__ == '__main__':
    # Load a model
    model = YOLOv10(r"ultralytics/cfg/models/v10/yolov10l.yaml", verbose=True)  # build a new model from scratch
    # Use the model
    model.train(data="ultralytics/cfg/datasets/VisDrone.yaml", epochs=200)  # train the model
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

上述准备做好之后,基本上就可以训练了。
下面是测试结果:

	from ultralytics import YOLOv10
	model = YOLOv10(r"runs/detect/train/weights/best.pt", verbose=True)  # build a new model from scratch
    # # Use the model
    metrics = model.val(data=r"ultralytics/cfg/datasets/VisDrone.yaml", split="test", save_json=False)  # evaluate model performance on the validation set
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述


五、总结

在本文中,作者在 YOLOs检测任务中同时针对后处理和模型架构。对于后处理,作者提出了用于无 NMS 训练的一致双重分配,实现了高效的端到端检测。对于模型架构,作者引入了整体效率-精度驱动模型设计策略,提高了性能-效率权衡。大量的实验表明,与其他先进的检测器相比,YOLOv10实现了最先进的性能和延迟,很好地证明了它的优越性。

以上就是本篇文章的内容,若有问题欢迎各位批评指正~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/692658
推荐阅读
相关标签
  

闽ICP备14008679号