In this report, we present some experienced improvements to YOLO series, forming a new high-performance detector— YOLOX. We switch the YOLO detector to an anchor-free manner and conduct other advanced detection techniques, i.e., a decoupled head and the leading label assignment strategy SimOTA to achieve state-of-the-art results across a large scale range of models: For YOLO-Nano with only 0.91M parameters and 1.08G FLOPs, we get 25.3% AP on COCO, surpassing NanoDet by 1.8% AP; for YOLOv3, one of the most widely used detectors in industry, we boost it to 47.3% AP on COCO, outperforming the current best practice by 3.0% AP; for YOLOX-L with roughly the same amount of parameters as YOLOv4-CSP, YOLOv5-L, we achieve 50.0% AP on COCO at a speed of 68.9 FPS on Tesla V100, exceeding YOLOv5-L by 1.8% AP. Further, we won the 1st Place on Streaming Perception Challenge (Workshop on Autonomous Driving at CVPR 2021) using a single YOLOX-L model. We hope this report can provide useful experience for developers and researchers in practical scenes, and we also provide deploy versions with ONNX, TensorRT, NCNN, and Openvino supported. Source code is at https://github.com/Megvii-BaseDetection/YOLOX.
本文介绍了YOLO系列的一些改进经验,形成了一种新型的高性能探测器——YOLOX。我们将YOLO检测器切换到无锚方式,并采用其他先进的检测技术,即解耦头和领先的标签分配策略SimOTA,在大范围的模型中实现最先进的结果:对于只有0.91M parameters和1.08G FLOPs的YOLONano,我们在COCO上获得25.3%的AP,超过NanoDet 1.8%的AP;对于工业界使用最广泛的探测器之一YOLOv3,我们将其在COCO上的AP提高到47.3%,比当前最佳实践的AP高出3.0%;为YOLOX-L大致相同数量的参数作为YOLOv4CSP, YOLOv5-L,我们在COCO达到50.0% APTesla V100 68.9帧/秒的速度,超过YOLOv5-L 1.8%。进一步,我们赢得了第一名在Streaming Perception Challenge (Workshop on Autonomous Driving at CVPR 2021)使用单一YOLOX-L模型。我们也提供了支持ONNX、TensorRT、NCNN和Openvino的部署版本。源代码在 https://github.com/Megvii-BaseDetection/YOLOX。
随着目标检测的发展,YOLO系列[23,24,25,1,7]一直在追求实时应用的最佳速度和精度权衡。他们提取了当时可用的最先进的检测技术(例如,用于YOLOv2[24]的锚定[26],用于YOLOv3[25]的残留网络[9]),并优化了实现的最佳实践。目前,YOLOv5[7]具有最佳的平衡性能,在COCO上13.7 ms时AP为48.2%。
然而,在过去的两年中,学术界在目标检测方面的主要进展集中在无锚检测器[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在640 × 640分辨率的COCO上的AP提高到47.3% (YOLOv3 - darknet53),大大超过了YOLOv3目前的最佳实践(44.3% AP,超解析版本2)。此外,当切换到采用先进CSPNet[31]骨干和额外PAN[19]头的高级YOLOv5架构时,yolovl在640 × 640分辨率的COCO上实现了50.0%的AP,比对手YOLOv5- l提高了1.8%的AP。我们还在小型模型上测试了我们的设计策略。yolo - tiny和yolo - nano(仅0.93 m Parameters和1.08G FLOPs)比YOLOv4-Tiny和NanoDet3分别高出10% AP和1.8% AP。
We have released our code at https://github.com/Megvii-BaseDetection/YOLOX,支持ONNX、TensorRT、NCNN和Openvino。值得一提的是,我们使用一款YOLOX-L车型赢得了流媒体感知挑战赛(CVPR 2021年自动驾驶研讨会)的第一名
我们选择YOLOv3[25]和Darknet53作为我们的基线。在接下来的部分中,我们将一步一步地介绍YOLOX的整个系统设计。
Implementation details
从基线到最终模型,我们的训练设置基本上是一致的。我们在COCOtrain2017[17]上用5个epoch warm-up训练模型共300个epoch。我们使用随机梯度下降法(SGD)进行训练。我们使用的学习率为 l r × B a t c h S i z e / 64 lr×BatchSize/64 lr×BatchSize/64(linear scaling[8]),初始 l r = 0.01 lr = 0.01 lr=0.01和 cosine lr schedule。weight decay 为0.0005,SGD momentum为0.9。对于典型的8-GPU设备,批处理大小默认为128。其他批量大小包括单个GPU训练也很好。输入大小均匀地从448绘制到832,有32个步长。本报告中的FPS和延迟都是用FP16-precision和batch=1在一台Tesla V100上测量的。
YOLOv3 baseline
我们的基线采用了DarkNet53骨干网和SPP层的架构,参考文献YOLOv3-SPP[1,7]。在原有的训练策略[25]的基础上,我们对训练策略进行了轻微的修改,增加了EMA weights updating, cosine lr schedule, IoU loss and IoU-aware branch。我们使用BCE Loss用于训练cls和obj分支,IoU Loss用于训练reg分支。这些一般的训练技巧与YOLOX的关键改进是正交的,因此我们把它们放在基线上。此外,我们只进行了RandomHorizontalFlip, ColorJitter和multi-scale来增加数据,而丢弃了RandomResizedCrop策略,因为我们发现RandomResizedCrop与计划的马赛克增加有点重叠。通过这些增强,我们的基线在COCO val上实现了38.5%的AP,如表2所示。
Decoupled head
在对象检测中,分类和回归任务之间的冲突是一个众所周知的问题[27,34]。因此,用于分类和定位的解耦头被广泛应用于大多数单级和两级探测器中[16,29,35,34]。然而,由于YOLO系列的主干和特征金字塔(如FPN[13]、PAN[20].)不断进化,其检测头仍然是耦合的,如图2所示。
我们的两个分析实验表明,耦合探测头可能会损害性能。1). 如图3所示,用一个解耦的头替换YOLO的头大大提高了收敛速度。2). 解耦头对于端到端版本的YOLO至关重要(将在下文中介绍)。从标签上可以看出。1.耦合头的端到端性能降低4.2%AP,而解耦头的端到端性能降低至0.8%AP。因此,我们将YOLO检测头替换为lite解耦头,如图2所示。具体来说,它包含一个1×1 conv层以减少通道尺寸,然后是两个分别具有两个3×3 conv层的并行分支。我们在表2中报告batch=1在V100的推断时间。和lite解耦头带来额外的1.1毫秒(11.6毫秒vs.10.5毫秒)。
Strong data augmentation
们将Mosaic和MixUp添加到我们的增强策略中,以提高YOLOX的性能。Mosaic是ultralytics-YOLOv32提出的一种有效的增强策略。然后,它被广泛用于YOLOv4[1]、YOLOv5[7]和其他探测器[3]。MixUp[10]最初设计用于图像分类任务,但后来在BoF[38]中进行了修改,用于目标检测训练。我们在模型中采用了混搭和马赛克实现,并在过去15个时期内将其关闭,在Tab2中实现了42.0%的AP。在使用强大的数据增强功能后,我们发现ImageNet预训练没有任何好处,因此,我们从零开始训练以下所有模型。
Anchor-free
YOLOv4[1]和YOLOv5[7]都遵循YOLOv3[25]最初基于锚的管道。然而,锚机制存在许多已知问题。首先,为了获得最佳检测性能,需要在训练之前进行聚类分析以确定一组最佳锚。这些聚集的锚是特定于领域的,不那么普遍。其次,锚定机制增加了检测头的复杂性,以及每个图像的预测数量。在一些边缘人工智能系统上,在设备之间移动如此大量的预测(例如,从NPU到CPU)可能会成为整体延迟的潜在瓶颈。
无锚探测器[29,40,14]在过去两年中发展迅速。这些工作表明无锚探测器的性能可以与基于锚的探测器相媲美。无锚机制显著减少了需要启发式调整和许多技巧的设计参数数量(例如, Anchor Clustering [24], Grid Sensitive [11])为了获得良好的性能,使检测器,尤其是其训练和解码阶段,变得相当简单[29]。
将YOLO转换为无锚方式非常简单。我们将每个位置的预测从3减少到1,并使其直接预测四个值,即网格左上角的两个偏移量,以及预测框的高度和宽度。 我们将每个对象的中心位置指定为正样本,并预先定义一个比例范围,如[29]中所述,为每个对象指定FPN级别。这种修改降低了探测器的参数和GFLOP,使其更快,但获得了更好的性能——42.9%的AP,如表2所示。
Multi positives
为了与YOLOv3的分配规则保持一致,上述无锚版本仅为每个对象选择一个正样本(中心位置),同时忽略其他高质量预测。然而,优化这些高质量的预测也可能带来有益的梯度,这可能会缓解训练期间正/负采样的极端不平衡。我们只是将中心3×3区域指定为正,在FCOS中也称为“中心采样”[29]。探测器的性能提高到45.0%AP,如Tab所示。已经超过了目前的ultralytics-YOLOv3最佳实践 (44.3% AP)
SimOTA
高级标签分配是近年来目标检测的另一个重要进展。基于我们自己的研究[4],我们总结出高级标签分配的四个关键见解:1)。损失/质量意识,2)。中心优先,3)。每个地面真相的动态积极主播数4(缩写为动态top-k),4)。全球视野。OTA符合上述四条规则,因此我们选择它作为候选标签分配策略。
具体而言,OTA[4]从全局角度分析标签分配,并将分配过程表述为最优传输(OT)问题,在当前分配策略中产生SOTA性能[12、41、36、22、37]。然而,在实践中,我们发现通过Sinkhorn-Knopp算法解决OT问题会带来25%的额外训练时间,这对于训练300个阶段来说是相当昂贵的。因此,我们将其简化为动态top-k策略,命名为SimOTA,以获得近似解。
我们在此简要介绍Simota。Simota首先计算成对匹配度,由每个prediction-gt对的cost[4,5,12,2]或quality[33]表示。例如,在SimOTA中,gt gi和预测pj之间的成本计算如下:
其中 λ λ λ是一个平衡系数。 L i j c l s L^{cls}_{ij} Lijcls和 L i j r e g L^{reg}_{ij} Lijreg是gt g i g_i gi和预测 p j p_j pj之间的分类损失和回归损失。然后,对于gt g i g_i gi,我们选择固定中心区域内成本最低的前k个预测作为其正样本。最后,这些正预测的对应网格被指定为正,而其余网格则为负。注意,k值因不同的基本事实而不同。有关更多详细信息,请参考OTA[4]中的动态k估计策略。
SimOTA不仅减少了训练时间,而且避免了Sinkhorn-konpp算法中额外的解算器超参数。如Tab2所示。SimOTA将探测器的平均功率从45.0%提高到47.3%,比SOTA ultralytics-YOLOv3高出3.0%的平均功率,显示了先进分配策略的威力。
End-to-end YOLO
我们按照[39]添加了两个额外的conv层、one-to-one label assignment和 stop gradient。这些使检测器能够以端到端的方式执行,但会略微降低性能和推断速度,如表2所示。因此,我们将其作为一个可选模块,不包含在最终模型中。
除了DarkNet53之外,我们还在其他不同尺寸的主干上测试YOLOX,其中YOLOX与所有对应的主干相比实现了一致的改进。
Modified CSPNet in YOLOv5
为了进行公平比较,我们采用了精确的YOLOv5主干,包括改进的CSPNet[31]、SiLU激活和PAN[19]头。我们还遵循其缩放规则来生成YOLOX、YOLOX-M、YOLOX-L和YOLOX-X模型。与Tab中的YOLOv5相比。我们的模型在AP ~ 3.0% ~ 1.0%之间得到了一致的改进,只增加了少量的时间(来自解耦头
Tiny and Nano detectors
我们进一步将模型缩小为YOLOX Tiny,以与YOLOv4 Tiny进行比较[30]。对于移动设备,我们采用深度卷积来构建YOLOX Nano模型,该模型只有 0.91M parameters and 1.08G FLOPs。如tab4所示。YOLOX的性能比同类产品更好,型号更小。
Model size and data augmentation
在我们的实验中,所有模型保持几乎相同的学习计划和优化参数,如2.1所示。然而,我们发现合适的增强策略在不同大小的模型中有所不同。如Tab5显示,虽然对YOLOX-L应用混搭可以将AP提高0.9%,但对于像YOLOX Nano这样的小型模型,最好是weaken the augmentation。具体来说,我们在训练小模型(即YOLOX-S、YOLOX-Tiny和YOLOX-Nano)时,消除了混合增强并削弱了mosaic(将比例范围从[0.1,2.0]减少到[0.5,1.5])。这样的修改将YOLOX Nano的AP从24.0%提高到25.3%。
对于大型模型,我们还发现更强的增强更有用。实际上,我们的混搭实现是[38]中原始版本的一部分。受Copypaste[6]的启发,我们通过随机采样的比例因子对两幅图像进行抖动,然后将它们混合在一起。为了理解混搭与缩放抖动的威力,我们将其与YOLOX-L上的Copypaste进行比较。注意到Copypaste需要额外的实例掩码注释,而混搭则不需要。但如tab5所示。这两种方法实现了具有竞争力的性能,表明在没有实例掩码注释可用时,混用缩放抖动是Copypaste的合格替代品。
传统上,SOTA比较表是在Tab6中显示的。然而,请记住,本表中模型的推断速度通常是不受控制的,因为速度随软件和硬件的不同而变化。因此,对于图1中的所有YOLO系列,我们使用相同的硬件和代码库,绘制出某种程度上受控的速度/精度曲线。
我们注意到,有一些型号更大的高性能YOLO系列,如Scale-YOLOv4[30]和YOLOv5-P6[7]。基于Transformer的探测器[21]将SOTA的精度提高到∼60AP。由于时间和资源的限制,我们在本报告中没有探讨这些重要特征。然而,它们已经在我们的范围内。
在本报告中,我们对YOLO系列进行了一些有经验的更新,它形成了一种称为YOLOX的high-performance anchor-free检测器。YOLOX配备了一些最新的先进检测技术,即去耦头、anchor-free和先进的标签分配策略,与所有型号的其他同类产品相比,它在速度和准确性之间实现了更好的权衡。值得注意的是,我们将YOLOv3的体系结构提升到47.3%,超过当前最佳实践的3.0%,YOLOv3由于其广泛的兼容性仍然是业界使用最广泛的探测器之一。我们希望这份报告能帮助开发者和研究人员在实际场景中获得更好的体验。