极智Paper | 目标检测神器 YOLOX

Posted 极智视界

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了极智Paper | 目标检测神器 YOLOX相关的知识,希望对你有一定的参考价值。

欢迎关注我的公众号 [极智视界],获取我的更多笔记分享

  大家好,我是极智视界,本文解读一下 目标检测神器 YOLOX

  在文本中,作者介绍了 YOLO 系列的一些经验改进,形成了一个新的高性能检测器 - YOLOX。作者将 YOLO 检测器切换为 anchor-free 的方式,并结合其他先进的检测技术:一个解耦头 和 leading label分配策略 SimOTA,以实现 state-of-the-art 的结果:对于只有 0.91M 参数和 1.08G FLOPs 的 YOLO-Nano,在 COCO 上获得了 25.3% 的 AP,超过了 NanoDet 1.8% 的 AP;YOLOv3 是工业中使用最广泛的检测器之一,作者在 COCO 上将其精度提高到 47.3%,比目前的最佳实践高出 3.0%;对于与 YOLOv4-CSP、YOLOv5-L 参数大致相同的 YOLOX-L,作者在 Tesla V100 上以 FPS 68.9 的速度在 COCO 上实现了 50.0% 的 AP,这比 YOLOv5-L 高出 1.8%。此外作者使用一个 single YOLO-L 模型赢得了 Streaming Perception Challenge 比赛的第一名 (CVPR 2021年自动驾驶研讨会)。作者希望论文可以为开发人员和研究人员在实际场景中提供有用的经验,同时作者也提供了支持 ONNX、TensorRT、NCNN 和 Openvino 的部署版本。源码在:https://github.com/Megvii-BaseDetection/YOLOX

文章目录

1. 简介

  随着目标检测的发展,YOLO系列一直在追求实时应用中速度精度的最佳权衡,他们 (指 YOLO系列) 提取了当时最先进的检测技术 (YOLOv2 中的 anchors,YOLOv3 中的 残差网络),并优化实现以获得最佳实践。目前,YOLOv5 在 COCO 上以 AP 48.2% 和 13.7ms 的速度保持最佳折中性能。

  然而,在过去两年中,目标检测学术界的主要进展集中在 anchor-free 的检测器、高级标签分配策略 和 end-to-end (NMS-free) 的检测器。这些还没有被集成到 YOLO 家族中,因为 YOLOv4 和 YOLOv5 仍然是基于手工制作训练分配规则的 anchor-based 的检测器。

  这也是作者为什么写这篇报告的原因,作者想通过经验丰富的优化,将这些最新的进展交付给 YOLO 系列。考虑到 YOLOv4 和 YOLOv5 对于 anchor-based pipeline 可能有些过度优化,作者选择 YOLOv3 作为起始点 (将 YOLOv3-SPP 看做默认 YOLOv3)。事实上,由于计算资源有限以及在各种实际应用中也没有足够的软件支持,YOLOv3 仍然是业界应用最广泛的检测器之一。

  如下图,通过上述技术的经验更新,作者将在 COCO 上 640x640 分辨率时,将 YOLOv3 提升到了 AP 47.3%,大大超过了目前最好的 YOLOv3 实现 (44.3% AP)。另外,当切换到先进的 YOLOv5 架构,采用先进的 CSPNet backbone 和 额外的 PAN head,YOLOX-L 在 COCO 上以 640x640 的分辨率实现了 50.0% 的 AP,这比对应的 YOLOv5-L 高出 1.8%。作者也将他们的设计策略应用于更加小尺寸的模型上。YOLOX-Tiny 和 YOLOX-Nano (只有0.91M参数 和 1.08G FLOPs) 分别比对应的 YOLOv4-Tiny 和 NanoDet 性能好 (AP值) 10% 和 1.8%。


2. 方法

2.1 YOLOX-DarkNet53

  作者选择了 YOLOv3 和 Darknet53 作为 baseline。接下来将逐步介绍 YOLOX 的整个系统设计。

Implementation details 从 baseline 到最终的模型,作者的训练设置基本一致。在 COCO train2017 上对模型进行了总共 5个 epoch 的 warm-up 及 300 个 epoch,使用随机梯度下降 (SGD) 进行训练,使用 lr x batchsize/64 (线性缩放) 的学习率、initial lr 为 0.01 以及 cosine lr 调度。weight decay 为 0.0005、SGD momentum 为 0.9。对于 8-GPU 的设备,batch size 设置为 128,对于 单卡GPU,其他 batch size 依旧能够 work 地非常好。输入大小以 32 的步长,均匀地从 448 变化到 832。论文里的 FPS 和 延时 均是在 FP16精度、batch=1 的情况下在 单卡 Tesla V100 上测得的。

