号称高效更精确的目标检测框架 yolox 我也没试过啊 就是发这里一起讨论啊 ~~ 勿怪啊~~
我只是为了学习的搬运工, yolox也不是我做的啊 只是为了讨论
先一通c吧
YOLOX在YOLO系列的基础上做了许多有意思的工作,其主要贡献在于:在YOLOV3的基础上,引入了“Decoupled Head”,“Data Augmentation”,“Anchor Free” 和“SimOTA样本匹配”的方法,构建了一种anchor-free的端到端目标检测框架,并且达到了顶级的检测水平。
以在大量模型中获得最先进的结果:对于YOLONano仅0.91M参数和1.08G FLOPs,研究者在COCO上获得25.3%AP,超过NanoDet 1.8%AP;对于业界应用最广泛的检测器之一YOLOv3,在COCO上将其提升至47.3% AP,比当前最佳实践高3.0% AP;对于参数量与YOLOv4-CSP、YOLOv5-L大致相同的YOLOX-L,研究者在Tesla V100上以68.9FPS的速度在COCO上实现了50.0% AP,比YOLOv5-L高出1.8% AP。此外,研究者使用单个YOLOX-L模型赢得了Streaming Perception Challenge(CVPR 2021自动驾驶研讨会)的第一名。
2
背景
我们是在去年底萌生优化YOLO系列的想法的,那时候我们组刚完成了AutoAssign,LLA,DeFCN,IQDet,OTA等工作,在基础检测尤其是Anchor Free和Label Assignment方向有一些自己的理解。而那时候的YOLO系列还停留在Anchor Based阶段,样本匹配也采用的是基于几何先验的一对一或一对N的方案上。而随后出现的各项工作也基本是在往大输入分辨率和大模型的方向走。基于这样的大背景,我们决定启动YOLOX项目,想知道学术研究与工程落地到底能碰出什么样的火花。
用于YOLOX和其他最先进目标检测器的精确模型(顶部)和移动设备上lite模型的尺寸精度曲线(底部)的速度-精度权衡。
YOLOX的设计,在大方向上主要遵循以下几个原则:
- 所有组件全平台可部署
- 避免过拟合 COCO,在保持超参规整的前提下,适度调参
- 不做或少做稳定涨 点但缺乏新意的工作(更大模型,更多的数据)
所以大家可以看到,首发的YOLOX没有deformable conv,没有用额外数据做pretrain,没有momentum=0.937。回到YOLOX设计的具体细节上,认为与之前YOLO最大的区别在于Decoupled Head,Data Augmentation,Anchor Free和样本匹配这几个地方。下面将从这几个方面展开聊。
3
YOLOX-新框架
Decoupled Head
Decoupled Head是学术领域一阶段网络一直以来的标准配置(RetinaNet,FCOS等)。相比于它朴素的实现方法,“解耦头”这个词显得有些高大上。研究者一开始并没有计划对检测头进行解耦,而是在将YOLOX推进到“端到端(无需NMS)”时发现,不论调整损失权重还是控制梯度回传,End2end的YOLOX始终比标准的YOLOX低4~5个点( 如下表 ),这与在DeFCN里获得的认知不符。
偶然间研究者把原始的YOLO Head换成decoupled head,发现这里的差距又显著缩小了,这样的现象说明当前YOLO Head的表达能力可能有所欠缺。于是将decoupled hea 应用到了非End2End的YOLO上,结果就如下图的所示:不仅在峰值的性能有所提升,收敛速度也明显加快。结合之前End2end的实验,这两个现象充分说明YOLO系列一直以来使用的检测头可能是不合理的。
实验表明,解耦合检测头能加快模型收敛速度、提高检测精度,同时也会带来一点额外的参数量和计算成本:
- 用一个解耦的头部代替YOLO的头部,大大提高了收敛速度,如上图所示。
- 分离的头部对于End-to-End的YOLO是必不可少的。从上表可以看出:耦合头的End-to-End YOLO检测性能AP降低了4.2%,而解耦头的YOLO降幅仅减小到0.8%AP。因此,用一个如下图所示的轻型解耦头替换了YOLO检测头。
- 将检测头解耦会增加运算的复杂度,但经过权衡速度和性能上的得失,研究者使用1个1x1 的卷积先降维,并在分类和回归分支里各使用了2个3x3卷积,最终调整到仅仅增加一点点参数,YOLOX在s,m,l,x模型速度上的轻微下降也全源自于此。在下表中展示了V100上Batch=1的推理时间,Decoupled Head带来了1.1%的性能提升。
表面上看,Decoupled Head提升了YOLOX的性能和收敛速度,但更深层次的,它为YOLO与检测下游任务的一体化带来可能:例如,YOLOX+Yolact/CondInst/SOLO,可实现端侧的实例分割;YOLOX + 34层输出,实现端侧人体的 17 个关键点检测。
以往或许已经有一些这方面的工作,但这些领域的SOTA依然拥有他们特殊的结构设计,使得该领域无法直接享用到YOLO系列发展的成果。如今一个打开了枷锁的检测头,我们认为会让YOLO与检测的下游任务更深层次的结合,为检测与下游任务的端到端一体化带来一些变化。
Data Augmentation
Data Augmentation里面需要强调的一点是:要在训练结束前的15个epoch关掉Mosaic 和Mixup ,这对于YOLOX非常重要。可以想象,Mosaic+Mixup生成的训练图片,远远脱离自然图片的真实分布,并且Mosaic大量的crop操作会带来很多不准确的标注框,见下图:
当模型容量足够大的时候,相对于先验知识(各种 tricks,hand-crafted rules ),更多的后验(数据/数据增强)才会产生本质影响。通过使用 COCO 提供的 ground-truth mask 标注,作者在 YOLOX 上尝试了 Copypaste,下表表明,在 48.6mAP 的 YOLOX-Large 模型上,使用 Copypaste 带来0.8%的涨点。
但是Copypaste的实现依赖于目标的mask标注,而mask标注在常规的检测业务上是稀缺的资源。而由于MixUp和Copypaste有着类似的贴图的行为,还不需要mask标注,因此作者在Mixup上进行了修改,实现了在原理上更接近Copypaste的Mixup数据增强方式。
Anchor Free
Anchor Free的好处是全方位的:
- Anchor Based 检测器为了追求最优性能通常会需要对anchor box 进行聚类分析,这无形间增加了算法工程师的时间成本;
- Anchor 增加了检测头的复杂度以及生成结果的数量,将大量检测结果从NPU搬运到CPU上对于某些边缘设备是无法容忍的。当然还有;
- Anchor Free 的解码代码逻辑更简单,可读性更高。
至于为什么Anchor Free现在可以上YOLO ,并且性能不降反升,这与样本匹配有密不可分的联系。与Anchor Free比起来,样本匹配在业界似乎没有什么关注度。但是一个好的样本匹配算法可以天然缓解拥挤场景的检测问题( LLA、OTA里使用动态样本匹配可以在CrowdHuman上提升FCOS将近10个点),缓解极端长宽比的物体的检测效果差的问题,以及极端大小目标正样本不均衡的问题。甚至可能可以缓解旋转物体检测效果不好的问题,这些问题本质上都是样本匹配的问题。
- loss/quality/prediction aware :基于网络自身的预测来计算 anchor box 或者 anchor point 与 gt 的匹配关系,充分考虑到了不同结构/复杂度的模型可能会有不同行为,是一种真正的 dynamic 样本匹配。而 loss aware 后续也被发现对于 DeTR 和 DeFCN 这类端到端检测器至关重要。与之相对的,基于 IoU 阈值 /in Grid(YOLOv1)/in Box or Center(FCOS) 都属于依赖人为定义的几何先验做样本匹配,目前来看都属于次优方案。
- center prior : 考虑到感受野的问题,以及大部分场景下,目标的质心都与目标的几何中心有一定的联系,将正样本限定在目标中心的一定区域内做loss/quality aware样本匹配能很好地解决收敛不稳定的问题。
- 不同目标设定不同的正样本数量(dynamic k):我们不可能为同一场景下的西瓜和蚂蚁分配同样的正样本数,如果真是那样,那要么蚂蚁有很多低质量的正样本,要么西瓜仅仅只有一两个正样本。Dynamic k的关键在于如何确定k,有些方法通过其他方式间接实现了动态k,比如ATSS、PAA ,甚至RetinaNet ,同时,k的估计依然可以是prediction aware的,我们具体的做法是首先计算每个目标最接近的10个预测,然后把这个10个预测与GT的iou加起来求得最终的k,很简单有效,对10这个数字也不是很敏感,在5~15调整几乎没有影响。
- 全局信息:有些anchor box/point处于正样本之间的交界处、或者正负样本之间的交界处,这类anchor box/point的正负划分,甚至若为正,该是谁的正样本,都应充分考虑全局信息。
下期我们简单再说说YOLOX的部署支持及端到端!
实验
在COCO数据集上的速度及精度比较