Yolo系列目标检测算法知识点总结_程大海的博客-CSDN博客_yolo系列目标检测算法
Anchor-Free系列之CenterNet:Objects as Points_程大海的博客-CSDN博客
Anchor-Free系列之FCOS:A Simple and Strong Anchor-free Object Detector_程大海的博客-CSDN博客
Anchor-Free系列之YOLOX:Exceeding YOLO Series in 2021_程大海的博客-CSDN博客
YOLOX训练自有数据集_程大海的博客-CSDN博客
参考:如何评价旷视开源的YOLOX,效果超过YOLOv5? - 知乎
参考:深入浅出Yolo系列之Yolox核心基础完整讲解 - 知乎
参考:深入浅出Yolox之自有数据集训练超详细教程 - 知乎
参考:YOLOX深度解析 - 知乎
YoloX是在YoloV3、YoloV5的基础上,配合最近几年目标检测领域比较有效的方法,如Head Decoupled、Data Augmentation、Anchro-Free、Label Assign等。
YoloX技术要点:
1、Head Decoupled(单头 -> 多头)
decoupled-head实验结论:
使用decoupled-head可以带来两个方面的好处:
这里插播一下关于目标检测使用单个预测头、多个预测头、预测头使用FC还是使用卷积的相关研究,我主要看了下面这篇论文:
《Rethinking Classification and Localization for Object Detection》
起因
作者经过深入分析发现,对于目标检测算法通常使用的基于全连接层的预测头fc-head,基于卷积层的预测头conv-head,在处理分类任务和坐标回归任务时,表现的效果相反。Fc-head的预测头更适用于预测输出目标的类别置信度,conv-head的预测头更适用于预测输出目标的bounding box坐标框。
鉴于上述观察结果,作者设计了具有双预测头的目标检测算法Double-Head,其中fc-head主要负责预测目标的类别概率置信度,conv-head主要负责预测目标的bounding box坐标。并在此基础上进一步演化出了Double-Head-Ext算法,让fc-head在主要负责预测输出类别概率的同时,辅助预测目标的bounding box,让conv-head在主要负责预测输出目标bounding box坐标的同时,辅助预测目标的类别置信度。
Backbone: 使用FPN网络作为backbone,上层使用RPN网络生成proposal,在proposal的基础上使用RoIAlign(详见Mask-RCNN),将每个proposal的区域生成7x7x256的feature map,然后分别送入fc-head和conv-head,经过fc-head和conv-head之后,最终输出1024位的特征向量,然后在特征向量上预测输出每个proposal的类别置信度和bounding box
fc-head:在proposal经过RoIAlign之后得到的256x7x7的feature map上,使用两个全连接层,输出得到1024维的特征向量
conv-head:在proposal经过RoIAlign之后得到的256x7x7的feature map上,堆叠使用多个residual block残差模块,最后使用avg pooling,输出得到1024维的特征向量
损失函数:
Double-Head预测结果融合:
基于fc-head和conv-head预测输出的目标类别置信度,综合得到最终的置信度。
效果:
好了, 继续回到YOLOX的技术要点上来。
2、Data Augmentation(数据增强)
Mixup:数据增强之MixUp_程大海的博客-CSDN博客_数据增强mixup代码
Mosaic:关于马赛克数据增强方法,可以参考“江大白”的YOLO系列讲解,讲的非常好。
备注:关于Mixup和Mosaic数据增强方法,作者在论文中说要在训练的最后15个epoch关闭Mixup和Mosaic,关于这个问题,在旷视科技官方知乎账号上给出了如下解释:
以上回答意思就是说,当使用了Mixup和Mosaic数据增强方法,会对输入的原始图片进行较大的变化(叠加、裁剪、粘贴等),导致输入到网络模型的图片数据与真实场景的图片数据偏差较大,导致数据的分布不一致,影响模型的泛化性能。关于这个问题,我自己在实际使用Mixup方法,以及使用自有数据集训练YOLOX时也有如下两点发现:
1、使用Mixup数据增强训练分类模型时,Loss值和Accuracy震荡很厉害,模型的Loss很快就基本上不下降了
2、在使用YOLOX训练自有数据集时,在最后15个epoch关闭Mixup和Mosaic之后,验证集上的mAP指标直线上升4-5个百分点。如下图所示:
所以在训练的最后阶段,关闭Mixup和Mosaic确实可以提升模型性能。让模型在前期经历各种磨难(Mixup+Mosaic),努力学习去做各种难题、怪题,在后期学有所成之后,开始接触真正的三年模拟,五年真题,在真实战场上一展身手。
3、Anchor-Free(无锚框)
关于anchor-based目标检测方法的一些缺点,可以参考Anchor-Free系列之FCOS:A Simple and Strong Anchor-free Object Detector_程大海的博客-CSDN博客
参考CornerNet、CenterNet等anchor-free方法,YoloX放弃使用anchor,在输出特征图上的每个位置直接预测4个数值结果,用来确定相对于当前位置,目标的top-left和bottom-right corner的偏移量offset
4、Multi positives
YoloX放弃使用anchor,然后将目标的中心点位置作为唯一的positive,其余均为negative,这样会导致大量的正负样本不均衡(CornetNet和CenterNet中采用Focal Loss),同时也会忽略那些预测结果稍微不完美(预测的中心点稍微偏离)的结果,参考CornerNet、CenterNet、FCOS等anchor-free的方法,YoloX在目标的中心划定一个范围,范围内的位置均代表目标的中心,都是positive,这样可以将AP从42.9%大幅提升到45%
5、Label Asign(标签分配)
参考:CVPR 2021论文解读Vol.4 | OTA: 依靠最优传输理论提升标签分配质量的一阶段目标检测算法 - 知乎
参考:YOLOX深度解析(二)-simOTA详解 - 知乎
参考:目标检测: 一文读懂 OTA 标签分配_大林兄的博客-CSDN博客_ota目标检测
常见目标检测算法采用的标签分配方式:
Two-Stage:
Faster RCNN:在Faster RCNN中,计算anchor box和ground truth之间的IoU来确定anchor box归属于那个ground truth,IoU > 0.7为positive,IoU<0.3为negative,其余的舍弃,当一个anchor box同时两个ground truth满足IoU>0.7时,选择IoU值大的那个ground truth。
One-Stage:
RetinaNet/YoloV3: 每个anchor按照与ground truth的IoU值分配一个label,与Faster R-CNN中RPN不同的是,由于是一阶段的目标检测方法,此处的anchor与具体的类别标签相关联,Faster R-CNN中的RPN的anchor只是被简单的分类为前景、背景。
Anchor-Free:
CornerNet:
CenterNet:
FCOS:
当一张图片上的两个目标之间存在重叠时,目标的center location中心点相互靠近,经过multi-positive之后,在那两个目标的中心点附近都选了一组positive,由于两个目标中心离的很近,就导致选择的两组positive之间存在重合的情况,那么如何确定重合的positive位置到底属于哪个目标?如何对重合的positive进行划分?在Faster RCNN等算法是选择IoU更大的那个,FCOS算法是将positive用来预测box面积小的那个目标,并且FCOS算法对FPN的每个层级特征图负责预测目标的大小做了限制,这样就显著降低了在一张图片上两个重叠的目标出现在FPN同一层级特征上的概率,通过这种方式来缓解positive分配的问题。
相比于Faster RCNN和FCOS等方法中比较简单粗暴的处理方式,在YOLOX中使用一种更严谨的方法SimOTA从全局来考虑anchor box的标签分配问题,来确定positive负责预测哪个目标。可以天然缓解拥挤场景的检测问题,缓解极端长宽比的物体的检测效果差的问题(在实际使用中,比如检测长条形的物体10x200大小,亲测yolov5 AP50只有30%-40%,YOLOX对于这类目标检测的AP50可以达到80%以上),以及极端大小目标正样本不均衡的问题。
在前面的Multi-positive步骤中,在每个GT的中心点的一个矩形(3x3)范围内的点都初步设置为positive,然后使用SimOTA方法重新对这些positive所归属的GT进行分配。OTA和SimOTA的计算过程具体可以参考前面给出的参考文档,写的相当棒。
YOLOX实验效果: