这篇文章介绍了YOLOX,一个基于YOLO系列的高性能目标检测器,旨在通过引入无锚点检测、解耦头和先进的标签分配策略(SimOTA)等技术,提升YOLO系列在速度和精度上的表现。主要内容包括:
-
YOLOX的核心改进:
-
无锚点检测:简化了检测流程,减少了设计参数和预测数量。
-
解耦头:解决了分类和回归任务之间的冲突,提升了收敛速度和性能。
-
SimOTA标签分配策略:通过动态分配正样本,优化了训练过程中的标签分配,显著提升了检测性能。
-
-
实验结果:
-
YOLOX在多个模型尺寸上均表现出色,尤其是在COCO数据集上,YOLOX-L模型在Tesla V100上以68.9 FPS的速度实现了50.0%的AP,超过了YOLOv5-L 1.8% AP。
-
YOLOX-Nano模型在仅有0.91M参数和1.08G FLOPs的情况下,达到了25.3%的AP,超过了NanoDet 1.8% AP。
-
-
实际应用:
-
YOLOX在Streaming Perception Challenge(CVPR 2021自动驾驶研讨会)中获得了第一名,展示了其在实时感知任务中的强大性能。
-
-
代码开源:
-
YOLOX的源代码已在GitHub上开源,支持ONNX、TensorRT、NCNN和Openvino等多种部署方式。
-
YOLOX通过引入最新的检测技术,显著提升了YOLO系列在速度和精度上的表现,展示了其在实际应用中的潜力。这里是自己的论文阅读记录,感兴趣的话可以参考一下,如果需要阅读原文的话可以看这里,如下所示:
摘要
在本报告中,我们提出了对YOLO系列的若干经验性改进,形成了一个新的高性能检测器——YOLOX。我们将YOLO检测器转换为无锚点方式,并采用了其他先进的检测技术,即解耦头和领先的标签分配策略SimOTA,以在大规模模型范围内实现最先进的结果:对于仅有0.91M参数和1.08G FLOPs的YOLO-Nano,我们在COCO上获得了25.3%的AP,超过了NanoDet 1.8% AP;对于工业界最广泛使用的检测器之一YOLOv3,我们将其提升至COCO上的47.3% AP,超过了当前最佳实践3.0% AP;对于YOLOX-L,其参数数量与YOLOv4-CSP、YOLOv5-L大致相同,我们在Tesla V100上以68.9 FPS的速度在COCO上实现了50.0%的AP,超过了YOLOv5-L 1.8% AP。此外,我们使用单个YOLOX-L模型在Streaming Perception Challenge(CVPR 2021自动驾驶研讨会)中获得了第一名。我们希望本报告能为开发者和研究人员在实际场景中提供有用的经验,并且我们还提供了支持ONNX、TensorRT、NCNN和Openvino的部署版本。官方项目在这里,如下所示:
1 引言
随着目标检测的发展,YOLO系列[23, 24, 25, 1, 7]始终追求实时应用中的最佳速度和精度权衡。它们提取了当时最先进的目标检测技术(例如,YOLOv2[24]中的锚点[26],YOLOv3[25]中的残差网络[9]),并优化了实现以达到最佳实践。目前,YOLOv5[7]以13.7毫秒的速度在COCO上实现了48.2%的AP,保持了最佳的权衡性能。
然而,在过去两年中,目标检测学术界的主要进展集中在无锚点检测器[29, 40, 14]、先进的标签分配策略[37, 36, 12, 41, 22, 4]和端到端(无NMS)检测器[2, 32, 39]。这些技术尚未集成到YOLO系列中,因为YOLOv4和YOLOv5仍然是基于锚点的检测器,并使用手工设计的分配规则进行训练。
这就是我们提出这些最新进展的原因,并通过经验性优化将其应用于YOLO系列。考虑到YOLOv4和YOLOv5可能对基于锚点的流程进行了过度优化,我们选择YOLOv3[25]作为起点(我们将YOLOv3-SPP作为默认的YOLOv3)。实际上,由于计算资源的限制和各种实际应用中软件支持的不足,YOLOv3仍然是工业界最广泛使用的检测器之一。
如图1所示,通过上述技术的经验性更新,我们将YOLOv3在COCO上以640×640分辨率提升至47.3% AP(YOLOX-DarkNet53),超过了当前YOLOv3的最佳实践(44.3% AP,ultralytics版本2)。此外,当切换到采用先进CSPNet[31]骨干网络和额外PAN[19]头的YOLOv5架构时,YOLOX-L在COCO上以640×640分辨率实现了50.0%的AP,超过了YOLOv5-L 1.8% AP。我们还测试了小尺寸模型的设计策略。YOLOX-Tiny和YOLOX-Nano(仅有0.91M参数和1.08G FLOPs)分别超过了对应的YOLOv4-Tiny和NanoDet 10% AP和1.8% AP。
我们已在 GitHub - Megvii-BaseDetection/YOLOX: YOLOX is a high-performance anchor-free YOLO, exceeding yolov3~v5 with MegEngine, ONNX, TensorRT, ncnn, and OpenVINO supported. Documentation: https://yolox.readthedocs.io/ 发布了代码,支持ONNX、TensorRT、NCNN和Openvino。值得一提的是,我们使用单个YOLOX-L模型在Streaming Perception Challenge(CVPR 2021自动驾驶研讨会)中获得了第一名。
2 YOLOX
YOLOX-DarkNet53
我们选择YOLOv3[25]和Darknet53作为基线。在接下来的部分中,我们将逐步介绍YOLOX的整个系统设计。
实现细节
我们的训练设置从基线到最终模型基本一致。我们在COCO train2017[17]上训练模型,总共训练300个epoch,前5个epoch进行热身。我们使用随机梯度下降(SGD)进行训练。学习率设置为lr×lr×BatchSize/64(线性缩放[8]),初始学习率为0.01,采用余弦学习率调度。权重衰减为0.0005,SGD动量为0.9。默认批量大小为128,适用于典型的8-GPU设备。其他批量大小(包括单GPU训练)也能很好地工作。输入大小均匀地从448到832,步长为32。本报告中的FPS和延迟均在单个Tesla V100上以FP16精度和批量大小为1进行测量。
图2:YOLOv3头与提出的解耦头的差异示意图。对于FPN特征的每一层,我们首先采用一个1×1卷积层将特征通道减少到256,然后添加两个并行的分支,每个分支有两个3×3卷积层,分别用于分类和回归任务。IoU分支被添加在回归分支上
YOLOv3基线
我们的基线采用了DarkNet53骨干网络和SPP层,在某些论文中称为YOLOv3-SPP[1, 7]。我们与原始实现[25]相比略微调整了一些训练策略,增加了EMA权重更新、余弦学习率调度、IoU损失和IoU-aware分支。我们使用BCE损失训练_cls_和_obj_分支,使用IoU损失训练_reg_分支。这些通用的训练技巧与YOLOX的关键改进正交,因此我们将它们放在基线中。此外,我们仅进行RandomHorizontalFlip、ColorJitter和多尺度数据增强,并放弃了RandomResizedCrop策略,因为我们发现RandomResizedCrop与计划中的马赛克增强有些重叠。通过这些增强,我们的基线在COCO _val_上达到了38.5%的AP,如表2所示。
解耦头
在目标检测中,分类和回归任务之间的冲突是一个众所周知的问题[27, 34]。因此,分类和定位的解耦头广泛应用于大多数单阶段和两阶段检测器[16, 29, 35, 34]。然而,随着YOLO系列骨干网络和特征金字塔(例如,FPN[13]、PAN[20])的不断发展,它们的检测头仍然保持耦合,如图2所示。
图3:使用YOLOv3头或解耦头的检测器的训练曲线。我们每10个epoch在COCO验证集上评估AP。显然,解耦头比YOLOv3头收敛得更快,并且最终取得了更好的结果
我们的两个分析实验表明,耦合的检测头可能会损害性能。1)将YOLO的头替换为解耦头可以显著提高收敛速度,如图3所示。2)解耦头对于YOLO的端到端版本至关重要(将在下文描述)。从表1可以看出,耦合头使端到端版本的AP下降了4.2%,而解耦头仅下降了0.8%。因此,我们将YOLO的检测头替换为如图2所示的轻量化解耦头。具体来说,它包含一个1×1卷积层以减少通道维度,然后是两个并行的分支,每个分支有两个3×3卷积层。我们在表2中报告了在V100上以批量大小为1的推理时间,轻量化解耦头带来了额外的1.1毫秒(11.6毫秒 vs. 10.5毫秒)。
强数据增强
我们将Mosaic和MixUp添加到我们的增强策略中,以提升YOLOX的性能。Mosaic是由ultralytics-YOLOv3[2]提出的一种高效的增强策略。随后,它被广泛应用于YOLOv4[1]、YOLOv5[7]和其他检测器[3]。MixUp[10]最初是为图像分类任务设计的,但在BoF[38]中被修改用于目标检测训练。我们在模型中采用了MixUp和Mosaic的实现,并在最后15个epoch关闭它们,达到了42.0%的AP,如表2所示。在使用强数据增强后,我们发现ImageNet预训练不再有益,因此我们从头开始训练所有后续模型。
无锚点
YOLOv4[1]和YOLOv5[7]遵循YOLOv3[25]的原始基于锚点的流程。然而,锚点机制存在许多已知问题。首先,为了实现最佳检测性能,需要在训练前进行聚类分析以确定一组最优锚点。这些聚类锚点是特定领域的,泛化能力较差。其次,锚点机制增加了检测头的复杂性,以及每张图像的预测数量。在一些边缘AI系统中,在设备之间(例如,从NPU到CPU)移动如此大量的预测可能会成为整体延迟的潜在瓶颈。
无锚点检测器[29, 40, 14]在过去两年中发展迅速。这些工作表明,无锚点检测器的性能可以与基于锚点的检测器相媲美。无锚点机制显著减少了需要启发式调优的设计参数数量,并减少了许多技巧(例如,锚点聚类[24]、网格敏感[11]),以获得良好的性能,使得检测器,特别是其训练和解码阶段,显著更简单[29]。
将YOLO转换为无锚点方式非常简单。我们将每个位置的预测从3个减少到1个,并直接预测四个值,即网格左上角的两个偏移量以及预测框的高度和宽度。我们将每个对象的中心位置分配为正样本,并预定义一个尺度范围,如[29]中所做的那样,以指定每个对象的FPN层。这种修改减少了检测器的参数和GFLOPs,并使其更快,但获得了更好的性能——42.9%的AP,如表2所示。
表2:YOLOX-Darknet53在COCO val上的AP(%)路线图。所有模型均在640×640分辨率下测试,使用FP16精度和批量大小为1在Tesla V100上进行。表中的延迟和FPS是在不进行后处理的情况下测量的
多正样本
为了与YOLOv3的分配规则保持一致,上述无锚点版本仅为每个对象选择一个正样本(中心位置),同时忽略了其他高质量预测。然而,优化这些高质量预测也可能带来有益的梯度,这可能会缓解训练过程中正负样本采样的极端不平衡。我们简单地将中心3×3区域分配为正样本,在FCOS[29]中也称为“中心采样”。检测器的性能提升至45.0%的AP,如表2所示,已经超过了当前ultralytics-YOLOv3的最佳实践(44.3% AP)。
SimOTA
先进的标签分配是近年来目标检测的另一个重要进展。基于我们自己的研究OTA[4],我们总结了先进标签分配的四个关键见解:1)损失/质量感知,2)中心优先,3)每个真实框的动态正样本数量(简称动态top-k),4)全局视角。OTA满足上述所有四个规则,因此我们选择它作为候选标签分配策略。
具体来说,OTA[4]从全局角度分析标签分配,并将分配过程形式化为一个最优传输(OT)问题,在当前的分配策略中产生了SOTA性能[12, 41, 36, 22, 37]。然而,在实践中,我们发现通过Sinkhorn-Knopp算法解决OT问题带来了25%的额外训练时间,这对于训练300个epoch来说非常昂贵。因此,我们将其简化为动态top-k策略,称为SimOTA,以获得近似解。
我们在这里简要介绍SimOTA。SimOTA首先计算每对预测-真实框的匹配度,用成本[4, 5, 12, 2]或质量[33]表示。例如,在SimOTA中,真实框gi和预测pj之间的成本计算为:
SimOTA不仅减少了训练时间,还避免了Sinkhorn-Knopp算法中的额外超参数。如表2所示,SimOTA将检测器从45.0%的AP提升至47.3%的AP,超过了SOTA ultralytics-YOLOv3 3.0% AP,展示了先进分配策略的强大能力。
端到端YOLO
我们遵循[39]添加了两个额外的卷积层、一对一标签分配和停止梯度。这些使得检测器能够以端到端的方式运行,但略微降低了性能和推理速度,如表2所示。因此,我们将其作为一个可选模块,不包含在我们的最终模型中。
表3:YOLOX与YOLOv5在COCO上的AP(%)比较。所有模型均在640×640分辨率下测试,使用FP16精度和批量大小为1在Tesla V100上进行
其他骨干网络
除了DarkNet53,我们还在其他不同大小的骨干网络上测试了YOLOX,YOLOX在所有对应的骨干网络上都取得了一致的改进。
表4:YOLOX-Tiny和YOLOX-Nano与对应模型在COCO val上的AP(%)比较。所有模型均在416×416分辨率下测试
YOLOv5中的CSPNet
为了公平比较,我们采用了YOLOv5的骨干网络,包括修改后的CSPNet[31]、SiLU激活函数和PAN[19]头。我们还遵循其缩放规则,生成了YOLOX-S、YOLOX-M、YOLOX-L和YOLOX-X模型。与表3中的YOLOv5相比,我们的模型在AP上取得了约3.0%到1.0%的一致改进,仅增加了边际时间(来自解耦头)。
Tiny和Nano检测器
我们进一步将模型缩小为YOLOX-Tiny,以与YOLOv4-Tiny[30]进行比较。对于移动设备,我们采用深度卷积构建了YOLOX-Nano模型,该模型仅有0.91M参数和1.08G FLOPs。如表4所示,YOLOX在甚至更小的模型尺寸下表现出色。
模型尺寸和数据增强
在我们的实验中,所有模型都保持了与2.1节中描述的几乎相同的学习计划和优化参数。然而,我们发现适合的增强策略因模型尺寸而异。如表5所示,虽然对YOLOX-L应用MixUp可以提高0.9%的AP,但对于像YOLOX-Nano这样的小模型,最好减弱增强。具体来说,我们在训练小模型(如YOLOX-S、YOLOX-Tiny和YOLOX-Nano)时移除了MixUp增强,并减弱了马赛克增强(将尺度范围从[0.1, 2.0]减少到[0.5, 1.5])。这种修改将YOLOX-Nano的AP从24.0%提高到25.3%。
对于大模型,我们还发现更强的增强更有帮助。实际上,我们的MixUp实现比[38]中的原始版本更重。受Copypaste[6]的启发,我们在混合之前通过随机采样的比例因子对图像进行了抖动。为了理解MixUp与比例抖动的力量,我们将其与Copypaste在YOLOX-L上进行了比较。请注意,Copypaste需要额外的实例掩码注释,而MixUp不需要。但如表5所示,这两种方法取得了竞争性的性能,表明在没有实例掩码注释的情况下,MixUp与比例抖动是一个合格的Copypaste替代方案。
表5:不同模型尺寸下数据增强的效果。“Scale Jit.”表示马赛克图像的尺度抖动范围。采用Copypaste时使用了COCO trainval的实例掩码注释
3 与SOTA的比较
传统上,我们会展示如表6所示的SOTA比较表。然而,请记住,表中模型的推理速度通常是不可控的,因为速度因软件和硬件而异。因此,我们在图1中使用相同的硬件和代码库对所有YOLO系列进行了比较,绘制了某种程度上可控的速度/精度曲线。
我们注意到,有一些高性能的YOLO系列模型具有更大的模型尺寸,如Scale-YOLOv4[30]和YOLOv5-P6[7]。而当前基于Transformer的检测器[21]将精度SOTA推至约60 AP。由于时间和资源的限制,我们未在本报告中探索这些重要特性。然而,它们已经在我们的研究范围内。
4 在Streaming Perception Challenge(CVPR 2021 WAD)中获得第一名
CVPR 2021 WAD的Streaming Perception Challenge通过最近提出的流精度[15]指标联合评估了精度和延迟。该指标的关键见解是通过在每个时间点联合评估整个感知堆栈的输出来强制堆栈考虑在计算过程中应忽略的流数据量[15]。我们发现,在30 FPS数据流上,该指标的最佳权衡点是一个推理时间≤33ms的强大模型。因此,我们采用了一个YOLOX-L模型与TensorRT结合,生成了我们最终的挑战模型,赢得了第一名。有关更多详细信息,请参阅挑战网站5。
表6:不同目标检测器在COCO 2017 test-dev上的速度和精度比较。我们选择了所有在300个epoch上训练的模型进行公平比较
5 结论
在本报告中,我们提出了对YOLO系列的若干经验性更新,形成了一个高性能的无锚点检测器——YOLOX。配备了近期先进的检测技术,即解耦头、无锚点和先进的标签分配策略,YOLOX在所有模型尺寸上实现了比其他对应模型更好的速度和精度权衡。值得注意的是,我们将YOLOv3架构提升至COCO上的47.3% AP,超过了当前最佳实践3.0% AP。我们希望本报告能为开发者和研究人员在实际场景中提供更好的经验。