YOLOX理论

YOLOX: Exceeding YOLO Series in 2021
Zheng Ge, Songtao Liu, Feng Wang, Zeming Li, Jian Sun
  • 论文下载: https://arxiv.org/abs/2107.08430
  • 官方源码(Pytorch实现) : https://github.com/Megvii-BaseDetection/YOLOX
  • YOLOX对应博文: https://blog.csdn.net/qq_37541097/article/details/125132817

Abstract

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 this https URL.

在本报告中,我们介绍了 YOLO 系列的一些经验改进,形成了一种新的高性能检测器——YOLOX。我们将 YOLO 检测器切换为无锚方式(anchor-free)并进行其他高级检测技术,即解耦头和领先的标签分配策略 SimOTA,以在大规模模型范围内实现最先进的结果:对于 YOLO -Nano 只有 0.91M 参数和 1.08G FLOPs,我们在 COCO 上获得 25.3% AP,超过 NanoDet 1.8% AP;对于业界使用最广泛的检测器之一 YOLOv3,我们在 COCO 上将其提升到 47.3% AP,比当前最佳实践高出 3.0% AP;对于与 YOLOv4-CSP、YOLOv5-L 参数量大致相同的 YOLOX-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 的部署版本。源代码在这个 https URL。


论文亮点:

  1. Anchor-Free
  2. 解耦的检测头(Decoupled Detection Head)
  3. 更加先进的正负样本匹配策略(Advanced Label Assigning Strategy) – SimOTA

YOLOX获取了Streaming Perception Challenge的第一名

1. 前沿

YOLOX是旷视科技在2021年发表的一篇文章,当时主要对标的是很火的YOLO v5,YOLOX的性能如下图所示。

YOLOX理论_第1张图片)

YOLOX比当年的YOLO v5略好一点,并且论文中说他们利用YOLOX获得了当年的Streaming Perception Challenge的第一名。那这里可能有人会问了,在自己的项目中YOLO v5和YOLOX到底应该选择哪个。霹雳吧啦WZ的建议是:

  • 如果数据集图像分辨率不是很高,比如 640 × 640 640\times 640 640×640,那么两者都可以试试。
  • 如果数据集图像分辨率很高,比如 1280 × 1280 1280\times 1280 1280×1280,那么建议使用YOLO v5。

因为YOLO v5官方仓库有提供更大尺度的预训练权重,而YOLOX当前只有 640 × 640 640\times 640 640×640的预训练权重(YOLOX官方仓库说后续会提供更大尺度的预训练权重,可过了快一年了还没有音讯)。

2. 网络结构

YOLOX-L的网络结构如下所示,该结构的base为YOLO v5(tag: v5.0),除了Head不同外,其他都相同。

YOLOX理论_第2张图片

那YOLOX和YOLO v5在网络结构上有什么差别呢,主要的差别就在检测头head部分。之前的检测头就是通过一个卷积核大小为1x1的卷积层实现的,即这个卷积层要同时预测①类别分数、②边界框回归参数以及③Object Confidence,这种方式在文章中称之为Coupled Detection Head(耦合的检测头)。作者说采用Coupled Detection Head是对网络有害的,如果将Coupled Detection Head换成Decoupled Detection Head(解耦的检测头)能够大幅提升网络的收敛速度。在论文的图3中展示了YOLO v3分别使用Coupled Detection head和Decoupled Detection Head的训练收敛情况。

YOLOX理论_第3张图片

图3:带有YOLOv3头或解耦头的Detector的训练曲线。我们每10个Epoch对COCO值的AP进行评估。很明显,解耦头的收敛速度比YOLOv3头快得多,最终取得了更好的结果。

明显采用Decoupled Detection Head后收敛速度会更快(在论文的表2中显示采用Decoupled Detection Head能够提升AP约1.1个点)。说句题外话相比与YOLO v3我更关心对于YOLO v5能提升多少AP,但文章中并没有相关数据。

那decoupled detection head到底长啥样,根据原论文的图2以及源码绘制的decoupled detection head结构如下。

YOLOX理论_第4张图片

YOLOX理论_第5张图片

在decoupled detection head中对于预测①Cls.、②Reg.以及③IoU参数分别使用三个不同的分支,这样就将三者进行了解耦。这里需要注意一点,在YOLOX中对于不同的预测特征图采用不同的head,即参数不共享。

  • Cls.: 预测类别信息的分支 -> H × W × n u m c l s H \times W \times num_{cls} H×W×numcls
  • Reg.: 预测目标回归参数的分支 -> H × W × 4 H \times W \times 4 H×W×4 (因为是Anchor-free网络,因此只会预测4个位置参数)
  • IoU参数: 预测置信度的分支 -> H × W × 1 H \times W \times 1 H×W×1

需要注意的是,YOLOX中,不同Head中的参数是不共享的(针对3种不同尺度的预测特征图所对应Head的参数是不同的)。之前将的FCOS中,Head的参数是共享的。

3. Anchor-Free

近几年有关Anchor-Free的网络也层出不穷,之前我们也聊过一个Anchor-Free的网络FCOS。YOLOX也是一个Anchor-Free的网络,并且借鉴了FCOS中的思想。刚刚在上面我们已经简单聊到了YOLOX的decoupled detection head,它对预测特征图(feature map/Grid 网格)上的每一个位置都预测了 n u m c l s + 4 + 1 num_{cls}+4+1 numcls+4+1个参数,其中 n u m c l s num_{cls} numcls代表检测的目标类别数, 4 4 4代表网络预测的目标边界框参数, 1 1 1代表object confidence(图中标的是IoU.)。

由于YOLOX是Anchor-Free的网络,所以head在每个位置处直接预测4个目标边界框参数 [ t x , t y , t w , t h ] [t_x, t_y, t_w, t_h] [tx,ty,tw,th]如下如所示。

YOLOX理论_第6张图片

4 4 4个参数分别对应预测目标中心点相对Grid Cell左上角 ( c x , c y ) (c_x, c_y) (cx,cy)偏移量,以及目标的宽度高度因子,注意这些值都是相对预测特征图尺度上的,如果要映射回原图需要乘上当前特征图相对原图的步距stride

  • x c e n t e r x_{center} xcenter: 特征图尺度上的x坐标
  • y c e n t e r y_{center} ycenter: 特征图尺度上的y坐标
  • w w w: 特征图尺度上的宽度
  • h h h: 特征图尺度上的高度

在YOLO v3中,坐标预测如下所示。

YOLOX理论_第7张图片

其中:

  • t x t_x tx 是网络预测的目标中心 x x x 坐标偏移量(相对于网格的左上角)
  • t y t_y ty 是网络预测的目标中心 y y y 坐标偏移量(相对于网格的左上角)
  • c x c_x cx 是对应网格左上角的 x x x 坐标
  • c y c_y cy 是对应网格左上角的 y y y 坐标
  • σ \sigma σ 是sigmoid激活函数,将预测的偏移量限制在0到1之间,即预测的中心点不会超出对应的Grid Cell区域
  • p w p_w pw 是先验框Anchor的宽度
  • p h p_h ph 是先验框Anchor的高度
  • b x b_x bx: 特征图尺度上的x坐标
  • b y b_y by: 特征图尺度上的y坐标
  • b w b_w bw: 特征图尺度上的宽度
  • b h b_h bh: 特征图尺度上的高度

可以看到,YOLOX在计算相对特征图的位置坐标时,并没有对 x , y x, y x,y的偏移量进行 σ \sigma σ限制,且在求高度和宽度时并没有乘以Anchor的尺寸,因为YOLOX是Anchor-Free模式的,与Anchor无关(就没有Anchor这个概念了)。

4. 损失计算

由于在网络的检测头中有Cls.分支Reg.分支以及IoU.分支(其实是Obj.分支),所以损失由 L c l s L_{cls} Lcls L r e g L_{reg} Lreg 以及 L o b j L_{obj} Lobj 这三部分组成,个人感觉如果把 L o b j L_{obj} Lobj 换成 L I o U L_{IoU} LIoU 会更合理。其中 L c l s L_{cls} Lcls L o b j L_{obj} Lobj 采用的都是二值交叉熵损失(BCE Loss),而 L r e g L_{reg} Lreg 采用的是IoU Loss。还要注意的是, L c l s L_{cls} Lcls 以及 L r e g L_{reg} Lreg 只计算正样本的损失,而 L o b j L_{obj} Lobj 既计算正样本也计算负样本的损失

L o s s = L c l s + λ L r e g + L o b j N p o s Loss = \frac{L_{cls} + \lambda L_{reg} + L_{obj}}{N_{pos}} Loss=NposLcls+λLreg+Lobj

其中:

  • L c l s L_{cls} Lcls表示分类损失
  • L r e g L_{reg} Lreg表示定位损失
  • L o b j L_{obj} Lobj表示obj损失(置信度损失)
  • λ \lambda λ表示定位损失的平衡系数,源码中设置的是 5.0 5.0 5.0
  • N p o s N_{pos} Npos表示被分为正样本的Anchor Point个数

5. 正负样本匹配策略SimOTA

SimOTA是比较难理解的部分,主要是源码看的头大。训练网络时就是通过SimOTA来进行正负样本的匹配。而SimOTA是由OTA(Optimal Transport Assignment)简化得到的,OTA也是旷视科技同年出的一篇文章,论文名称叫做《Optimal transport assignment for object detection》,论文的核心观点是:将匹配正负样本的过程看成是一个最优传输问题

YOLOX理论_第8张图片

根据原论文中的表二,可以看到,在YOLO v3的基准上使用SimOTA后能够给AP带来 2.3 2.3 2.3个点的提升。其实有个疑问,这个SimOTA对于YOLO v5能够带来多少提升,如果对YOLO v5也能带来两个多点的提升那不是YOLO v5又把YOLOX给反超了?


OTA究竟是什么呢?下面是论文中的原话:

Specifically, OTA analyzes the label assignment from a global perspective and formulate the assigning procedure as an Optimal Transport (OT) problem, producing the SOTA performance among the current assigning strategies.
具体来说,OTA从全局角度分析标签分配,并将分配程序制定为最优传输(OT)问题,在目前的分配策略中产生SOTA性能。

简单来说,就是将匹配正负样本的过程看成一个最优传输问题。这里为了方便理解就举个简单的例子。如下图所示,假设有1到6共6个城市(图中的五角星),有2个牛奶生产基地A和B。现在要求这两个牛奶生产基地为这6个城市送牛奶,究竟怎样安排才能最小化运输成本。假设运输成本(cost)仅由距离决定,那么很明显城市1、2、3由牛奶生产基地A负责,城市4、5、6由牛奶生产基地B负责,运输成本最低。

YOLOX理论_第9张图片

那么在SimOTA正负样本匹配过程中,城市对应的是每个样本(对应论文中的anchor point,其实就是grid网格中的每个cell),牛奶生产基地对应的是标注好的GT Bbox,那现在的目标是怎样以最低的成本(cost)将GT分配给对应的样本。根据论文中的公式1,cost的计算公式如下,其中 λ \lambda λ 为平衡系数,代码中设置的是 3.0 3.0 3.0

c i j = L i j c l s + λ L i j r e g c_{ij} = L_{ij}^{cls} + \lambda L_{ij}^{reg} cij=Lijcls+λLijreg

通过公式可以得知,成本cost由①分类损失和②回归损失两部分组成,并且网络预测的类别越准确cost越小,网络预测的目标边界框越准确cost越小。那么最小化cost可以理解为让网络以最小的学习成本学习到有用的知识

刚刚在上面有提到,城市对应的是每个样本(对应论文中的anchor point,其实就是grid网格中的每个cell),那是不是所有的样本都要参与cost的计算呢,当然不是。这里先回忆一下之前讲过的FCOS网络,它是如何匹配正负样本的?

YOLOX理论_第10张图片

FCOS是将那些落入GT中心sub-box范围内的样本视为正样本,其他的都视为负样本

那么在SimOTA中,也有个类似的预筛选过程,通过阅读源码分析得到它首先会将落入目标GT Bbox内落入fixed center area内的样本给筛选出来,在源码中作者将center_radius设置为 2.5 2.5 2.5,即fixed center area是一个 5 × 5 5\times 5 5×5大小的box。如下图所示。

如果不进行预筛选,而是拿所有的样本都来计算cost的话,计算成本有些高。
fixed center area和FCOS的sub-box有些类似

YOLOX理论_第11张图片

feature map(或者称grid网格)中所有打勾的位置都是通过预筛选得到的样本(anchor point)。注意,这里将落入GT Bbox与fixed center area相交区域内的样本用橙色的勾表示。