YOLOv3 baseline 作者设计的 baseline 参考了一些论文中的 YOLOv3-SPP,采用 Darknet53 backbone 和一个 SPP 层。与原始实践相比,作者略微改变了一些训练策略,增加了 EMA 权重更新、cosine lr 调度、IoU损失和 IoU感知分支。使用 BCE loss 来训练 cls 和 obj 分支,使用 IoU loss 来训练 reg 分支。此外,只进行 RandomHorizontalFlip、ColorJitter 和 多尺度数据增强,而放弃 RandomResizedCrop 策略,因为 RandomResizedCrop 与 规划的mosaic数据增强 有一些重叠。通过这些数据增强方法,baseline 在 COCO 验证集上达到了 38.5% 的 AP,如下表:

Decoupled head 在目标检测中,分类任务和回归任务之间的冲突是一个众所周知的问题。因此,用于分类和定位的解耦头被广泛应用于大多数 one-stage 和 two-stage 检测器中。然而,虽然 YOLO 系列的 backbone 和 特征金字塔 在不断演化,它们的检测头仍然是耦合的,如下图所示:

  作者的两个分析实验表明,耦合的检测头可能会损害性能。(1) 如下图,将 YOLO 的头部替换为解耦头,可以大大提高收敛速度; (2) 解耦头对于端到端版本的 YOLO 至关重要,end-to-end YOLO 耦合头的 AP 降低了 4.2%,而 end-to-end YOLO 解耦头的 AP 只下降了 0.8%。作者将 YOLO 检测头替换为上图的简化解耦头。具体来说,它包含了一个 1x1 conv层以降低通道维度,其次是两个并行的分支,分别有两个 3x3 conv层。

Strong data augmentation 将 Mosaic 和 MixUp 加入到数据增强策略中,以提高 YOLOX 的性能。Mosaic 是 ultralytics-YOLOv3 提出的一种高效的数据增强策略,随后被广泛应用于 YOLOv4、YOLOv5 等检测器中。MixUp 最初用于图像分类任务,后来在 BoF 中进行了修改,用于目标检测训练。在 YOLOv7 中采用 MixUp 和 Mosaic 来实现,并在最后 15 个 epoch 关闭它,这样做实现了 42.0% 的 AP。在使用数据增加后,作者发现 ImageNet 的预训练并没有更多的好处,因此所有的模型都从零开始训练。

Anchor-free YOLOv4 和 YOLOv5 都遵循 YOLOv3 最初的 anchor-based pipeline。然而,anchor 机制存在许多已知的问题。首先,为了达到最优的检测性能,需要在训练前进行聚类分析以确定一组最优的 anchors。这些聚类生成的 anchors 是特定于领域的,不太通用。其次,anchor 机制增加了检测头的复杂性,增加了每张图片的预测次数。在一些边缘 AI 系统中,在设备之间传输如此大量的预测 (如 从 NPU 到 CPU) 可能会成为整体延迟方面的潜在瓶颈。

  Anchor-free 检测器在过去两年中发展迅速,这些工作表明,anchor-free 检测器的性能可以与 anchor-based 的检测器相媲美。anchor-free 机制大大减少了需要启发式优化的设计参数的数量 和 许多涉及到良好性能的技巧,使检测器的训练和解码阶段大大简化。

  将 YOLO 转换为 anchor-free 的方式非常简单,只需要将每个位置的预测从 3 减少到 1,直接预测 4 个值,即 grid 左上角的两个偏移量 以及 预测框的高度和宽度。作者将每个目标的中心位置指定为 正样本,并预先定义一个比例范围,以指定每个目标的 FPN 级别。这种修改减少了检测器的 参数 和 GFLOPs,速度更加快,且获得了更加好的性能:AP 42.9%。

Multi positives 为了与 YOLOv3 的赋值规则保持一致,以上的 anchor-free 版本对每个目标只选择一个正样本 (中心位置),同时忽略了其他高质量的预测。 然而,优化这些高质量的预测也可能带来有益的梯度,这可能会缓解训练中 正/负抽样 极端不平衡的问题。作者简单地指定中心 3x3 区域为正样本,在 FCOS 中也称为 “中心抽样”。

