概述
由于目标检测发展出许多anchor-free、advanced label assignment方法,但是这些方法在YOLO v4和YOLO v5中都没有应用,因此作者提出了YOLOX,极大提升了YOLO v3的性能。
一句话总结:YOLOX在YOLO v3的基础上,通过使用解耦检测头、强化的数据增强方法(Mosaic和MixUp)、anchor free、多正样本、SimOTA Box assign方法(每个ground truth可能对应不一样数目的正样本),提升了目标检测模型的性能。
基础起点模型使用YOLO v3-Darknet53。
另外我们也和SSD
进行了对比,它的优势:
- 实测效果提升很大;
- 收敛稳定、不需要提前手工设计anchor宽高比例;
- 可以根据需要选择不同大小的模型,端侧可以用推理速度快的小模型,精度要求更高可以用大模型;
- 提供了
onnx
、TensorRt
等的支持,工程应用非常方便。
基于YOLO v3的改进措施
训练细节
总共训练300个epoch,前5个epoch进行学习率warmup,学习率设置为lr×BatchSize/64
,并使用cosine
学习率,增加了权值ema更新,并且使用IoU loss和IoU-aware分支。
数据增强
随机水平翻转、颜色空间增强以及多尺度数据增强,去掉了随机 resize crop增强,因为认为它和mosaic增强有些重合。并且在最后15个epoch关闭Mosaic和MixUp增强,同时作者发现使用这些增强后ImageNet预训练模型以及没有收益,因此所有的模型都是从头训练。
Mosaic数据增强
关于 Mosaic 数据增强部分,可以参考这篇博客。
MixUp数据增强
关于 MixUp 数据增强部分,可以参考这篇博客。
解耦检测头
已经有论文(例如 Rethinking classification and localization for object detection
)指出分类和回归任务两个并不适合放到一起进行优化。YOLOX的分析结果也显示混合头对性能有坏影响:替换YOLO的头为解耦头极大提升了收敛速度;同时解耦头对于端到端版本的YOLO也是至关重要的。在具体实施上,第每一层FPN特征,首先都使用一个1×1卷积将特征维度降低到256维,然后增加两个并行的分支,使用两层3×3卷积,分别输入到分类和回归分支,同时IoU分支和回归分支放到一起。
Anchor-free
基于anchor的目标检测方法有些问题:首先是在训练前要对数据集信息进行聚类,这降低了检测模型的泛化性能;另外是增加了检测头的复杂度;最后在边缘设备上还可能造成性能瓶颈。因此YOLOX使用anchor-free的方法:首先将每个位置进行3个预测降低到1个预测,直接预测四个值,也就是左上角位置以及偏移。使用object的中心位置作为正样本。
Multi positives
为了稍微缓解正负样本平衡问题,参考FCOS中的方法,将中心位置3*3的地方都作为正样本。
SimOTA
对每个gt,都在一个固定的中心区域中,选择top k个和gt具有最小损失的预测结果作为正样本。每个gt可能对应不同的k值。
切换Backbone
通过切换Backbone,作者或者不同大小规模的YOLOX模型。对于大模型,使用更强的数据增强;对于小模型关闭了Mosaic和MixUp增强。同时在做MixUp增强前,先对图像进行随机尺度缩放,增强了MixUp的性能。
作者对每项带来的性能提升也做了实验:
最终性能
最终性能对比如下表,性能提升明显,相比YOLO v5
,也有不错的性能提升。