接着计算网络在这些样本(anchor point)位置处的预测值(目标类别以及目标边界框)和每个GT的 L i j c l s L_{ij}^{cls} Lijcls 以及 L i j r e g L_{ij}^{reg} Lijreg(由于回归损失是IoU Loss,所以这里也知道每个样本和每个GT的IoU),然后再计算每个样本和每个GT之间的cost。这里需要注意下,在代码中计算cost的过程如下,和论文中给的公式有一点点区别:

cost = (
            pair_wise_cls_loss
            + 3.0 * pair_wise_ious_loss
            + 100000.0 * (~is_in_boxes_and_center)
        )

其中:

  • pair_wise_cls_loss就是每个样本与每个GT之间的分类损失 L i j c l s L_{ij}^{cls} Lijcls
  • pair_wise_ious_loss是每个样本与每个GT之间的回归损失 L i j r e g L_{ij}^{reg} Lijreg
  • is_in_boxes_and_center代表那些落入GT Bbox与fixed center area交集内的样本,即上图中橙色勾对应的样本,然后这里进行了取反~表示不在GT Bbox与fixed center area交集内的样本(非橙色样本),即上图中黑色勾对应的样本。接着又乘以 100000.0 100000.0 100000.0,也就是说对于GT Bbox与fixed center area交集外的样本cost加上了一个非常大的数,这样在最小化cost过程中会优先选择GT Bbox与fixed center area交集内的样本。

接下来介绍如何利用cost去进行正负样本的匹配,以下内容全部是按照源码中的计算流程进行讲解,可能没那么容易理解,如果想看懂源码的话建议多看几遍。

Step 1

首先构建两个矩阵,一个是之前筛选出的Anchor Point与每个GT之间的cost矩阵,另一个是Anchor Point与每个GT之间的IoU矩阵。接着计算n_candidate_k并结合IoU对Anchor Point做进一步筛选(保留IoU大的Anchor Point),n_candidate_k是取10和Anchor Point数量之间的最小值,在下面给的这个示例中由于Anchor Point数量为6,所以n_candidate_k=6,故保留所有的Anchor Point。

YOLOX理论_第12张图片

这里记录的IoU是每个Anchor Point预测的目标边界框和每个GT之间的IoU
n_candidate_k的意思是最多取10个Anchor Point

Step 2

接着对每个GT计算剩下所有的Anchor Point的IoU之和然后向下取整,得到针对每个GT所采用的正样本数量,即代码中计算得到的dynamic_ks(这个计算过程对应论文中的Dynamic k Estimation Strategy)。对于下面的示例,GT1的所有Anchor Point的IoU之和为3.0向下取整就是3所以对于GT1有3个正样本,同理GT2也有3个正样本。

YOLOX理论_第13张图片

.int(): 向下取整
.min=1: 最小值为1

Step 3

然后根据刚刚计算得到的dynamic_ks(每个GT对应几个正样本)和cost矩阵找出所有的正样本(根据cost的数值大小)。比如对于示例中的GT1,刚刚计算采用3个正样本,然后看下GT1和所有Anchor Point的cost,按照从小到大的顺序将前3小的Anchor Point找出来,即示例中的A1、A2和A5。同理对于GT2,cost排前3的是A3、A4和A5。根据以上结果,我们可以再构建一个Anchor Point分配矩阵,记录每个GT对应哪些正样本,对应正样本的位置标1,其他位置标0。

YOLOX理论_第14张图片

Step 4

按照示例我们会发现一个问题,即GT1GT2同时分配给了A5。作者为了解决这个带有歧义的问题,又加了一个判断。如果多个GT同时分配给一个Anchor Point,那么只选cost最小的GT。在示例中,由于A5与GT2的cost小于与GT1的cost,故只将GT2分配给A5。

YOLOX理论_第15张图片

计划

  1. 看一下YOLOX源码
  2. 在VOC 2012上进行测试
  3. 修改网络
    1. 添加注意力机制
    2. SPP

知识来源

  1. YOLOX网络详解
  2. https://blog.csdn.net/qq_37541097/article/details/125132817

你可能感兴趣的:(深度学习,目标检测,PyTorch,深度学习,目标检测,计算机视觉)