论文连接:You Only Look One-level Feature

代码连接:https://github.com/megvii-model/YOLOF

介绍和相关工作

FPN流行之处在于:

  1. 多尺度的特征融合,能够将低分辨率和高分辨率的特征融合从而获得更好的表示。
  2. 分而治之的策略,在不同尺度特征图上进行不同目标尺度的检测。

大多是人认为FPN主要受益得益于第一点,很少有人讨论其分而治之的策略,事实上,第二点才是关键。作者通过解耦特征融合和分治两部分,通过对比实验得出结论,如下图。事实上a,b对比,多尺度带来的提升只有0.9;相较于b,c两个任务,分治带来的提升更大;c,d则表示,C5携带的特征足以让检测任务在多尺度上进行检测,加入其他分辨率的特征图也就提升0.2。

以上实验可以看出,FPN的成功得益于他应对检测的策略:分治。但是就特征融合方面来说,带来的存储压力太大,且提升不大。

这里作者提出了YOLOF方法,只使用第五层下采样32层倍特征图进行检测任务,随后设计了一种提取多尺度目标特征的扩张编码统一匹配的结构来弥补多层特征的缺失,效果优秀,速度惊人。

多进多出编码器的代价分析

该实验基于使用ResNet-50的RetinaNet,pipline如下:backbone+encoder+decoder三部分。

不同输入输出RetinaNet各个成分的FLOPs、速度以及准确率比较实验结果如下图:

相较于单进单出,多进多出的编码结构的存储压力更大(6G∶134G)。速度方面也是,多进多出的编码器相较于单进单出的编码器速度比为13 FPS ∶ 34 FPS,速度更慢(主要由于处理C3高分辨率特征带来的速度压力)。

方法讨论

分析完以上缺点与分析,作者提出了相应的改进方法。C5特征图携带语义信息足够,单进单出编码器速度快且简单。于是想到了利用C5加上单进单出的网络来代替原有的多进多出。

迎面而来的也带来了问题:

  1. C5虽然语义信息足够,但是感受野有限,相对于多尺度的目标检测显然是不够的。
  2. 单层特征下稀疏锚点在正锚点上存在不平衡。

针对以上问题也提出了相应的解决

受限的缩放尺度问题

不同尺寸的目标对于目标检测一直是一个问题,一个灵活的办法就是利用多尺度特征。多进多出,和单进多出的结构都会获得不同尺度的感受野,从而在不同感受野上进行检测。

但是如果使用单进单出的编码器,感受野是固定的。下图a可以看出,感受野过小,则小目标会被抓住,相应的大尺度目标就会被忽略。b则表示感受野过大,小目标被忽视。c则表示不同尺度的感受野则可以囊括了所有尺度的目标。


但是C5的特征感受野只可以覆盖有效的目标尺度,从而导致检测效果不佳。为此需要加入一个方法来产生一个多感受野的输出特征图,弥补多尺度的特征的缺失。事实上将上图a,b的感受野结合起来就可以组成c,实现方法也可以通过构建残差的膨胀卷积获得。

膨胀编码:
膨胀卷积可以有效的扩张感受野,这里作者作者设计了膨胀编码块,用于连续的且不参数共享的进行膨胀残差连接。

DetNet也提出了使用膨胀卷积残差块,为了保持特征的空间分辨率和保持backbone输出更多的细节。这里作者的目的是为了让backbone的输出特征具有多中感受野的能力。

相应的提出的单进单出SiSo编码器如下:
Projector,中只使用卷积核后只跟BN层,残差块中会使用BN层和Relu层。

正锚不平衡问题

正锚点的定义是目标检测优化问题的关键,在基于锚点的检测器中,通过锚框和GT框之间的IoU来定义正锚。在RetinaNet中,如果锚框和GT框的IoU大于0.5,则认为是正锚,成为最大IoU匹配。

在多进多出MiMo的编码器中,不同尺度的GT框在不同的级别的特征中产生正锚,基于分治策略,最大IoU匹配能够保证GT框在每个尺寸都可以获得足够多的帧锚。但是使用单进单出的编码器,锚框数量先急剧下降(100k—>5K),导致了锚框的稀疏。稀疏的锚框在使用Max-IoU匹配时会造成如下的匹配问题:

大的GT框会囊括更多的正锚,从而导致对比小的GT框会产生不平衡,使得检测模型更加注意大的GT目标,忽视小的目标。

统一匹配:
为了解决不平衡问题,提出了统一匹配策略:采用距离某个GT框最近的 K K K个锚框作为其正锚,保证所有的不同尺寸的GT框可以匹配相同个数的正锚。正采用的平衡可以保证GT框参与训练时贡献均衡。统一匹配的策略的提出可以解决SiSo设计中的严重不平衡的问题。

下图体现了不同的匹配方法产生的正锚分布。Top1方法和作者的提出的方法都可以获得统一的匹配。

YOLOF

基于以上的设计,提出了更加快速和直接的框架,定义为YOLOF,包括三个部分:backbone,编码器和解码器。

Backbone:
所有模型中,简单使用RenNet和RenNeXt作为backbone,所有方法在ImageNet进行预训练。backbone的输出为C5,2048通道数和下采样32倍。BN层在对比时默认冻结。

编码器encoder:

如上图残差块结构,在FPN后增加两个Projection层(1x1和3x3卷积),获得512通道数的特征图。然后为了保证覆盖所有尺度目标,加入残差块,每个残差块包括三个连续的卷积(1x1卷积减少通道数,3x3膨胀卷积扩大感受野,1x1卷积恢复通道)

解码器decoder:
解码器使用RetinaNet,包括2个平行的任务头:分类和回归:

主要两个次要的修改,第一是将两个头中的卷积层数设置的不同,对于回归头有四个卷积+BN+relu,而分类只有两个相应块。第二个是为回归头部的每个锚添加一个隐式的客观预测(没有直接监督)。所有检测的最终的分类得分通过隐式预测和分类输出相乘获得。

其他细节:
为了对抗稀疏锚的问题,对图像进行上下左右平移30像素的增强。此外,当使用单一层次特征时,限制锚点中心的偏移也有助于最终的分类。因此增加了一个限制,所有锚点的中心位移都应该小于32像素。

实验

不同backbone情况下和RetinaNet的实验对比:

COCO2017数据集和DETR实验对比:

COCO test_dev数据集和TOLOV4对比:

消融实验:


训练存储和时间对比:

锚框数量大小比例对比:

top k搜索: