论文地址:https://arxiv.org/pdf/2405.14458
代码地址:https://github.com/THU-MIG/yolov10
0 摘要
我将作者摘要内容简短: YOLOv10针对之前工作分析,发现NMS(非极大值抑制)后续处理依赖阻碍YOLO 的端到端部署,且对推理延迟不友好。此外,他们还发现yolo结构中计算冗余明显,限制了模型的能力。在这项工作中,作者的目标是从后处理和模型架构两个方面进一步推进YOLO的性能效率边界。为此,作者首先提出了一致的双重分配的NMS自由训练的YOLO,这带来了竞争力的性能和低推理延迟的同时。此外,作者从效率和准确性两个角度全面优化了YOLO的各个组件,不但降低了计算开销,提高了性能。实验表明YOLOv10-S在COCO上类似的AP下比RTDETR-R18快1.8倍,同时参数数量和FLOPs减少2.8倍。与YOLOv9-C相比,YOLOv10-B在相同性能下的延迟减少了46%,参数减少了25%。
1-2 引言-相关工作
在摘要中,我们已经知道本文针对什么问题进行研究的,所以在这里,我更加关注相关工作中的YOLO个系列的补充,以及DETR变体,作者又是怎么理解的。(相当一部分我总结写的,不对,大佬直接点出,感谢)
对于YOLO系列,v1-v10,其中还有R,X等。对于目标检测算法的发展史,传统目标检测算法处理速度慢,无法实时检测。因此yolov1就是单阶段算法的史诗性变革,将目标检测问题转化为回归问题,使用单个CNN网络进行单次前向传播,同时预测每个网格单元的边界框和类别,实现了快速的目标检测。v2在v1基础上,开始引入Anchor Boxes概念,使用Darknet-19作为骨干网络。为了进一步提升检测精度和适应不同尺寸目标的能力,特别是在小目标检测上,同时保持实时性能。v3则是使用更深的Darknet-53作为骨干网络,开始代入多尺度的概念。v4引入CSPDarknet53骨干网络,开始使用SPP+PANet+FPN,进一步提升检测精度和速度。
对于v5,我只能说在v4的基础上优化,全面优化,代码写的非常漂亮,我感觉闪光点是他的好用,自适应锚框计算,切片操作啦,CIOU-loss啦,反正很多。yolox则是在YOLOv3的基础上,引入了Decoupled Head,Data Aug,Anchor Free和SimOTA样本匹配的方法,构建了一种anchor-free的端到端目标检测框架,并且达到了一流的检测水平,也是相当不错的,他的解耦头现在依然在用。YOLOR,我没咋看过,不咋知道,反正是隐形知识啥的,有大佬看过的,讲讲哈!v6于2022年9月由美团视觉人工智能部发布,他的主干网络跟v5不一样,他通过RepVGGBlock在RepVGG网络中被重复堆叠多次,形成了深层的网络结构。通过堆叠多个RepVGGBlock,可以提高网络的表示能力和复杂度,从而实现更准确的特征提取和目标识别。v7引入重参数概念,在主干通过不同的分支将特征图拼接起来,进而促进更深层网络的有效学习和收敛,我更加他像x和5和6的融合体,DAMO采用ZeroHead和AlignedOTA标签分配,并构建了T-S架构来指导学生端训练,有点半监督的味道了。v8和v5的作者出自同一个团队,具体创新包括一个新的骨干网络、一个新的 Ancher-Free 检测头和一个新的损失函数。C2f取代C3模块,其考虑了不同的梯度流信息。v9是原v7团队打造,提出了可编程梯度信息(PGI) 的概念来应对深度网络实现多个目标所需的各种变化。PGI可以为目标任务计算目标函数提供完整的输入信息,从而获得可靠的梯度信息来更新网络权值。此外,还设计了一种新的轻量级网络架构——基于梯度路径规划的通用高效层聚合网络(GELAN)。v9提出的GELAN是在ELAN(YOLOV7)的基础上提出的,但v7在主干中使用,而v9通过结合采用梯度路径规划设计的两种神经网络架构CSPNet 和ELAN,设计出GELAN,可以理解为是一个Rep + CSP + ELAN的组合网络。Rep优化计算,CSP丰富梯度,ELAN做高效的特征聚合。
好的,(上面我自己认为的哈)大致上,我们可以总结,YOLO在性能和效率方面取得了平衡,但存在训练和推断中的问题,如标签分配策略和NMS的使用。这也就是YOLOv10提出的背景因素。而DETR是一种端到端的检测器架构,可以有效解决YOLO存在的问题,RT-DETR是DETR的一个变体,可以实现实时应用。另外一种端到端的路线是,一些基于CNN的检测器采用一对一分配策略来减少冗余预测,但存在性能和效率的问题。
言归正传,这两章其实就说了两点:
一、YOLO在训练中,往往采用一对多的标签分配策略,但需要NMS在推理过程中选择最佳的正预测。 这降低了推理速度,使性能对NMS的超参数敏感,从而阻碍了YOLOs实现端到端最优部署。
二、为了实现更高效、更有效的模型架构,发现YOLOs内部仍然存在相当大的计算冗余,导致参数利用率低, 效率次优。此外,由此产生的约束模型能力也导致性能较差,为精度的提高留下了充足的空间。
为了解决这个两个问题:
文章提出了:
提出了一个无 NMS 训练的一致双重分配的YOLO,有助于模型在训练和推理过程中提高效率和性能。
提出了整体效率-精度驱动的模型架构设计策略,包括轻量级分类头、空间通道解耦下采样和大内核卷积等,以提高模型的效率和准确性。
3 相关工作
3.1 Consistent Dual Assignments for NMS-free Training—用于无NMS训练的一致的双重训练
针对问题1,文章提出了双标签分配,我直接说重点了,一对一匹配策略中,即每个真实框体只对应一个预测框体)。这种方法可以直接避免重叠预测框的问题,而不需要用 NMS(非极大值抑制)来处理重叠预测。NMS 通常用于处理一对多匹配中预测框体的冗余,即同一个真实框体会匹配到多个高置信度的预测框体,这时就需要 NMS 来选择一个最合适的预测框体并抑制其他框。但是一对一会导致弱监督(因为他简单),而一对多,则可以缓解这个情况,但是一对多他NMS就复杂了。
所以作者提出了双重训练,在下图中,我们主要看a图,发现在a图中,PAN并行通过一对一和一对多。一对多分支比一对一分支提供更丰富的监控信号。直观地说,如果我们能够将一对 一头部的监督与一对多头部的监督协调起来,我们就可以朝着一对多头部优化的方向优化一对一头部。我给大家翻译一下,如果我们可以建议着二者的联系,那么我们一对多的最佳结果也就是我们一对一的最佳结果,如下图的小圈1和一对一的绿色小圈!
我们可以总结为:
在训练过程中:两个 Head 联合优化,以提供丰富的监督。
在推理过程中:YOLOv10 会丢弃一对多 Head 并利用一对一 Head 做出预测。这使得 YOLO 能够进行端到端部署,而不会产生任何额外的推理成本。
以下是论文内容(建议去看文章这块)
为了实现两个分支的预测感知匹配,采用统一的匹配度量,即
其中 𝑝 是分类分数, 𝑏^ 和 𝑏 分别表示预测和实例的边界框。𝑠 表示空间先验,指示预测的锚点是否在实例内。𝛼 和 𝛽 是平衡语义预测任务和位置回归任务影响的两个重要超参数。将一对多和一对一指标分别表示为 𝑚𝑜2𝑚 = 𝑚(𝛼𝑜2𝑚,𝛽𝑜2𝑚) 和 𝑚𝑜2𝑜 = 𝑚(𝛼𝑜2𝑜,𝛽𝑜2𝑜) 。这些指标影响两个头的标签分配和监督信息。
在双标签分配中,一对多分支提供比一对一分支更丰富的监控信号。直观上,如果能够协调一对一头和一对多头的监督,就可以将一对一头朝着一对多头优化的方向优化。因此,一对一头部可以在推理过程中提供更高的样本质量,从而获得更好的性能。为此,首先分析一下两位掌门人的监管差距。由于训练过程中的随机性,一开始就用两个头初始化相同的值并产生相同的预测来开始检查,即一对一头和一对多头生成相同的 𝑝 ,将最大的一对多和一对一匹配分数表示为 𝑚𝑜2𝑚∗ 和 𝑚𝑜2𝑜∗ ,一对一分支选择 𝑖 个预测,其度量为 𝑚𝑜2𝑜,𝑖 = 𝑚𝑜2𝑜∗ ,然后可以导出 𝑗∈Ω 和 𝑡𝑜2𝑜,𝑖 = 𝑢∗⋅𝑚𝑜2𝑜,𝑖𝑚𝑜2𝑜∗ b12> = 𝑢∗ 对于任务对齐损失。因此,两个分支之间的监督差距可以通过不同分类目标的 1-Wasserstein 距离得出,即(这里大家去看论文)
可以观察到,随着 𝑡𝑜2𝑚,𝑖 的增加,差距减小,即 𝑖 在 Ω 中排名更高。当 𝑡𝑜2𝑚,𝑖 = 𝑢∗ 时达到最小值,即 𝑖 是 Ω 中最好的正样本,如图 2 所示(a)。为了实现这一点,提出一致的匹配度量,即 𝛼𝑜2𝑜 = 𝑟⋅𝛼𝑜2𝑚 和 𝛽𝑜2𝑜 = 𝑟⋅𝛽𝑜2𝑚 ,这意味着 𝑚𝑜2𝑜 = 𝑚𝑜2𝑚𝑟 。因此,一对多头部的最佳正样本也是一对一头部的最佳正样本。因此,两个头都可以得到一致、和谐的优化。为简单起见,默认取 𝑟 =1,即 𝛼𝑜2𝑜 = 𝛼𝑜2𝑚 和 𝛽𝑜2𝑜 = 𝛽𝑜2𝑚 。为了验证改进的监督对齐,计算训练后一对多结果的前 1 / 5 / 10 内一对一匹配对的数量。如(b)所示,在一致匹配度量下,对齐得到了改善。
3.2 Holistic Efficiency-Accuracy Driven Model Design—整体效率-精度驱动的模型设计
3.2.1 空间信道解耦下采样
首先,我们先理解一下什么是下采样,其实就是将一张图片进行缩放。例如,VGG16网络在空间(宽度和高度)和通道上对特征进行缩放。这是因为在任何类型的视觉模型中,对模型进行宽度、高度和通道的缩放是标准做法。
我们需要思考一下,为什么我们需要进行缩放呢?为什么我们不能直接添加相同大小和分辨率的层来进行预测呢?有两个原因:
使用相同大小的层会导致参数数量的大幅增加(更多的参数意味着更多的内存需求);其次,由于多尺度的概念,我们希望在不同尺度上读取特征,以便在数据流中发现更多隐藏的模式。虽然可以选择这些缩放参数,但模型的性能不会得到优化。正确的缩放是模型成功的关键。这也就是v10作者所考虑的,而传统的YOLO模型通常利用3x3的标准卷积,步幅为2,以实现空间下采样,将H*W*C特征图同时实现空间压缩和通道变化,变为H/2*W/2*2C。我给出计算参数量和计算量的公式:
参数量=(核高×核宽×输入通道数×输出通道数)
计算成本=(2×核高×核宽×输入通道数×输出通道数×输出特征图的高度×输出特征图的宽度*2)这个2代表每个卷积操作包含一次乘法和一次加法(乘加运算)。
因此,可以知道传统下采样的参数量为18,而计算成本为。
在YOLOv10提出了解耦空间降采样和通道增加操作,从而实现更高效的降采样。具体而言,它首先利用逐点卷积(1*1卷积)来调节通道维度,然后利用深度卷积来执行空间降采样。对于深度卷积,他的每个独立输入通道在空间上进行卷积,彼此之间不相干扰,通常没有额外的系数乘法需要考虑,因而直接根据卷积计算。
所以对于1*1的逐点卷积,他的参数量为,计算成本为,这时候我们的输出是H*W*2C,下一步我们再进行空间变换成H/2*W/2*2C,参数量为,计算成本.所以总参数为,总计算成本为。可能在这里大家有点迷糊,补充一下深度卷积的公式:
参数量:核高×核宽×通道数
计算成本:核高×核宽×通道数×输出特征图的高度×输出特征图的宽度
那么到这里,我们就发现了,v10作者通过这种方法来减少延迟,同时他也在最大限度内下采样的信息。
3.2.2 排序引导块设计(梯级引导程序块设计)
研究人员发现深层阶段和大型模型更容易出现冗余。这个观察结果表明,仅仅在所有阶段应用相同的块设计对于最佳的容量-效率权衡是次优的。为了解决这个问题,YOLOv10提出了一种秩引导的块设计方案,旨在通过紧凑的架构设计减少被证明冗余的阶段的复杂性。研究人员提出了一种紧凑的倒置块(CIB)结构,它采用低成本的深度卷积进行空间混合,并使用高效的逐点卷积进行通道混合,如上图所示。它可以作为高效的基本构建块,例如嵌入到ELAN结构中。ELAN的详细解释在YOLOv9的说明中。
YOLOv10倡导一种秩引导的块分配策略,以在保持竞争力的容量的同时实现最佳效率。具体而言,给定一个模型,它根据不同阶段的内在秩按升序排序。研究人员进一步检査了在领先阶段用CIB替换基本块的性能变化。如果与给定模型相比没有性能下降,他们继续替换下一个阶段,否则停止这个过程。最终,他们在不同阶段和模型尺度上实现了自适应的紧凑块设计,在不损失性能的情况下提高了效率。
在基于C2F的基础上提出C2FCIB,其实就是将C2发中的Bottleneck换成CIB,而CIB是在Bottleneck的基础中,将标准卷积换成深度卷积加逐点卷积。原理咱们上面说了,其实就是进一步减少了计算量。在保持模型性能的同时,降低模型的复杂度和计算成本。
3.2.3 轻量级分类头
在这里,对于目标检测来说,我们将检测头可以划分为分类头和回归头,
分类:分类头将确定检测到的目标在给定边界框中的类别也就是class,类别概率估计则是计算检测到每个物体可能是的类别,涉及到softmax,确保概率和为1。
回归:负责预测检测到目标的边界框的精准坐标,这其中包括每个边界框的x,y,h,w。此外还有边框置信度得分,分析每个框中含有目标的可能性,过滤掉那些置信度低的预测框。
作者发现(以v8为的基线),分类头比回归头的参数量和计算量都要大。论文中表示在分析了分类误差和回归误差的影响后,发现回归头意义更大,因此减少分类头的开销不会对性能有较大损害。
3.2.4 大卷积核还有PSA(局部自注意力机制)
作者认为采用大核深度卷积是一种扩大感受野并增强模型能力的有效方法。然而,仅仅在所有阶段使用它们可能会对用于检测小目标的浅层特征引入污染,同时在高分辨率阶段引入显著的I0开销和延迟。
所以YOLOv10建议在深层阶段的CIB中利用大核深度卷积。具体来说,他们将CIB中第二个3x3深度卷积的核大小增加到7x7。此外,他们采用结构重参数化技术,引入另一个3x3深度卷积分支,以缓解优化问题而不增加推理开销。此外,随着模型规模的增加,其感受野自然扩展,使用大核卷积的益处逐渐减小。因此,他们仅在小模型规模中采用大核卷积。
而对于PSA,就是我们图中的c,主要步骤,首先在1x1卷积后将特征在通道上划分为两部分。我们仅将其中一部分输入到由多头自注意力模块(MHSA)和前馈网络(FFN)组成的N-PSA块中。然后将这两部分连接起来,并通过1x1卷积融合。
PSA仅在分辨率最低的第4阶段后放置,避免了自注意力平方计算复杂度带来的过度开销。通过这种方式,可以以低计算成本将全局表示学习能力引入到YOLO模型中,从而显著增强模型的能力并提升性能。
到这里基本上就完结啦,实验部分,大家看论文即可,文章不对的地方,欢迎各位大佬指导!!!