SimOTA 高级标签分配是近年来目标检测的又一重要进展。基于作者自己的研究,总结了四个高级标签分配的关键见解:(1) loss / quality aware;(2) center prior;(3) 每个 ground-truth 的正 anchor 的动态数量 (缩写为 dynamic top-k);(4) global view。OTA 满足上述 4 条规则,因此选择它作为候选标签分配策略。

  具体来说,OTA 从全局的角度分析标签分配,将分配过程制定为一个最优传输问题 (OT),产生了目前分配策略中的 SOTA 性能。然而,在实践中作者发现使用 Sinkhorn-Knopp 算法求解 OT 问题会增加 25% 的训练时间,这对于 300 个 epoch 的训练来说是相当昂贵的。因此,作者将其简化为动态 top-k 策略,命名为 SimOTA,以得到近似解。

  简单介绍一下 SimOTA,SimOTA 首先计算 成对匹配程度,用每个 prediction-gt对 的成本或质量表示。例如,在 SimOTA 中,gt gi 与 预测pj 之间的代价计算为:

  SimOTA 不仅减少了 Sinkhorn-Knopp 算法的训练时间,而且避免了额外的解算器超参数。使用 SimOTA 将检测器的 AP 从 45.0% 提高到 47.3%,比 SOTA ultralytics-YOLOv3 还提高了 3.0%,这显示了高级分配策略的威力。

End-to-end YOLO 作者遵循添加两个额外的 conv 层,一对一的标签分配,并停止梯度。这使得检测器能够执行 end-to-end 方式,但略微降低了性能和推理速度。

2.2 Other Backbones

  除了 DarkNet53 外,作者还在其他不同大小的 backbone 上测试 YOLOX,其中 YOLOX 所有对应部分实现了一致的改进。

Modified CSPNet in YOLOv5 为了进行公平的比较,作者采用了原生的 YOLOv5 的 backbone,包括修改的 CSPNet、SiLU 激活 以及 PAN头,并遵循它的缩放规则去生成 YOLOX-S、YOLOX-M、YOLOX-L 和 YOLOX-X 模型。与下表中的 YOLOv5 相比,本文的模型获得了 ~3.0% 到 ~1.0% AP 的提升,同时只增加一点点时间 (来自 解耦头)。

Tiny and Nano detectors 作者进一步缩小模型为 YOLOX-Tiny,以便与 YOLOv4-Tiny 进行比较。对于移动设备,采用深度卷积的方法构建了一个只有 0.91M参数 和 1.08G FLOPs 的 YOLOX-Nano 模型。如下表所示,YOLOX 在模型尺寸更小的情况下也比同类模型表现更加好。

Model size and data augmentation 在实验中,所有的模型都保持了几乎相同的 学习调度策略 和 优化参数。然而,作者发现合适的增强策略 在不同规模的模型中有所不同。如下表所示,对于 YOLOX-L,应用 MixUp 可以提高 0.9% 的 AP,但对于 YOLOX-Nano 这样的小模型,数据增强的效果却是减弱的。这样的改进使 YOLOX-Nano 的 AP 从 24.0% 提高到 25.3%。

  对于大模型,作者还发现数据增强效果更加有帮助。事实上,作者的 MixUp 实现比原版的更重。受到 Copypaste 的启发,在混合它们之前,通过随机抽样的比例因子对两个图像进行抖动。为了了解 MixUp 和 缩放抖动的能力,作者将其与 YOLOX-L 上的 Copypaste 进行比较。需要注意的是,Copypaste 需要额外的实例掩码注释,而 MixUp 则不需要。如上表,这两种方法的性能不相上下,这表明当没有 实例掩码注释 可用时,带缩放抖动的 MixUp 是对 Copypaste 的合格替代。


3. 实验

  在 COCO 2017 测试集上对不同目标检测器的速度和精度进行了比较:


4. 参考

  [1] YOLOX: Exceeding YOLO Series in 2021.


  好了,以上解读了 目标检测神器 YOLOX。希望我的分享能对你的学习有一点帮助。


 【极智视界】

《极智Paper | 目标检测神器 YOLOX》


搜索关注我的微信公众号【极智视界】,获取我的更多经验分享,让我们用极致+极客的心态来迎接AI !

以上是关于极智Paper | 目标检测神器 YOLOX的主要内容,如果未能解决你的问题,请参考以下文章

极智Paper | 单级特征检测网络 YOLOF

Deepstream之YoloX部署

睿智的目标检测53——Pytorch搭建YoloX目标检测平台

睿智的目标检测52——Keras搭建YoloX目标检测平台

睿智的目标检测54——Tensorflow2 搭建YoloX目标检测平台

[课程][原创]yolox检测封装成类调用几句代码完成目标检测任务