论文地址: https://arxiv.org/abs/1903.00621.
作者在B站解读视频:https://www.bilibili.com/video/av49972561/.
注:本文在查阅时发现了两篇知乎专栏写的很好的解读,在文末给出链接,因此这里就仅仅给出整理,并添加了一些细节性的东西。
先看看效果,论文提出的特征选择无锚点模块(FSAF)应用在单阶段检测器RetinaNet上,使用ResNeXt-101在COCO数据集上达到单阶段SOTA,map提升了1.8%仅多用了6ms。如图,FSAF对小的物体效果更好。
1.背景及动机
为解决目标检测的一大挑战scale variation,通常可用特征金字塔网络 FPN(Feature Pyramid Network)。但它有一个问题:不同尺寸的物体依据其与 FPN 每一层 Anchor 的适配程度,分配到不同分辨率的层上进行学习,期望其能够充分适配各层感受野和空间信息,从而使得检测器能够检测尺寸不一物体;这种启发式的方法(heuristic-guided feature selection)虽听着合理,却没有明确的证据,我们并不知道一个确切的 ground-truth 分配到哪一层上去学习是最合适的。如图2,一个大小为50×50像素的car实例和另一个大小为60×60像素的类似car实例可以被分配到两个不同的特征层,而另一个大小为40×40的car实例可以被分配到与50×50实例相同的层。
因此,要想取代这种分配方式,就必须不再依赖每一层 anchor 和 ground-truth 的 IoU 来做分配。因此本文提出的模块也是就叫做 Feature Selective Anchor-Free Module(FSAF),让网络自己学习该怎么分配,为金字塔网络的每一层带去最好的样本。
怎么做?
在此之前,我们先温习一下具有 FPN 式结构的检测器中是如何分配 ground-truth 的。我们把 FPN 上所有层的所有 anchor 全部拿过来,和 ground-truth 计算 IoU overlap,通过设定的阈值或者是选择最大的 IoU,便可以得到这个 ground-truth 的 positive anchor。由于每一层上的 anchor 都是密集设置的,层与层之间仅仅是 anchor 的大小不同(随着分辨率的升高,anchor 的尺寸下降),因此这个分配过程基本就是看 ground-truth 的大小:小的 ground-truth 被分配到高分辨率,大的 ground-truth 被分配到低分辨率。这样的设计作者认为它是 heuristic(启发式) 的,可能会使得选择的特征不是最优的,从而影响检测器的性能。
2.FSAF
很明显,要想取代上述的分配方式,那么“把 FPN 上所有层的所有 anchor 全部拿过来,和 ground-truth 计算 IoU”这一步就不能有。因此作者提出了一个 anchor-free 的 module,称为 FSAF,大体思想是在每一层都插入这个模块,尝试不用 anchor 去检测 instance,而后看看哪一层的 FSAF 对于这个 instance 的损失最小,不就可以认为这一层是最适合检测这个 instance 的吗? 接着 FSAF 大喊一句“安排”!!!把这个物体安排到这个层,再用 anchor-based 的模块去检测.我们将提出的FSAF模块嵌入到retinaNet,实际上它可嵌入到任何带有特征金字塔结构的的单阶段检测器。
那么我们需要关注两个问题:(1)anchor-free branch 是怎么不借助 anchor 去检测物体的?(2)anchor-free branch 怎么和 anchor-based branch 联合起来?对于(1),作者说他的设计十分 simple,是真的 simple,这十分惹人喜欢;对于(2),FSAF 中也是采用的最自然的 jointly training 方法。下面来具体看看:
2.1 anchor-free branch 是怎么不借助 anchor 去检测物体的?
这里插一段先介绍一下图4.它展示了带有FSAF模块的RetinaNet。总的来说,RetinaNet由一个骨干网(图中未展示)和两个子网络(分类和回归)组成。特征金字塔由骨干网构建,从
P
3
P_3
P3到
P
7
P_7
P7,
l
l
l是金字塔层数,
P
l
P_l
Pl的分辨率是输入图像的
1
/
2
l
1/2^l
1/2l。在每层
P
l
P_l
Pl的后面添加分类及回归子网络,二者都为全卷积网络。
anchor-based分支:分类网络预测每个位置的A个anchor及K个类别的分数值,回归分支预测距离存在的最近的A个anchor框的四维未知类别的offset。
anchor-free分支: 一个3x3xK的卷积层添加到分类分支的输出,后接sigmoid函数,与基于anchor分支的部分相互平行,其预测目标物在每个位置上K个类别的概率值。一个3x3x4的卷积层添加到回归分支的输出,其后接ReLU函数。其作用是以anchor-free的方式预测框的偏移量。
anchor-based与anchor-free共享每层特征以多任务的方式进行运作。
所以,FSAF仅仅就是!!!!!!!
在 RetinaNet 的 box 和 cls 分支上仅仅各加了一层 conv layer,分别生成一个 W × H × K classification output 和一个 W × H × 4 的 regression output。
了解了基本网络框架,所以它具体是怎么对应GT计算损失的呢?
(1)对于一个instance,ground truth box的类别:
k
k
k;
(2)ground truth bounding box坐标:
b
=
[
x
,
y
,
w
,
h
]
b=[x,y,w,h]
b=[x,y,w,h],其中,
(
x
,
y
)
(x,y)
(x,y)表示box的center坐标;
(3)ground truth bounding 在第
l
l
l个feature level上的投影坐标:
b
p
l
=
[
x
p
l
,
y
p
l
,
w
p
l
,
h
p
l
]
b{^l_p}=[ x{^l_p}, y{^l_p}, w{^l_p}, h{^l_p}]
bpl=[xpl,ypl,wpl,hpl];
(4)effective obx:
b
e
l
=
[
x
e
l
,
y
e
l
,
w
e
l
,
h
e
l
]
b{^l_e}=[ x{^l_e}, y{^l_e}, w{^l_e}, h{^l_e}]
bel=[xel,yel,wel,hel],它也表示
b
p
l
b{^l_p}
bpl的一部分,缩放比例系数为
ϵ
e
=
0.2
\epsilon_e=0.2
ϵe=0.2(图5中的白色部分);
(5)ignoring obx:
b
i
l
=
[
x
i
l
,
y
i
l
,
w
i
l
,
h
i
l
]
b{^l_i}=[ x{^l_i}, y{^l_i}, w{^l_i}, h{^l_i}]
bil=[xil,yil,wil,hil],它也表示
b
p
l
b{^l_p}
bpl的一部分,缩放比例系数为
ϵ
i
=
0.5
\epsilon_i=0.5
ϵi=0.5(图5中的灰色部分).
classification output是一个WxHxK大小的feature map,K表示物体类别数,那么在坐标为(i,j)的点上是一个长度为K的向量,表示属于每个类别的概率。分支对应的gt是图中白色区域内值为1,表示正样本,黑色区域内值为0,表示负样本,灰色区域是忽略区域不回传梯度。分支采用Focal Loss,整个classification loss是非忽略区域的focal loss之和,然后除以有效区域内像素个数之和来正则化一下。
box regression output是一个WxHx4大小的feature map,那么在坐标为(i,j)的点上是一个长度为4的向量,分别表示4个偏移量。假设一个instance,其在feature level为 l l l对应的有效区域为 b e l b{^l_e} bel,这个instance会影响到 b e l b{^l_e} bel内的每个值。假设坐标为(i,j),长度为4的向量 x i , j l x^l_{i,j} xi,jl表示这个instance的上、左、下、右4边界和(i,j)的距离,然后 x i , j l / S x^l_{i,j}/S xi,jl/S作为最后输出结果,S是一个标准化常量,我们选择S=4。分支采用IoU Loss,整个regression loss是一张图片中每个有效区域的IoU Loss的均值。
在inference阶段,对classification output和regression output的输出进行decode。在每个像素位置 ( i , j ) (i,j) (i,j),假定预测坐标是 [ O t i , j − , O l i , j − , O b i , j − , O r i , j − ] [O_{t_i,j}^-,O_{l_i,j}^-,O_{b_i,j}^-,O_{r_i,j}^-] [Oti,j−,Oli,j−,Obi,j−,Ori,j−],预测距离是 [ S O t i , j − , S O l i , j − , S O b i , j − , S O r i , j − ] [SO_{t_i,j}^-,SO_{l_i,j}^-,SO_{b_i,j}^-,SO_{r_i,j}^-] [SOti,j−,SOli,j−,SObi,j−,SOri,j−],预测映射框是 [ i − S O t i , j − , i − i − S O l i , j − , i − S O b i , j − , i − S O r i , j − ] [i-SO_{t_i,j}^-,i-i-SO_{l_i,j}^-,i-SO_{b_i,j}^-,i-SO_{r_i,j}^-] [i−SOti,j−,i−i−SOli,j−,i−SObi,j−,i−SOri,j−],最后乘以stride = 2 l 2^l 2l就得到了在image上的位置坐标。框的置信度得分和类别可以由classification output maps上位置 ( i , j ) (i,j) (i,j)处的k维向量的最大得分和对应的类别来决定。
2.2 anchor-free branch 怎么和 anchor-based branch 联合起来?
FSAF的设计就是为了达到自动选择最佳Feature的目的,最佳Feature是由各个feature level共同决定。
选择过程如下:
- 每个feature level计算classification loss和box regression loss
其中 N ( b e l ) N(b^l_e) N(bel)是 b e l b^l_e bel区域内像素的数量, F L ( l , i , J ) FL(l,i,J) FL(l,i,J)、 I o U ( l , i , J ) IoU(l,i,J) IoU(l,i,J)分别是 P l P_l Pl特征层的focal loss和IoU loss。 - 在所有feature level中选择loss最小的作为梯度反传。
为了验证自动特征选择的有效性,文章同时对比了heuristic feature selection(启发式特征选择,完全取决于box sizes),该方法就是经典FPN中所采用人工定义方法,实例 I I I被分配到特征金字塔的 P l ′ P_{l'} Pl′层:
这里224是标准的ImageNet预训练的大小, l 0 l_0 l0是一个 w ∗ h = 22 4 2 w*h=224^2 w∗h=2242的实例应该映射的目标层。这里我们选择 l 0 = 5 l_0=5 l0=5,因为ResNet使用来自第五组卷积的feature map进行最终分类。
关于training和inference,
在training中,采用multi-task loss,即 L = L a b + λ ( L c l s a f + L r e g a f ) L=L^{ab} +\lambda(L^{af}_{cls} + L^{af}_{reg}) L=Lab+λ(Lclsaf+Lregaf),其中 L a b L^{ab} Lab是原本anchor-based RetinaNet的总损失, L c l s a f L^{af}_{cls} Lclsaf和 L r e g a f L^{af}_{reg} Lregaf分别是anchor-free分支的总分类和回归损失, λ \lambda λ控制anchor-free分支的权重,我们设置 λ = 0.5 \lambda=0.5 λ=0.5.在推理(inference)时不需要通过 λ \lambda λ做选择。
在inference中,FSAF可以单独作为一个分支输出预测结果,也可以和原来的anchor-based分支同时输出预测结果。两者都存在时,两个分支的输出结果merge(在anchor-free分支在每个金字塔层最多解码前1k个分数最高的预测框,after thresholding the confidence scores by 0.05,然后与anchor-based分支merge)然后NMS得到最后预测结果。
2.实验
ablation study部分分析了anchor-free的必要性,online feature selection的重要性,以及选择的feature level是不是最优的。同时还指出FSAF非常robust和efficient,在多种backbone条件下,都有稳定的涨点。在ResNext-101中,FSAF超过anchor-based1.2个点,同时快了68ms,在AB+FSAF情况下,超过RetinaNet1.8个点,只慢了6ms,效果也是非常显著的。具体参见论文。
参考链接:
知乎: CVPR2019 | 目标检测 FSAF:为金字塔网络的每一层带去最好的样本.
知乎: [CVPR2019]:FSAF for Single-Shot Object Detection.
部分翻译: 论文阅读笔记四十六:Feature Selective Anchor-Free Module for Single-Shot Object Detection(CVPR2019).
才疏学浅,若有纰漏,万望赐教。