YOLOv10是在YOLOv8的基础上,借鉴了RT-DETR的一些创新点改进出来的
标题:YOLOv10: Real-Time End-to-End Object Detection
论文:https://arxiv.org/pdf/2405.14458
源码:https://github.com/THU-MIG/yolov10
1. 论文介绍
在过去的几年中,YOLO(You Only Look Once)算法因其在计算成本和检测性能之间有效的平衡而成为实时目标检测领域的主导范式。研究人员已经探索了YOLO的架构设计、优化目标、数据增强策略等,取得了显著的进展。然而,对非极大值抑制(Non-Maximum Suppression, NMS)的依赖限制了YOLO的端到端部署,并负面影响了推理延迟。此外,YOLO中各个组件的设计缺乏全面和深入的检查,导致明显的计算冗余,并限制了模型的能力。这导致了次优的效率,并且有很大的性能提升空间。在这项工作中,我们旨在从后处理和模型架构两个方面进一步推进YOLO的性能-效率边界。为此,我们首先提出了一致的双重分配,用于无需NMS的YOLO训练,这同时带来了竞争性的性能和低推理延迟。此外,我们引入了针对YOLO的整体效率-准确性驱动模型设计策略。我们从效率和准确性两个角度全面优化了YOLO的各个组件,大大减少了计算开销并增强了能力。我们的努力成果是新一代的YOLO系列,用于实时端到端目标检测,被称为YOLOv10。广泛的实验表明,YOLOv10在各种模型规模上实现了最先进的性能和效率。例如,我们的YOLOv10-S在COCO上与RT-DETR-R18具有相似的AP时,速度是其1.8倍,同时参数和浮点运算(FLOPs)数量分别减少了2.8倍。与YOLOv9-C相比,YOLOv10-B在相同性能下延迟减少了46%,参数减少了25%。
2. 主要创新点
2.1. 引入了一种双重标签分配策略
其核心思想便是在训练阶段使用一对多的检测头提供更多的正样本来丰富模型的训练;而在推理阶段则通过梯度截断的方式,切换为一对一的检测头,如此一来便不在需要 NMS 后处理,在保持性能的同时减少了推理开销。
YOLOv10的检测头相关代码如下:
#https://github.com/THU-MIG/yolov10/blob/main/ultralytics/nn/modules/head.py
class v10Detect(Detect):max_det = -1def __init__(self, nc=80, ch=()):super().__init__(nc, ch)c3 = max(ch[0], min(self.nc, 100)) # channelsself.cv3 = nn.ModuleList(nn.Sequential(nn.Sequential(Conv(x, x, 3, g=x), Conv(x, c3, 1)), \nn.Sequential(Conv(c3, c3, 3, g=c3), Conv(c3, c3, 1)), \nn.Conv2d(c3, self.nc, 1)) for i, x in enumerate(ch))self.one2one_cv2 = copy.deepcopy(self.cv2)self.one2one_cv3 = copy.deepcopy(self.cv3)def forward(self, x):one2one = self.forward_feat([xi.detach() for xi in x], self.one2one_cv2, self.one2one_cv3)if not self.export:one2many = super().forward(x)if not self.training:one2one = self.inference(one2one)if not self.export:return {"one2many": one2many, "one2one": one2one}else:assert(self.max_det != -1)boxes, scores, labels = ops.v10postprocess(one2one.permute(0, 2, 1), self.max_det, self.nc)return torch.cat([boxes, scores.unsqueeze(-1), labels.unsqueeze(-1)], dim=-1)else:return {"one2many": one2many, "one2one": one2one}def bias_init(self):super().bias_init()"""Initialize Detect() biases, WARNING: requires stride availability."""m = self # self.model[-1] # Detect() module# cf = torch.bincount(torch.tensor(np.concatenate(dataset.labels, 0)[:, 0]).long(), minlength=nc) + 1# ncf = math.log(0.6 / (m.nc - 0.999999)) if cf is None else torch.log(cf / cf.sum()) # nominal class frequencyfor a, b, s in zip(m.one2one_cv2, m.one2one_cv3, m.stride): # froma[-1].bias.data[:] = 1.0 # boxb[-1].bias.data[: m.nc] = math.log(5 / m.nc / (640 / s) ** 2) # cls (.01 objects, 80 classes, 640 img)
2.2 架构改进
- Backbone & Neck:使用了先进的结构如 CSPNet 作为骨干网络,和 PAN 作为颈部网络,优化了特征提取和多尺度特征融合。
- 大卷积核与分区自注意力:这些技术用于增强模型从大范围上下文中学习的能力,提高检测准确性而不显著增加计算成本。
- 整体效率:引入空间-通道解耦下采样和基于秩引导的模块设计,减少计算冗余,提高整体模型效率。
3. 实验结果
表1:与最先进技术的比较。延迟是使用官方预训练模型测量的。延迟指标指的是模型前向传播过程中的延迟,不包括后处理。†表示使用原始的一对多训练并采用NMS的YOLOv10的结果。以下所有结果都没有采用额外的高级训练技术,如知识蒸馏或PGI,以进行公平比较。
平均精度(AP),分别减少了 51% 和 61% 的参数以及分别减少了 41% 和 52% 的计算量。在中型模型方面,与 YOLOv9-C 和 YOLO-MS 相比,YOLOv10-B 和 Men 在保持相同或更好的性能的同时,分别实现了 46% 和 62% 的延迟降低。对于大型模型,与 Gold-YOLO-L 相比,我们的 YOLOv10-L 拥有 68% 更少的参数,延迟降低了 32%,并且平均精度提升了 1.4%。此外,与 RT-DETR 相比,YOLOv10 在性能和延迟方面都取得了显著的改进。特别值得注意的是,YOLOv10-S 和 X 在相似的性能条件下,推理速度分别比 RT-DETR-R18 和 R101 快了 1.8 倍和 1.3 倍。这些结果充分展示了 YOLOv10 作为实时端到端检测器的卓越性能。我们还按照原始的一对多训练方法,将 YOLOv10 与其他 YOLO 版本进行了比较。在这种情况下,我们考虑的是模型前向传播过程的性能和延迟,遵循了文献 [56,20,54] 中的方法。正如表 1 所示,YOLOv10 在不同规模的模型上也展现了最先进的性能和效率,这表明了我们架构设计的有效性。
参考博客
YOLOv10 正式发布!原理、部署、应用一站式齐全_yolov10出了么-CSDN博客