FCOS
简介
论文原文:论文原文)
在之前的一些目标检测网络中, 比如Faster RCNN, SSD, yolov2~v5都是基于Anchor进行预测,即在原图上生成一堆密密麻麻的Anchor Boxes, 然后网络基于这些Anchor去预测它们的类别、中心点偏移量以及宽高缩放因子得到网络预测输出的目标, 最后通过NMS(no-max-suppression非极大值抑制)即可得到最终预测目标。针对基于Anchor网络存在的问题, 原作者总结如下四点:
1、检测器的性能和Anchor的size以及aspect ratio相关, 比如在RetinaNet中改变Anchor(论文中说这是个超参数hyper-parameters)能够产生约4%的AP变化, 也就是说Anchor需要设置的合适才可以。
2、一般Anchor的size和aspect ratio( 宽度/高度 的比值)都是固定的, 所以很难处理哪些形状变化很大的目标(比如一本书横着放于竖着放久不一样)。而且迁移到其他任务中时,如果新的数据集目标和预训练数据集中的目标形状差别很多, 一般需要重新设计Anchor。
3、为了达到更高的召回率(查全率),一般需要再图片中生成非常密集的Anchor Boxes尽可能保证每个目标都会有Anchor Boxes和它相交。比如在FPN(Feature Pyramid Network)中会生成超过18万个Anchor Boxes(以输入图片最小边长800为例), 那么在训练时绝大部分的Anchor Boxes都会被分成负样本, 这样会导致正负样本及其不均。
4、Anchor的引入使得网络在训练过程中更加的繁琐, 因为匹配正负样本时需要计算每个Anchor Boxes和每个GT BBoxes之间的IoU
虽然基于Anchor的目标检测网络存在如上所述的问题, 但并不能否认它的有效性, 比如现在常用的YOLO V3~V5, 它们都是基于Anchor的网络, 当然今天的主角是Anchor-Free, 现在有关Anchor-Free的网络也很多, 比如DenseBox, YOLOV1, CornerNet, FCOS以及CenterNet等等, 而今天要讲的FCOS不仅是Anchor-Free还是One-Stage, FCN-base。
FCOS是2019年发表在CVPR上的文章, 这篇文章的想法不仅简单而且有效, 它的思想是跳出Anchor的限制, 在预测特征图的每个位置上直接去预测该带你分别举例目标左侧, 上侧, 右侧以及下侧的距离。
FCOS网络结构
下图是2020年发表的版本, 与2019年发表的版本有些不同, 区别在于Center-ness分支的位置, 2019年发表的版本中是将Center-ness分支和classification分支放在一起的,但在2020年论文的图中将Center-ness分支和Regression分支放在一起的, 论文中说后者的效果更好一点。
下图是根据源码绘制的网络结构。
上图中Backbone以ResNet50为例, FPN是在Backbone输出的C3, C4和C5上先生成P3, P4和P5, 然后在P5的基础上通过一个卷积核大小为3x3步距为2的卷积层得到P6, 最后在P6的基础上再通过一个卷积核大小为3x3步距为2的卷积层得到P7。
接着看Head部分(注意这里的Head是共享的, 即P3~P7都是共用一个Head), 有三个分支:Classification, Regression和Center-ness。其中Regression和Center-ness是同一个分支上的两个不同小分支。每个分支都会先通过4个Conv2d+GB+ReLU的组合模块, 然后再通过一个卷积核大小为3×3步距为1的卷积层得到最终的分类结果。
对于classification分支, 在预测特征图的每个位置上都会预测80个score参数(MS COCO数据集目标检测任务的类别数为80)。
对于Regressio分支, 在预测特征图的每个位置上都会预测4个距离参数(距离目标左侧距离l, 上侧距离为t, 右侧距离为r以及下侧距离b, 这里预测的数值是相对特征图尺度上的)。假设对于预测特征图上某个点映射回原图的坐标是(c_x, c_v), 特征图相对原图的步距为s, 那么网络预测该点对应的目标边界框坐标为:
对于Center-ness分支, 在预测特征图的每个位置上都会预测1个参数, center-ness反映的是该点(特征图上的某一点)距离目标中心的远近程度, 它的值域在0~1之间, 距离目标中心越近center-ness越接近1, 下面是center-ness真实标签的计算公式(计算损失时只考虑正样本, 即预测点在目标内的情况)
在网络后处理部分筛选高质量的bbox时, 会将预测的目标class score与center-ness相乘再开根号, 然后根据得到的结果对bbox进行排序, 只保留分数较高的bbox, 这样做的目的是筛掉哪些目标class score低且预测点距离目标中心较远的bbox, 最终保留下来的就是高质量的bbox。下表展示了使用和不使用center-ness
对AP的影响,只看第一行和第三行,不使用center-ness
时AP为33.5,使用center-ness
后AP提升到37.1,说明center-ness
对FCOS网络还是很有用的。
正负样本的匹配
在计算损失之前, 我们需要进行正负样本的匹配, 在基于Anchor的目标检测网络中, 一般会通过计算每个Anchor Box与每个GT的IoU配合事先设定的IoU阈值去匹配, 比如某个Anchor Box与某个GT的IoU大于0.7, 那么我们就将该Anchor Box设置为正样本, 但对于Anchor-Free的网络根本没有Anchor, 那该如何匹配正负样本呢, 在2020版本的论文中有这样的一段话:
Specifically, location (x, y) is considered as a positive sample if it falls into the center area of any ground-truth box, by following [42]. The center area of a box centered at (cx , cy ) is defined as the sub-box (cx − rs, cy − rs, cx + rs, cy + rs) , where s is the total stride until the current feature maps and r is a hyper-parameter being 1.5 on COCO. The sub-box is clipped so that it is not beyond the original box. Note that this is different from our original conference version, where we consider the locations positive as long as they are in a ground-truth box.
最开始的一句话就是说, 对于特征图上的某一点(x, y), 只要它落入GT box中心区域, 那么它就被视为正样本(其实在2019年的论文中最开始说的是重要落入GT内就算正样本)。但在2020年发表论文中, 新加了一条规则,在满足上述条件外, 还需满足点(x, y)在(c_x - rs, c_y - rs, c_x + rs, c_y + rs)这个sub-box范围内, 其中(c_x, c_y)就是GT的中心点, s是特征图相对原图的步距, r是一个超参数控制距离GT中心的远近, 在COCO数据集中r设置为1.5, 换句话说点(x, y)不仅要在GT的范围内, 还要离GT的中心点(c_x, c_y)足够近才能被视为正样本。
作图如下, 假设上面两个feature map对应的是同一个特征图, 将特征图上的每个店映射回原图就是下面图片中黑色的圆点, 根据2019年论文的匹配准则, 只要落入GT Box就算正样本, 所以左侧的feature map中打勾的位置都被视为正样本。根据2020年的论文, 不仅要落入GT Box还要在(c_x - rs, c_y - rs, c_x + rs, c_y + rs)这个sub-box范围内, 所以右侧的feature map中打勾的位置被视为正样本。
这里肯定会有人问, 如果feature map上的某个点同时落入两个GT Box内(即两个GT相交区域), 那么该点到底分配给哪个GT Box, 这就是论文中提到的Ambiguity问题, 下图中, 橙色对应的点同时落入到人和球拍两个GT Box中, 此时默认将该点分配给面积Area最小的GT Box, 即图中的球拍, 其实引入FPN后能后减少这种情况。
损失计算
FCOS网络结构中提高, Head总共有三个输出分支:Classification,Regression和Center-ness, 所以损失由分类损失L_cls, 定位损失L_reg以及center-ness损失L_ctrness三部分组成。
上式子中:
P_x,y表示特征图(x, y)点处预测的每个类别的score
c*_x,y表示特征图(x, y)点对应的真实类别标签
1{c*_x,y>0}表示当特征图(x, y)点被匹配为正样本时为1, 否则为0
t_x, y表示在特征图(x, y)点处预测的目标边界框信息
t*_x, y表示在特征图(x, y)点处真实的目标边界框信息
s_x, y表示在特征图(x, y)点处预测的center-ness
s*_x, y表示在特征图(x, y)点处真实的center-ness
对于分类损失L_cls采用bce_focal_loss, 即二值交叉熵损失配合focal_loss, 计算损失时所有样本都会参与计算(正样本和负样本)。定位损失L_reg采用giou_loss(在2019年版中采用iou_loss, 但在2020年版本中采用giou_loss), 计算损失时只有正样本参数计算, center-ness损失采用二值交叉熵损失, 计算损失时只有正样本参数计算。
在匹配正负样本过程中, 对于特征图(x, y)点处对应的GT信息c*x,y和t*x, y比较好得到一点, 只要匹配到某一GT目标则c*x,y对应GT的类别, t*x,y对应GT的bbox。而获得真实的center-ness(s*x,y)要复杂一点, 下面是s*x, y的计算公式。
为方便理解, 作图如下, 假设对于特征图上的某一点(图中蓝色填充的cell)映射回原图, 对应图片中的黑色点, 然后计算该点距离GT box左侧, 上侧, 右侧, 下侧的距离就能得到l*, t*, t*, b*再套用上面的公式就能得到s*x,y 。(这里的l*, t*, t*, b*无论是计算特征图尺度上的还是原图尺度上的都无所谓, 因为centerness*对尺度不敏感)
Ambiguity问题
论文中专门有一部分内容用来分析ambiguous sample问题, 即在匹配正样本的时当特征图上的某一点同时落入多个GT Box内时, 应该分配给哪一个GT的问题。
Another concern about the FCN-based detector is that it may have a large number of ambiguous samples due to the overlap in ground-truth boxes.
当特征图上的某一点同时落入多个GT Box内时, 默认将该点分配给面积Area最小的GT Box, 当然这并不是ig很好的解决方法。ambiguous samples的存在始终会对网络的学习以及预测产生干扰。作者再COCO2017年的val数据上进行了分析,作者发现如果不使用FPN结构时(仅在P4特征层上进行预测)会存在大量的ambiguous samples(大概占23.16%), 如果启用FPN结构ambiguous samples会大幅度降低(大概占7.24%)。因为在FPN中会采用多个预测特征图, 不同尺度的特征图负责预测不同尺度的目标, 比如P3负责预测小型目标, P5负责预测中等目标, P7负责预测大型目标。作图如下, 比如对于小型目标 球拍, 根据尺度划分准则, 它被划分到feature map1上, 对于大型目标 人, 根据尺度划分准则【后面会讲】被划分到feature map2上, 这样在匹配正负样本时能将部分重叠在一起的目标(这里主要指不同尺度的目标)给分开, 解决了ambiguous samples的问题。
如果再采用center sampling匹配准则(在2020年更新的FCOS版本中, 匹配正样本时要求不仅要落入GT Box还要在(c_x - rs, c_y - rs, c_x + rs, c_y + rs)这个sub-box范围内)能够进一步降低ambiguous samples的比例(小于3%)。
Assigning objects to FPN
上文提到, 使用FPN结构能够降低ambiguous samples的比例, 那么按照怎样的准则将目标划分到对应尺度的特征图上呢, 在FPN中采用如下公式计算分配的
在FCOS中, 作者发现套用FPN中的公式效果并不是很好, 作者猜测是因为按照FPN中的分配准则, 不能确保目标在对应感受野范围内, 比如对于某个特征层, 每个cell的感受野为28x28, 但分配到该特征层上的目标为52×52.
最终采用的是max(l*, t*, r*, b*)策略, 其中l*, t*, r*, b*分别代表某点(特征图映射在原图上)相对GT Box左边界, 上边界, 有边界以及下边界的距离。关于这个策略在2020年版本的论文中介绍的很清楚, 对于不同的预测特征图只要满足以下公式即可, 比如说P4特征图只要max(l*, t*, r*, b*)在(64, 128)之间即为正样本: