赞
踩
论文标题: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%
在训练过程中,YOLOs架构通常利用TAL(Task Alignment Learning)为每个实例分配多个正样本。但是,YOLOs需要依赖NMS的后处理,导致部署的推理效率不够理想。虽然以前的研究探索一对一匹配来抑制冗余预测,但它们通常会引入额外的推理开销或产生次优性能。因此,作者引入Dual label assignments 和 Consistent matching metric来解决上述问题。
与一对多分配不同,一对一匹配只为每个基本事实分配一个预测,避免了 NMS 后处理。然而,它导致了弱监督,这导致了次优的准确性和收敛速度。因此,作者引入双重标签分配(dual label assignments )策略,以结合这两种策略的优点。
作者为YOLOs引入一对一头部,它保留了一对多头部的相同结构,并采用与原始一对多分支相同的优化目标,但利用一对一匹配来获得标签分配。在训练期间,两个头部与模型联合优化。
在推理过程中,作者丢弃一对多的头部并利用一对一的头部进行预测。 这使得 YOLO 能够用于端到端部署,而不会产生任何额外的推理成本。此外,在一对一匹配中,我们采用top_1选择方法,实现了与匈牙利匹配相同的性能,训练时间更少。
在标签分配过程中,一对一和一对多方法都采用一种度量来定量评估预测与实例之间的一致性水平。为了实现两个分支的预测感知匹配,作者采用了一个统一的匹配度量:
m
(
α
,
β
)
=
s
⋅
p
α
⋅
I
o
U
(
b
^
,
b
)
β
m(α, β) = s·p^α ·IoU(\widehat{b}, b)^β
m(α,β)=s⋅pα⋅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^*
u∗⋅mo2mmo2m,j≤u∗。对于
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=u∗⋅mo2omo2o,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)所示,在一致的匹配度量下,对齐得到了改善。为了更全面地理解数学证明,请参考附录。
作者探讨了模型架构表现出不可忽略的计算冗余和约束能力,这阻碍了其实现高效率和性能的潜力。因此,作者从效率和准确性的角度全面执行YOLOs的模型设计。
(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上进行了测试。
具体的实验细节和实验结论,请参考论文和附录,这里就不展开阐述了。
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
注意:这里训练、验证和测试记得修改为自己数据集的路径!
对于训练的超参数的设定,请参考 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
上述准备做好之后,基本上就可以训练了。
下面是测试结果:
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
在本文中,作者在 YOLOs检测任务中同时针对后处理和模型架构。对于后处理,作者提出了用于无 NMS 训练的一致双重分配,实现了高效的端到端检测。对于模型架构,作者引入了整体效率-精度驱动模型设计策略,提高了性能-效率权衡。大量的实验表明,与其他先进的检测器相比,YOLOv10实现了最先进的性能和延迟,很好地证明了它的优越性。
以上就是本篇文章的内容,若有问题欢迎各位批评指正~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。