深入浅出Yolo系列之Yolox核心基础完整讲解
在Yolov4、Yolov5刚出来时,大白就写过关于Yolov3、Yolov4、Yolov5的文章,并且做了一些讲解的视频,反响都还不错。
而从2015年的Yolov1,2016年Yolov2,2018年的Yolov3,再到2020年的Yolov4、Yolov5,Yolo系列也在不断的进化发展。
就在大家质疑,Yolo如何进一步改进时,旷视科技发表了研究改进的Yolox算法。
大白对于Yolox文章和相关的代码,进行了学习,发现有很多改进的方式。
比如Decoupled Head、SimOTA等方式,效果还是非常不错的,很值得借鉴。
但因为很难直接可视化的学习,了解Yolox和之前Yolo相关算法的区别。
因此本文,大白对Yolox的一些细节,和之前的Yolov3、Yolov4、Yolov5算法对比,进行深入浅出的分析讲解,和大家一些探讨学习。
1 Yolov3&Yolov4&Yolov5相关资料1.1 Yolov3相关资料1.2 Yolov4相关资料1.3 Yolov5相关资料2 Yolox相关基础知识点2.1 Yolox的论文及代码2.2. Yolox个版本网络结构图2.2.1 Netron工具2.2.2 各个Yolox的onnx文件2.2.3 各个Yolox网络结构图3 Yolox核心知识点3.1 Yolov3&Yolov4&Yolov5网络结构图3.2 Yolox基础知识点3.2.1 基准模型:Yolov3_spp3.2.2 Yolox-Darknet533.2.3 Yolox-s、l、m、x系列3.2.4 轻量级网络研究4 深入浅出Yolox之自有数据集训练5 不同的落地模型部署方式6 后续更新ing7 相关推荐:数据集分类下载
1 Yolov3&Yolov4&Yolov5相关资料
在了解Yolox之前,我们首先要对之前的一些Yolo算法,比如Yolov3、Yolov4、Yolov5进行了解。
因为Yolox很多的网络结构,都是在其基础上,延伸而来的。
比如Yolox-Darknet53,就是在Yolov3的基础上进行的改进。
而Yolox-s、Yolox-l等网络,就是在Yolov5-s、Yolov5-l等网络的基础上,进行的改进。
所以大白将之前整理的,Yolo相关文章和视频,进行汇总。有需要的同学,可以先进行了解。
① Yolov3相关资料
【视频】:深入浅出Yolov3(上)、深入浅出Yolov3(下)
② Yolov4相关资料
【视频】:深入浅出Yolov4(上)、深入浅出Yolov4(下)【文章】:《深入浅出Yolo系列之Yolov3&4核心基础知识完整讲解》③ Yolov5相关资料
【文章】:《深入浅出Yolo系列之Yolov5核心基础知识完整讲解》
④ Yolox相关资料
注意:因无法直接放文章或视频外链,可点击最下方,阅读原文进行查看。
2 Yolox相关基础知识点
2.1 Yolox的论文及代码
Yolox论文名:《YOLOX: Exceeding YOLO Series in 2021》
Yolox论文地址:https://arxiv.org/abs/2107.08430
Yolox代码地址:https://github.com/Megvii-BaseDetection/YOLOX
2.2 Yolox各版本网络结构图
想学习一个算法,最好从直观图示的角度,进行了解。
如果纯粹从代码上进行查看,很可能会一头雾水。
而且Yolox的各种网络结构也很多,比如下面的各个网络结构权重文件。
因此可以采用,将各个模型文件转换成onnx格式,再用netron工具打开的方式,对网络结构进行可视化学习。
注意:以上所有模型,可点击最下方,阅读原文,查看下载。
2.2.1 Netron工具
如果有同学对netron工具还不是很熟悉,这里还是放上netron工具安装的详细流程。
可以移步大白的另一篇文章:《网络可视化工具netron详细安装流程》。
https://blog.csdn.net/nan355655600/article/details/106245563
2.2.2 各个Yolox的onnx文件
各个onnx文件,可以采用代码中的,tools/export_onnx.py脚本,进行转换。
此外,官方代码中的这个版块,已经转换好了各个版本的onnx,也可以直接下载使用。
2.2.3 各个Yolox网络结构图
不过考虑到,有些同学可能不方便,使用netron查看。
因此,大白也上传了使用netron打开的,每个网络结构图的图片,也可以直接查看。
(1)Yolox-Nano
Yolox-Nano是Yolox系列最小的结构,网络参数只有0.91M。
此处放上netron打开的,Yolox-Nano网络结构可视图的地址,点击查看。
https://blog.csdn.net/nan355655600/article/details/119329864
(2)Yolox-Tiny
此处放上Yolox-Tiny网络结构可视图的地址,点击查看。
https://blog.csdn.net/nan355655600/article/details/119329848
(3)Yolox-Darknet53
Yolox-Darknet53是在Yolov3的基础上,进行的改进,也是后面主要介绍的网络结构。
此处放上Yolox-Darknet53网络结构可视图的地址,点击查看。
https://blog.csdn.net/nan355655600/article/details/119329834
(4)Yolox-s
Yolox-s是在Yolov5-s的基础上,进行的改进,也是后面主要介绍的网络结构。
此处放上Yolox-s网络结构可视图的地址,点击查看。
https://blog.csdn.net/nan355655600/article/details/119329727
(5)Yolox-m
此处放上Yolox-m网络结构可视图的地址,点击查看。
https://blog.csdn.net/nan355655600/article/details/119329801
(6)Yolox-l
此处放上Yolox-l网络结构可视图的地址,点击查看。
https://blog.csdn.net/nan355655600/article/details/119329801
(7)Yolox-x
此处放上Yolox-x网络结构可视图的地址,点击查看。
https://blog.csdn.net/nan355655600/article/details/119329818
3 Yolox核心知识点
3.1 Yolov3&Yolov4&Yolov5网络结构图
在学习Yolox之前,我们先了解一下Yolov3、Yolov4、Yolov5的网络结构图,而后面的Yolox网络,都是在此基础上延伸而来的。
① Yolov3网络结构图
Yolov3是在2018年提出,也是工业界使用非常广泛的目标检测算法。
不过在Yolox系列中的,Yolox-Darknet53模型,采用的Baseline基准网络,采用的并不是Yolov3版本,而是改进后的Yolov3_spp版本。
而Yolov3和Yolov3_spp的不同点在于,Yolov3的主干网络后面,添加了spp组件,这里需要注意。
② Yolov4网络结构图
上图是DarknetAB大神,在2020年提出的Yolov4算法。
在此算法中,网络的很多地方,都进行了改进。
比如输入端:采用Mosaic数据增强;
Backbone:采用了CSPDarknet53、Mish激活函数、Dropblock等方式;
Neck:采用了SPP(按照DarknetAB的设定)、FPN+PAN结构;
输出端:采用CIOU_Loss、DIOU_Nms操作。
因此可以看出,Yolov4对Yolov3的各个部分,都进行了很多的整合创新。
关于Yolov4,如果有不清楚的,可以参照大白之前写的《深入浅出Yolo系列之Yolov3&Yolov4核心基础知识完整讲解》,写的比较详细。
③ Yolov5网络结构图
而在Yolov5网络中,和Yolov4不同,最大的创新点在于,作者将网络结构,做成了可选择配置的方式。
比如主干网络结构,根据各个网络的宽度、高度不同,可以分为Yolov5s、Yolov5l、Yolov5s、Yolo5x等版本。
这种转变,在目标检测领域,引领了一股网络拆分的热潮。
本文的Yolox算法,也从这个角度出发,将Yolox模型,变为多种可选配的网络,比如标准网络结构和轻量级网络结构。
(1)标准网络结构:Yolox-s、Yolox-m、Yolox-l、Yolox-x、Yolox-Darknet53。
(2)轻量级网络结构:Yolox-Nano、Yolox-Tiny。
在实际的项目中,大家可以根据不同项目需求,进行挑选使用。
3.2 Yolox基础知识点
从上面的描述中,我们可以知道Yolox整体的改进思路:
(1)基准模型:Yolov3_spp
选择Yolov3_spp结构,并添加一些常用的改进方式,作为Yolov3 baseline基准模型;
(2)Yolox-Darknet53
对Yolov3 baseline基准模型,添加各种trick,比如Decoupled Head、SimOTA等,得到Yolox-Darknet53版本;
(3)Yolox-s、Yolox-m、Yolox-l、Yolox-x系列
对Yolov5的四个版本,采用这些有效的trick,逐一进行改进,得到Yolox-s、Yolox-m、Yolox-l、Yolox-x四个版本;
(4)轻量级网络
设计了Yolox-Nano、Yolox-Tiny轻量级网络,并测试了一些trick的适用性;
总体来说,论文中做了很多的工作,下面和大家一起,从以上的角度,对Yolox算法的网络结构,以及各个创新点进行讲解。
3.2.1 基准模型:Yolov3_spp
在设计算法时,为了对比改进trick的好坏,常常需要选择基准的模型算法。
而在选择Yolox的基准模型时,作者考虑到:
Yolov4和Yolov5系列,从基于锚框的算法角度来说,可能有一些过度优化,因此最终选择了Yolov3系列。
不过也并没有直接选择Yolov3系列中,标准的Yolov3算法,而是选择添加了spp组件,进而性能更优的Yolov3_spp版本。
以下是论文中的解释:
Considering YOLOv4 and YOLOv5 may be a little over-optimized for the anchor-based pipeline, we choose YOLOv3 [25] as our start point (we set YOLOv3-SPP as the default YOLOv3)。
为了便于大家理解,大白在前面Yolov3结构图的基础上,添加上spp组件,变为下图所示的Yolov3_spp网络。
大家可以看到,主干网络Backbone后面,增加了一个SPP组件。
当然在此基础上,对网络训练过程中的很多地方,都进行了改进,比如:
(1)添加了EMA权值更新、Cosine学习率机制等训练技巧
(2)使用IOU损失函数训练reg分支,BCE损失函数训练cls与obj分支
(3)添加了RandomHorizontalFlip、ColorJitter以及多尺度数据增广,移除了RandomResizedCrop。
在此基础上,Yolov3_spp的AP值达到38.5,即下图中的Yolov3 baseline。
不过在对上图研究时,有一点点小疑惑:
YOLOv3_ultralytics的AP值为44.3,论文中引用时,说是目前Yolov3_spp算法中,精度最好的版本。(the current best practice of YOLOv3)。
接着对此代码进行查看,发现正如论文中所说,增加了很多trick的Yolov3_spp版本,AP值为44.3。
而Yolox的基准模型,是最原始的Yolov3_spp版本,经过一系列的改进后,AP值达到38.5。
在此基础上,又增加了Strong augmentation、Decoupled head、anchor-free、multi positives、SimOTA,等5种trick,最终达到了AP47.3。
但存在疑惑的是?
如果直接采用YOLOv3_ultralytics的Yolov3_spp版本,再增加上面的4种trick(除掉strong augmentation,因为代码中已经改进了),是否会有更好的AP提升?
3.2.2 Yolox-Darknet53
我们在前面知道,当得到Yolov3 baseline后,作者又添加了一系列的trick,最终改进为Yolox-Darknet53网络结构。
上图即是Yolox-Darknet53网络结构图。
为了便于分析改进点,我们对Yolox-Darknet53网络结构进行拆分,变为四个板块:
① 输入端:Strong augmentation数据增强
② BackBone主干网络:主干网络没有什么变化,还是Darknet53。
③ Neck:没有什么变化,Yolov3 baseline的Neck层还是FPN结构。
④ Prediction:Decoupled Head、End-to-End YOLO、Anchor-free、Multi positives。
在经过一系列的改进后,Yolox-Darknet53最终达到AP47.3的效果。
下面我们对于Yolox-Darknet53的输入端、Backbone、Neck、Prediction四个部分,进行详解的拆解。
3.2.2.1 输入端
(1)Strong augmentation① Mosaic数据增强Mosaic增强的方式,是U版YOLOv3引入的一种非常有效的增强策略。而且在Yolov4、Yolov5算法中,也得到了广泛的应用。通过随机缩放、随机裁剪、随机排布的方式进行拼接,对于小目标的检测效果提升,还是很不错的。
② MixUp数据增强MixUp是在Mosaic基础上,增加的一种额外的增强策略。主要来源于2017年,顶会ICLR的一篇论文《mixup: Beyond Empirical Risk Minimization》。当时主要应用在图像分类任务中,可以在几乎无额外计算开销的情况下,稳定提升1个百分点的分类精度。而在Yolox中,则也应用到目标检测中,代码在yolox/datasets/mosaicdetection.py这个文件中。
3.2.2.2 Backbone
Yolox-Darknet53的Backbone主干网络,和原本的Yolov3 baseline的主干网络都是一样的。3.2.2.3 Neck
在Neck结构中,Yolox-Darknet53和Yolov3 baseline的Neck结构,也是一样的,都是采用FPN的结构进行融合。如下图所示,FPN自顶向下,将高层的特征信息,通过上采样的方式进行传递融合,得到进行预测的特征图。
3.2.2.4 Prediction层
在输出层中,主要从四个方面进行讲解:Decoupled Head、Anchor Free、标签分配、Loss计算。(1)Decoupled Head我们先来看一下Decoupled Head,目前在很多一阶段网络中都有类似应用,比如RetinaNet、FCOS等。而在Yolox中,作者增加了三个Decoupled Head,俗称“解耦头”大白这里从两个方面对Decoupled Head进行讲解:① 为什么使用Decoupled Head?② Decoupled Head的细节?
① 为什么使用Decoupled Head?在了解原理前,我们先了解下改进的原因。为什么将原本的Yolo head,修改为Decoupled Head呢?我们先看一张论文中的表格:
曲线表明:Decoupled Head的收敛速度更快,且精度更高一些。但是需要注意的是:将检测头解耦,会增加运算的复杂度。因此作者经过速度和性能上的权衡,最终使用 1个1x1 的卷积先进行降维,并在后面两个分支里,各使用了 2个3x3 卷积,最终调整到仅仅增加一点点的网络参数。而且这里解耦后,还有一个更深层次的重要性:Yolox的网络架构,可以和很多算法任务,进行一体化结合。比如:(1)YOLOX + Yolact/CondInst/SOLO ,实现端侧的实例分割。(2)YOLOX + 34 层输出,实现端侧人体的 17 个关键点检测。
② Decoupled Head的细节?了解了Decoupled Head的来源,再看一下Decoupled Head的细节。我们将Yolox-Darknet53中,Decoupled Head①提取出来,经过前面的Neck层,这里Decouple Head①输入的长宽为20*20。
(2)Anchor-free这里就要引入Anchor的内容,目前行业内,主要有Anchor Based和Anchor Free两种方式。在Yolov3、Yolov4、Yolov5中,通常都是采用Anchor Based的方式,来提取目标框,进而和标注的groundtruth进行比对,判断两者的差距。
① Anchor Based方式比如输入图像,经过Backbone、Neck层,最终将特征信息,传送到输出的Feature Map中。这时,就要设置一些Anchor规则,将预测框和标注框进行关联。从而在训练中,计算两者的差距,即损失函数,再更新网络参数。比如在下图的,最后的三个Feature Map上,基于每个单元格,都有三个不同尺寸大小的锚框。
② Anchor Free方式而Yolox-Darknet53中,则采用Anchor Free的方式。我们从两个方面,来对Anchor Free进行了解。a.输出的参数量我们先计算下,当得到包含目标框所有输出信息时,所需要的参数量?这里需要注意的是:最后黄色的85*8400,不是类似于Yolov3中的Feature Map,而是特征向量。
b.Anchor框信息在前面Anchor Based中,我们知道,每个Feature map的单元格,都有3个大小不一的锚框。那么Yolox-Darknet53就没有吗?其实并不然,这里只是巧妙的,将前面Backbone中,下采样的大小信息引入进来。
(3)标签分配当有了8400个Anchor锚框后,这里的每一个锚框,都对应85*8400特征向量中的预测框信息。不过需要知道,这些预测框只有少部分是正样本,绝大多数是负样本。那么到底哪些是正样本呢?这里需要利用锚框和实际目标框的关系,挑选出一部分适合的正样本锚框。比如第3、10、15个锚框是正样本锚框,则对应到网络输出的8400个预测框中,第3、10、15个预测框,就是相应的正样本预测框。训练过程中,在锚框的基础上,不断的预测,然后不断的迭代,从而更新网络参数,让网络预测的越来越准。那么在Yolox中,是如何挑选正样本锚框的呢?这里就涉及到两个关键点:初步筛选、SimOTA。
① 初步筛选初步筛选的方式主要有两种:根据中心点来判断、根据目标框来判断;这部分的代码,在models/yolo_head.py的get_in_boxes_info函数中。a. 根据中心点来判断:规则:寻找anchor_box中心点,落在groundtruth_boxes矩形范围的所有anchors。比如在get_in_boxes_info的代码中,通过groundtruth的[x_center,y_center,w,h],计算出每张图片的每个groundtruth的左上角、右下角坐标。
b.根据目标框来判断:除了根据锚框中心点,和groundtruth两边距离判断的方式外,作者还设置了根据目标框判断的方法。规则:以groundtruth中心点为基准,设置边长为5的正方形,挑选在正方形内的所有锚框。同样在get_in_boxes_info的代码中,通过groundtruth的[x_center,y_center,w,h],绘制了一个边长为5的正方形。
② 精细化筛选而在精细化筛选中,就用到论文中提到的SimOTA了:
a.初筛正样本信息提取初筛出的1000个正样本锚框的位置,我们是知道的。而所有锚框的位置,和网络最后输出的85*8400特征向量是一一对应。所以根据位置,可以将网络预测的候选检测框位置bboxes_preds、前景背景目标分数obj_preds、类别分数cls_preds等信息,提取出来。
b.Loss函数计算针对筛选出的1000个候选检测框,和3个groundtruth计算Loss函数。计算的代码,也在yolo_head.py的get_assignments函数中。首先是位置信息的loss值:pair_wise_ious_loss
c.cost成本计算有了reg_loss和cls_loss,就可以将两个损失函数加权相加,计算cost成本函数了。这里涉及到论文中提到的一个公式:
d.SimOTA 有了上面的一系列信息,标签分配问题,就转换为了标准的OTA问题。但是经典的Sinkhorn-Knopp算法,需要多次迭代求得最优解。作者也提到,该算法会导致25%额外训练时间,所以采用一种简化版的SimOTA方法,求解近似最优解。这里对应的函数,是get_assignments函数中的self.dynamic_k_matching:
第二步:通过cost挑选候选框下面再通过topk_ious的信息,动态选择候选框,这里是个关键。代码如dynamic_k_matching函数中,下图所示:
第三步:过滤共用的候选框不过在分析matching_matrix时,我们发现,第5列有两个1。这也就说明,第五列所对应的候选框,被目标检测框1和2,都进行关联。因此对这两个位置,还要使用cost值进行对比,选择较小的值,再进一步筛选。
经过第三行代码,可以找到最小的值是0.3,即cost_min为0.3,所对应的行数,cost_argmin为2。
(4)Loss计算经过第三部分的标签分配,就可以将目标框和正样本预测框对应起来了。下面就可以计算两者的误差,即Loss函数。计算的代码,位于yolo_head.py的get_losses函数中。
② 方案二:Yolox-s+数据增强+(obj_output的Loss函数,改为FocalLoss)
3.2.3 Yolox-s、l、m、x系列
在对Yolov3 baseline进行不断优化,获得不错效果的基础上。作者又对Yolov5系列,比如Yolov5s、Yolov5m、Yolov5l、Yolov5x四个网络结构,也使用一系列trick进行改进。先来看一下,改进了哪些地方?我们主要对Yolov5s进行对比,下图是Yolov5s的网络结构图:3.2.4 轻量级网络研究
在对Yolov3、Yolov5系列进行改进后,作者又设计了两个轻量级网络,与Yolov4-Tiny、和Yolox-Nano进行对比。在研究过程中,作者有两个方面的发现,主要从轻量级网络,和数据增强的优缺点,两个角度来进行描述。3.2.4.1 轻量级网络
因为实际场景的需要,很多同学想将Yolo移植到边缘设备中。因此作者针对Yolov4-Tiny,构建了Yolox-Tiny网络结构。针对FCOS 风格的NanoDet,构建了Yolox-Nano网络结构。3.2.4.2 数据增强的优缺点
在Yolox的很多对比测试中,都使用了数据增强的方式。但是不同的网络结构,有的深有的浅,网络的学习能力不同,那么无节制的数据增强是否真的更好呢?作者团队,对这个问题也进行了对比测试。② Scale 增强策略在Mosaic数据增强中,代码Yolox/data/data_augment.py中的random_perspective函数,生成仿射变换矩阵时,对于图片的缩放系数,会生成一个随机值。
3.3 Yolox的实现成果
3.3.1 精度速度对比
前面我们了解了Yolox的各种trick改进的原因以及原理,下面我们再整体看一下各种模型精度速度方面的对比:从左面的图片可以得出:(1)和与Yolov4-CSP相当的Yolov5-l进行对比,Yolo-l在COCO数据集上,实现AP50%的指标,在几乎相同的速度下超过Yolov5-l 1.8个百分点。(2)而Yolox-Darknet53和Yolov5-Darknet53相比,实现AP47.3%的指标,在几乎同等速度下,高出3个百分点。
而从右面的图片可以得出:(1)和Nano相比,Yolox-Nano参数量和GFLOPS都有减少,参数量为0.91M,GFLOPS为1.08,但是精度可达到25.3%,超过Nano1.8个百分点。(2)而Yolox-Tiny和Yolov4-Tiny相比,参数量和GFLOPS都减少的情况下,精度远超Yolov4-Tiny 9个百分点。
3.3.2 Autonomous Driving竞赛
在CVPR2021自动驾驶竞赛的,Streaming Perception Challenge赛道中,挑战的主要关注点之一,是自动驾驶场景下的实时视频流2D目标检测问题。由一个服务器收发图片和检测结果,来模拟视频流30FPS的视频,客户端接收到图片后进行实时推断。竞赛地址:https://eval.ai/web/challenges/challenge-page/800/overview4 深入浅出Yolox之自有数据集训练
因为Yolox的代码,和之前的Yolov3、Yolov4、Yolov5版本还是有很多不同的地方。很多同学可能对于如何利用自有数据集训练?还是有些疑惑。因此大白另外也写了一篇《深入浅出Yolox之自有数据集训练》的文章。利用教室场景中,人头部标注的数据集,和大家一起一步步训练。文章链接:《深入浅出Yolox之自有数据集训练超详细教程》5 不同的落地模型部署方式
当模型训练好,需要在项目中进行部署时。作者在代码中,还贴心的整理了各种版本的部署方式:6 后续更新ing
当然在Yolox的代码中,大白发现旷视作者的工作,还是不断改进中。后期也会推出很多改进的工作。7 相关推荐:数据集分类下载
当然除了训练中使用到的人头数据集,在大白网站的数据集下载版块,还整理了数百种,不同类型的数据集:牛津大学提出PSViT | Token池化+Attention Sharing让Transformer模型不在冗余!!!
YOffleNet | YOLO V4 基于嵌入式设备的轻量化改进设计
详细解读GraphFPN | 如何用图模型提升目标检测模型性能?
长按扫描下方二维码添加小助手并加入交流群,群里博士大佬云集,每日讨论话题有目标检测、语义分割、超分辨率、模型部署、数学基础知识、算法面试题分享的等等内容,当然也少不了搬砖人的扯犊子
长按扫描下方二维码添加小助手。
可以一起讨论遇到的问题
声明:转载请说明出处
扫描下方二维码关注【集智书童】公众号,获取更多实践项目源码和论文解读,非常期待你我的相遇,让我们以梦为马,砥砺前行!