FSAF 让网络自己决定实例输出层

目标检测系列文章
yolo v1原理:https://blog.csdn.net/cjnewstar111/article/details/94035842
yolo v2原理:https://blog.csdn.net/cjnewstar111/article/details/94037110
yolo v3原理:https://blog.csdn.net/cjnewstar111/article/details/94037828
SSD原理:https://blog.csdn.net/cjnewstar111/article/details/94038536
FoveaBox:https://blog.csdn.net/cjnewstar111/article/details/94203397
FCOS:https://blog.csdn.net/cjnewstar111/article/details/94021688
FSAF: https://blog.csdn.net/cjnewstar111/article/details/94019687

1.FSAF简介

全称为:Feature Selective Anchor-Free Module。为包含FPN的单阶段检测框架增加一个FSAF模块,从而由网络自己选择哪个层来预测哪个实例。

 

2.传统一阶段检测框架(含FPN)是如何进行实例选择的?

如下图所示,样本输入到检测框架之后,会根据样本中的bounding box和FPN中每一个层的anchors求IOU,与哪个anchor的IOU最大,那么那个anchor所在的层用来预测该实例。下图中的汽车实例和P4层的第一个anchor的IOU最大(红色实线框),那么就由P4来负责汽车实例的输出。

FSAF 让网络自己决定实例输出层_第1张图片

由于每一层的anchor是预先根据经验设置的,然后通过与anchor的IOU决定哪一层来预测实例,实际上也是根据经验来决定由哪一层来预测该实例,所以是基于启发式的。那么这种基于启发式的,经验性的选择是最优的吗?能否使用网络自己来决定哪个实例由哪个层来输出?

 

3.FSAF模块架构图

为了让网络自己决定由哪一层来输出实例,引入了FSAF模块,结构如下图所示:

FSAF 让网络自己决定实例输出层_第2张图片

这是论文中的原图,可能不是很清晰,下面这个是我根据自己的理解绘制的FSAF模块的架构图。以P4特征输出为例,两个蓝色的子网络为原来的anchor based的子网络,一个负责输出类别,维度是H*W*K*A(K是类别数,A是anchor数),另一个负责输出四个点的位置偏移。FSAF模块在原来的两个分支结构中各增加一个小的分支,同样的,一个输出类别,一个输出位置偏移信息。由于没有使用anchor,所以输出的类别维度为H*W*K。

FSAF 让网络自己决定实例输出层_第3张图片

 

4.FSAF模块如何选择实例?

通过上面的讲解,FASF模块实际上也是一个完整的物体框预测子网络,它能输出实例的类别和偏移量,本质上就是一个检测子网络。但是它的特点是非常轻量级。那么FSAF模块是如何根据这两个新增加的分支来决定某个实例由哪个feature map来负责输出呢?答案是根据loss值的大小。同样先看论文中的图:

FSAF 让网络自己决定实例输出层_第4张图片

下面是我根据理解绘制的图:

FSAF 让网络自己决定实例输出层_第5张图片

当一个训练样本输入到网络的时候,首先通过各个特征图的FSAF模块求出该特征图下对应的ground truth实例分类loss以及回归loss,并对两个loss求和,作为最终的loss。然后判断哪个loss最小,例如上图中的P3层的FSAF模块的loss最小,那么就由P3层来负责对该训练样本中汽车实例的训练。

 

5.总结:

FSAF实际上是增加了一个非常轻量级的检测子网络来辅助重量级的anchor based检测模块来决定目标实例由哪个特征图来预测。由于FSAF模块是anchor free的,所以它的选择完全是自发的,是根据网络学习到的。效果也比原来的anchor求IOU这种启发式的方式要好。

6.参考资料:

csdn:https://blog.csdn.net/u014119694/article/details/88428707 作者:冷夏LX

知乎:CVPR2019 | 目标检测 FSAF:为金字塔网络的每一层带去最好的样本 作者:ChenJoya

知乎:[CVPR2019]:FSAF for Single-Shot Object Detection 作者:孙杨威

你可能感兴趣的:(深度学习)