YOLOX 学习笔记
笔记来源:https://www.bilibili.com/video/BV1jo4y1D7CF/?vd_source=2ed6e8af02f9ba8cb90b90e99bd4ccee
近年来,目标检测的工程应用研究中,YOLO系列以快速响应、高精度、结构简单以及容易部署的特点备受工程研究人员的青睐。同时,YOLO系列存在需要手工设定样本正负导致模型泛化能力较差的问题。为了解决此类问题,旷视科技研究院BaseDetection组结合学术界先进成果和工程实践的要求,提出了YOLOX。
本期,来自旷视科技研究院BaseDetection组的刘松涛,对YOLO近两年的关键技术进行了梳理,同时介绍了YOLOX在这些方向上的关键改进,以及一些实际训练和调优的经验。
主讲人:刘松涛,旷视研究院BaseDetection组研究员,本科和博士均毕业于北京航空航天大学,主要研究方向为计算机视觉中的目标检测、行人检测问题。他在CVPR、ECCV、ICCV等国际计算机视觉顶级会议中发表了近10篇文章,并获得了CVPR 自动驾驶比赛WAD 2021中Streaming Perception Challenge 双赛道冠军。代表作品包括RFBNet,AdaptiveNMS, ASFF和YOLOX等。
内容目录
一、 YOLO简介
二、 YOLO系列关键技术发展
2.1 Anchor Free发展
2.2 样本匹配(Label Assignment)发展
三、 YOLOX介绍
3.1 YOLOX核心部件介绍
3.2 YOLOX实验结果
3.3 YOLOX使用建议
3.4 YOLOX开源与部署
一、 YOLO简介
YOLO 系列高性能:速度快,精度高,方便部署(工业界)。
YOLO系列发展至今主要包含了v1、v2、v3、v4和v5以及针对每个版本的改进系列。YOLOv1源于Joseph Redmon,主要贡献在于:开发出实时高性能目标检测的one-stage检测框架,只需要将图像一次性输入到网络中即可预测出图像中目标的位置,具有速度快;检测精度高和方便部署等优点。
YOLOv2吸收了当时学术界最新的成果,性能持续提升,主要的改进之处在于:1)采用Darknet-19作为特征提取网络,增加了批量标准化(Batch Normalization)的预处理;2)YOLOv2吸收了Fast RCNN的做法,引入anchor方法。
YOLOv3同样吸收了当时学术界的最新成果,在v2的基础上借鉴了残差网络(ResNet)思想,使用了darknet-53,解决梯度消失或者梯度爆炸的问题。
YOLOv3之后,原作者Joseph Redmon认为YOLO系列存在一些非学术应用会产生不利的影响,所以退出YOLO在视觉方面的研究,但是后人在原来的基础上继续研究,成功发布了YOLOv4,v5。
YOLOv4由俄罗斯独立研究员Alexey Bochkovskiy继承了YOLO系列后开发,集百家之长,不断尝试优化。
YOLOv5的命名有一些争议,但作者也一直在维护和改进代码,其性能也一直在持续提升。作者提出了 masic 增强。
同时,这两年的YOLO系列与学术领域的发展是相对独立的。YOLOv4、YOLOv5的性能提升主要来自模块优化和调参,依旧使用了 Anchor based 和手工匹配规则等策略。
二、 YOLO系列关键技术发展
近两年来,Anchor free 和 label assignment 是学术界对于目标检测的主要进展内容。
2.1 从 Anchor based 到 Anchor free
Anchor based主要用在Faster RCNN以及YOLOv2和3等网络中,当学习某个目标的坐标时,得到相对坐标,比如预测bouding box 的坐标时,有一个原点坐标,当原点坐标不是一个点而是一个框的时候,该部分便称为 Anchor。faster Rcnn 时候出现的 Anchor,所谓的相对坐标是针对 anchor 的伸缩变换。 Anchor based 一般需要设置原点坐标和框的大小,预测时需要用 Anchor based 平移来完成预测。
Anchor free 相对于 Anchor based 更加灵活,只需要先定义预测框目标的中心点作为零点,然后基于原点确定四个顶点作为预测过程(实际上也是 anchor ,不过是 anchor point ),取代了 Anchor based 预测时需要平移边框的过程。
19年后,开始 Anchor free 的优势:
- (1)降低了手工设定Anchor的调参压力;预定义的 Anchor 的大小和长宽比跟数据分布高度相关,设定不好否则会影响性能,实际中需要调优 anchor 的设定。Anchor free 不需要设定这些 anchor box,网络可以学习到从一个点出发预测该目标,所以不需要调参。
- (2)模型后处理更加简单高效。两个方面:1:一个 anchor 框 只代表一种分布,所以一个位置上往往有多个 anchor 框去预测不同长宽比、大小的目标。anchor free 只需要预测一个 weight, 输出的样本数量就会成倍的减少,后处理上会更加高效。2:decode 时候 相对简单。
2.2 label assignment 发展
标签分配或者正负样本的分配( label assignment )是 Anchor free 之后又一重要技术。在 Dense prediction 中输出针对全图且输出远多于目标数,故而需要研究目标和输出结果的正负样本划分问题,用以确定哪些输出对应哪个目标以训练网络。
在 RetinaNet
中,根据 anchor 和 目标 的IOU 确定正负样本,通过计算 anchor 的形状和目标点之间的趋近程度得到目标的IOU,然后用IOU的大小确定样本的正负,所以调整anchor的大小,就可以控制 label assignment 的质量。
在FCOS
等使用了 Anchor free 方法的网络中,label assignment 通过计算目标中心区域和目标的尺度之间的趋近程度确定样本的正负。再加上 FPN 的多尺度测量,通过框的尺度大小划分其在FPN的哪一个层,即尺度大的在最顶层,尺度小的在最底层的位置。
目前的 label assignment 主要需要在两个维度上涉及分配的策略:
- 一个是空间维度 spatial,主要用于划分每个空间区域对应的目标;
- 一个是在FPN中的尺度维度 scale,通过在多尺度输出层面上的计算,确定目标对应的尺度层。
通过对 label assignment 的研究,得到了 FCOS/CenterNet、Free Anchor/ATSS、PAA/AutoAsign 和 IQDet/OTA
等一系列的成果。
2.2.1 FCOS/CenterNet
最开始使用 Anchor free 时,研究人员使用 手工设定分配规则(中心先验),
如 FCOS/CenterNet
,FCOS
设定中心点附近的 3*3 邻域为正样本,CenterNet
只设定中心点为正样本,其他区域为负样本等。手工设置的方式十分高效,但是该方法存在泛化能力较差的问题,当网络需要预测的目标物属于新目标或者网络的结构发生变化(导致感受野有变化)时,网络的性能会大幅度下降。
2.2.2 Free Anchor/ATSS
Free Anchor/ATSS
方法为了解决手工设定分配规则的问题,采用了动态匹配策略(Loss aware),使用每个样本对目标做一个预测,然后评判 该预测的结果和真实结果之间的差距(使用 回归 + 分类 loss 来决定)。Loss 的结果越小时,预测的质量会越高 ,以此来判断样本是否为正样本。该方法的好处主要有可以根据网络的自身的分布进行动态调整;同时,当检测不同目标时也具备一定的自适应能力。
2.2.3 PAA/AutoAsign
在Free Anchor/ATSS
的基础上,又出现了更加高效的自适应动态匹配方法,如PAA/AutoAsign策略
,之前样本应该分配多少个,应该按什么阈值分,还是需要人为规则。而这类方法的标签匹配全部由网络决定,不再需要手工设定参数。
2.2.4 IQDet/OTA
在 PAA/AutoAsign
之后,还出现了 IQDet/OTA
,对 label assignment 做出了进一步的完善。PAA/AutoAsign
及之前的匹配方法是 针对单一目标的,但是 当多个目标之间的重叠部分较多时,预测框会出现在两个目标的中间区域或者歧义区域,这时候需要 全局的动态匹配,所以出现了 OTA,OTA在全局的角度上规划目标的归属。期望全图的分配最优。
这里所谓的中心先验:就是真实框的中心区域作为正样本。
所谓的 Loss aware 的 动态匹配策略:就是根据 预测的框和真实框的 loss 来动态的分配正负样本。
三、 YOLOX介绍
3.1 YOLOX 核心部件介绍
YOLOX
的目标是在 YOLO系列
的基础上吸收近年来目标检测学术界的最新成果,同时继承 YOLO 系列容易部署的特点。同时需要在避免过拟合 COCO 的基础上,适度调参,以及在参数设置公平的条件下和 YOLO 系列做对比。
YOLOX 的设计路线主要为:以 YOLOv3
作为模型的 baseline( YOLOv3 网络中使用的算子更加简单,应用范围更加广)。YOLOv4、v5 在 anchor-based 方法上做了大量优化,这些优化不知道对 anchor-free 是否有效不知道。
YOLOv3 U 版优化已经很好,YOLOX 设计 Decoupled Head、Data Aug(用的v5的)、Anchor Free 以及 SimOTA 部件
。
3.1.1 Decoupled Head
原来的 YOLO系列
都采用了一个耦合在一起的检测头,同时进行分类、回归的检测任务(参数更小)。YOLOX
在结构上采用了 Decoupled Head(从 RetinaNet 后就被广泛应用) ,将特征平行分成两路卷积特征,同时为了降低参数量提前进行了降维处理,其好处在于:在检测的过程中 分类需要的特征
和 回归所需要的特征
往往不同,所以在 Decoupled Head 中进行解耦处理后,特征的学习的过程会变得更加简单。(就是学得快,收敛快)
从 Decoupled Head 结构图中的左下角可以看到采用了Decoupled Head后,网络的收敛速度在训练早期要明显快于 YOLO head 。性能有一点提升,也可能是加的两层 conv 导致的。
右下角,普通的 YOLO 性能有一点提升,也可能是加的两层 conv 导致的。End2End YOLO(不需要做NMS,输出就是检测框),解耦 head 掉的更少,说明很合理。加了 1ms 时间。
3.1.2 Data Aug
在 Data Aug 中,masic 将先选择一张图然后再随机选择三张图再将其四张图拼接成一张,然后进行 scale 适量的放缩。Mixup 将两张图覆盖到一起。
谷歌 copy-past 论文中,将目标按分割图抠出来,然后粘贴到图像中,会对目标进行一定的缩放。YOLOX 中的 Mixup 相对于原始的 Mixup 也带 scale 缩放,相对原版 Mixup 更强。
YOLOX
中,在训练的最后 15 epoch 会关闭 masic+Mixup,带来性能的提升。原因:增强后的图片和真实中的不一样,关闭后在自然场景下让模型收敛。
3.1.3 Anchor Free & Label Assign
从原来 YOLO系列 的 anchor based 方法切换到 anchor free 的操作是比较简单的(把 anchor 去掉,让预测从 anchor point 出发做直接预测)。
但是, anchor free 的方法的性能 对于 label assign 的策略选取非常相关。
- 中心先验:选择目标中心区域当正样本
- 动态匹配:根据 loss 动态分配正负样本,loss 越小,说明这个样本对于目标预测的效果更好,应该是正样本。
- 不同目标设定不同数量的正样本。不同类的目标可能需要的正样本数目不一样,比如蚂蚁很小,可能需要的正样本就少。这也是动态的。
- 处理歧义的样本,全局信息。
我们根据自己的经验和积累,最终在 OTA 方法(CVPR 2021) 的基础上(训练速度会变慢)进行了简化,提出了 SimOTA 的标签分配策略。
SimOTA
SimOTA的流程如下:
(1) 确定正样本候选区域(使用中心先验)在空间尺度上,先选定每一个中心的区域作为候选区域);
(2) 计算每个样本对每个GT的 Reg+Cls loss(loss aware),计算候选区域的样本和GT之间的loss,作为loss aware的计算过程,得到 Reg+Cls loss的结果;
(3) 使用每个 GT 的预测样本确定它需要分配到的正样本数(Dynamic_k)中的 k 值等于多少,其中操作为:
- 获取于当前GT的iou前10的样本;
- 将这top10的样本的iou求和取整,为当前GT的 dynamic_k,dynamic_k,最小保证为1。
- 此外,作者发现iou取前10个数字对结果影响较小,并且在5-15之间取值,结果的影响差距比较小。
(4) 舍去全局优化求解过程,只为每个 GT 取loss最小的前 dynamic_k 个样本作为正样本;
(5) 人工去掉同一个样本被分配到多个 GT 的正样本的情况(全局信息)。
SimOTA 与 OTA 前三步 一样,第 4,5 步做了简化,没用做全局的优化求解。因此比 OTA 的运算速度更快,训练时间更短,不需要额外的优化参数步骤,同时保证了精度在绝大多数数据集(比如COCO 这种遮挡不严重的)下和 OTA 区别不大。
3.2 YOLOX实验结果
在实验部分,YOLOX与YOLO系列在参数公平的条件下进行了对比,实验结果如图所示。可以发现:
-
YOLOX-L
和当前YOLO系列最先进的YOLOv5-L
相比,二者参数量大概相当的条件下,YOLOX-L
在COCO上取得50.0%AP(比YOLOv5-L
高出1.8%的AP),且YOLOX-L
在单张Tesla V100上能达到68.9FPS。 -
YOLOX-Tiny
和YOLOX-Nano
对比,YOLOX
在参数量很小的条件下(只有0.91M参数量和1.08G FLOPs)比对应的YOLOv4-Tiny
和NanoDet3
分别高出10% AP和1.8% AP。
此外,YOLOX还在 2021 Streaming Pereception Challenge 的比赛中,取得了良好的成绩。
3.3 YOLOX使用建议
用户在使用YOLOX模型时,应该注意:
- (1)需要针对自己的数据集,选取合适的模型;
- (2)需要加载COCO预训练模型;
- (3)训练优化参数时,可以先用默认设定跑一次,看情况优先调整 lr 和 max epoch;
- (4)调整Aug的参数时:小模型要 弱化Aug的强度,大模型可以继续 加强Aug。
3.4 YOLOX开源与部署
最后,作者介绍了 YOLOX
的代码目前已经支持MegEngine、TensorRT、ONNX、OpenVino和ncnn
的部署,其中以MegEngine
表现最好,FP32的推理速度相比TensorRT、ncnn
可以达到平均快7%-8%的优异表现。
MegEngine版:https://github.com/MegEngine/YOLOX
Pytorch版:https://github.com/Megvii-BaseDetection/YOLOX