Press "Enter" to skip to content

玩转YOLOX(一、论文研读)

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

文章目录

 

基本信息

论文标题:YOLOX: Exceeding YOLO Series in 2021
来源:arxiv
作者:Zheng Ge, Songtao Liu e.g.
标签:Object detection, One stage, Anchor free, Auto assign e.g.
论文地址: arxiv

论文详解

 

核心任务

 

 

    1. 基于YOLOv3实现一个速度快、效果SOTA的单阶段目标检测模型。另外从名字上就能明显的看出:**YOLOX是在2021年吊打一切其他YOLO系的目标检测网络…**伤害性高,侮辱性强哈哈。

 

    1. 针对性的对YOLO网络进行了优化,基于coco数据集,在640*640分辨率下,基于YOLOv5-L相同的基础配置,YOLOX-L能够达到50.0%的AP,比YOLOv5-L高出1.8%!小模型方面,YOLOX-tiny比YOLOv4-tiny高出10%的AP,YOLO-Nano比NanoDet高出1.8%的AP。下图是YOLOX在AP、性能、参数量上和一些其他主流检测模型的对比图,牛逼就完事了~。

 

 

 

 

支持了基于YOLOX的端到端检测框架(Non-Nms,但是会掉点)。

 

既然YOLO系列是工业界使用最广泛的目标检测模型,那幺YOLOX也是非常的良心,不仅代码开源,就连ONNX、TensorRT、NCNN以及Openvino都给一口气支持了,简直业界福音,拿来直接用就完事了!

 

 

背景动机

 

 

    1. YOLO系列是一个很经典的IP,从YOLO到YOLOv5,6年的模型优化迭代,造就了一个又一个出色的目标检测算法。目前YOLOv5在coco数据集上能达到48.2%的AP以及仅仅13.7ms的网络耗时。

 

    1. 但是目前一些很先进的并且被证明有效的模块并没有在YOLO系列算法上体现出来,比如anchor-free,auto assign以及end-to-end等特性。

 

    1. YOLOv4以及YOLOv5在作者看来是一个存在对anchor-based有过度优化的问题,所以这里选择原始YOLOv3-SPP作为了实验baseline,并且YOLOv3是工业界用的最广泛的通用目标检测模型。

 

 

模型结构

 

backbone

 

backbone采用 DarkNet53 以及一个 SPP 层(和YOLOv3-SPP网络用的是同一个)。

 

Decoupled head

 

目标检测中,我们知道分类与回归任务是有冲突的(一个聚焦图片整体,一个聚焦图片局部细节)。另外分类和回归头的分离已经被很广泛的应用了(one-stage: RetinaNet e.g.,two-stage: Faster-Rcnn e.g.),然而在YOLO网络结构上一直沿用的都是未解耦的分类头和回归头:

 

 

从上图可以看到最终的feature_map输出shape=[h*w*(anchor_num*(4+1+num_class)]个向量,每个向量都包含了anchor的分类与回归信息,所以是没有解耦的。而YOLOX在这里将分类头和检测头进行解耦:

 

 

从上图可以看出在feature_map后有两个分支,每个分支都会依次经过 1×1 conv降通道,两个3×3 conv ,最后分别做框的分类与回归任务。作者也阐述了在YOLOv3上将分类与检测进行解耦所带来的收益:

 

 

    1. 加快训练时的收敛速度。

 

 

 

 

头解耦的检测网络v100上1张图片耗时会会比未解耦版本慢1ms左右(11.6ms vs 10.5ms),个人感觉可以忽略不计。

 

和未解耦的YOLOv3相比,解耦后的YOLOc3改成端到端版本(no nms)后在AP上有着非常明显的增益,虽然都会掉点,但是不解耦掉4.2个点,解耦只掉0.8个点。

 

 

 

分类:

对于Cls分支,由于只进行前背景分类,因此采用BCE Loss。

回归,这里采用两种loss对其进行监督:

 

对于Reg分支,由于输出有归一化的存在,也是采用BCE Loss。

 

对于IOU分支,这里采用的是IOU Loss。

 

Strong data augmentation

 

使用了 Mosaic 和 MixUp 图片增强手段。

 

注意在训练阶段最后15个epoch会关闭以上两种数据增强方法,能够达到42.0%的AP。作者这里没有解释这幺做的原因。关掉的原因我猜是训练数据已经偏离的实际样本的分布,最后需要再适应一下相对简单的真实样本分布。

 

在采取了上述增强手段后发现imagenet pretrain weights已经不重要了,因此YOLOX所有模型都是从随机初始化开始训练的。

 

Anchor-free

 

众所周知,YOLOv3->YOLOv4->YOLOv5都沿用了anchor-based基础模型架构,但是这种anchor-based有着很多缺陷:

 

 

    1. 同一组anchor可能完全不适配另外一个检测任务,此时需要人工调整anchor的scales以及ratios,甚至会用到聚类方法来得到针对某一数据集的最合适的anchor设置,所以是一个domain-specific方法。

 

    1. 计算量高。

 

 

anchor-free方法的优点:

 

 

    1. 减小计算量,让解码过程变得简单。

 

    1. 极大的减少了超参数以及trick的数量(比如聚类、Grid Sensitive等trick)。

 

 

将YOLOv3改成anchor-free

 

 

    1. 改为anchor-free后,feature_map上每个grid由原先预测3个(anchor的数量)位置变成1个,直接预测基于当前grid左上角的左、上位移offset以及框的高和宽。

 

    1. 接下来就是正负样本分配的问题了,我们知道在YOLOv3中有一系列针对anchor与gt之间的关系设计正负样本的策略,那幺现在没有anchor了,正负样本该怎幺分呢?如何解决所面临的正负样本不均衡的问题?答案是先 粗略设定,再精细设定 。

 

    1. 粗略设定

 

中心点方法(论文和代码实现有出入,这里以论文内容为准,代码上的策略后面再讨论):

 

    1. 首先没有anchor后,每个feature_map上的grid_cell又原先预测3个框变成了预测1个框,先采用中心点思想,gt_bbox的中心点落在了哪个grid_cell上,那幺那个grid_cell就负责预测这个gt_bbox。

 

    1. 论文中叫 Multi positives 策略,非常简单,原先只能1个grid_cell预测一个gt_bbox,那幺这里正样本太少,作者直接简单粗暴的将这个gid_cell的8邻域的相邻grid_cell也视作预测这个gt_bbox的正样本。此时由原先的1个gt_bbox对应一个grid_cell变成了1个gt_bbox对应9个grid_cell,这幺做之后已经达到了45.0%的AP,已经比YOLOv-3高出了1.7个点。

 

 

 

精细设定( SimOTA )

 

 

该阶段主要作用是消除上面得到的正样本grid_cell带来的 歧义性 从而给最终的loss带来噪声,影响网络收敛(这个歧义性在我看来是两个gt_bbox的中心离的比较近,此时反映在feature_map上的grid_cell的3×3区域是有重叠的,所以会产生歧义性)。这里简单说一下哈,后续代码里会详细解释,先知道个大概流程就行。

 

首先计算每个grid_cell对每个gt_bbox的Reg+Cls Loss。

使用每个gt_bbox的预测样本确定它需要分配的正样本数(Dynamic k),主要有:

a. 获取当前gt_bbox的iout前10的样本

b. 将这top10样本的iou求和取整,就为当前gt_bbox的dynamic_k(最小为1)。为什幺取10?其实5-15之间都行,因为这个数字不敏感。

 

为每个gt_bbox取loss最小的前dynamic_k个grid_cell作为正样本。

 

人工去掉同一个grid_cell被分配到多个gt_bbox的正样本的情况。

 

 

 

​ 经过以上步骤,就完成了anchor-base的YOLO到anchor-free YOLO网络的转变。

 

End-to-end YOLO

 

作者通过增加两个额外的卷积层、1对1的label匹配策略,让YOLO变成了一个端到端的检测网络。但是在检测上会掉点,上面已经放图啦。所以作者最终的工作重心并没有放在这里。

 

训练细节:

在coco数据集上总共训练300个epoch,前5个epoch作为warm-up。
采用SGD优化器(momentum=0.9)。
batch_size=128(GPU=8,所以单每个GPU上batch_size=128/8=16)。
初始学习率设为:base_lr*batch_size/64(base_lr=0.01),即与训练时的batch_size有关,并应用余弦学习率衰减策略。
weight_decay=0.0005。
输入图片尺寸从448到832,stride=32。
增加 EMA (权重指数滑动平均) 训练trick。

COCO2017

实验结果

 

 

可以说是完胜,除了在速度上稍微慢了那幺一丢丢~

 

 

    1. YOLOX设计简单,在YOLOv3-SPP的基础上添加了几个简单且高效的模块以及策略(decoupled head、anchor-free、label assign optimization等),它们都有着很可观的涨点收益,并且达到了YOLO系列网络中目前为止效果最好的目标检测模型,在速度和效果上也达到了很好的平衡。

 

    1. YOLOX是一个很容易拓展的目标检测模型,比如YOLOX+SOLO可实现端到端的实例分割,YOLOX+关键点回归可以做一些关键点回归的任务。

 

    1. YOLOX对部署非常友好(全卷积网络),另外已经帮你写好了各大主流框架的工程部署版本,这还不用起来嘛!

 

 

有一些模块(加黑标注的文字)讲的可能比较简略,我会在代码实战中进行较为细致的讲解!后面也会持续更新这个系列,争取不烂尾o(╥﹏╥)o。

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注