在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 λ做选择。

Image

论文地址: https://arxiv.org/abs/1903.00621. 作者在B站解读视频:https://www.bilibili.com/video/av49972561/. 注:本文在查阅时发现了两篇知乎专栏写的很好的解读,在文末给出链接,因此这里就仅仅给出整理,并添加了一些细节性的东西。 先看看效果,论文提出的特征选择无锚点模块(FSAF)应用在单阶段检测器RetinaNet上,使用ResNeXt-101在COCO数据集上达到单阶段SOTA,map提升了1.8%仅多用了6ms。如图,FSAF对小的物体效果更好。

Image

(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之和,然后除以有效区域内像素个数之和来正则化一下。

很明显,要想取代上述的分配方式,那么“把 FPN 上所有层的所有 anchor 全部拿过来,和 ground-truth 计算 IoU”这一步就不能有。因此作者提出了一个 anchor-free 的 module,称为 FSAF,大体思想是在每一层都插入这个模块,尝试不用 anchor 去检测 instance,而后看看哪一层的 FSAF 对于这个 instance 的损失最小,不就可以认为这一层是最适合检测这个 instance 的吗? 接着 FSAF 大喊一句“安排”!!!把这个物体安排到这个层,再用 anchor-based 的模块去检测.我们将提出的FSAF模块嵌入到retinaNet,实际上它可嵌入到任何带有特征金字塔结构的的单阶段检测器。

参考链接: 知乎: CVPR2019 | 目标检测 FSAF:为金字塔网络的每一层带去最好的样本. 知乎: [CVPR2019]:FSAF for Single-Shot Object Detection. 部分翻译: 论文阅读笔记四十六:Feature Selective Anchor-Free Module for Single-Shot Object Detection(CVPR2019).

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,效果也是非常显著的。具体参见论文。

Image

这里插一段先介绍一下图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计算损失的呢?

为解决目标检测的一大挑战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(启发式) 的,可能会使得选择的特征不是最优的,从而影响检测器的性能。

在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维向量的最大得分和对应的类别来决定。

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的均值。