Feature Selective Anchor-Free Module for Single-Shot Object Detection(文献阅读)

2022-09-04 21:55:34 浏览数 (1)

问题:

目标的多尺度变化在目标检测中是一个很重要的问题,利用特征层多尺度(或anchor多尺度)是一种有效的解决方案。Anchor box用于将所有可能的Instance box离散为有限数量的具有预先定义的位置、尺度和纵横比的box。Instance box和Anchor box基于IOU重叠率来匹配。当这种方法集成到特征金字塔的时候,大的anchor通常和上部的特征相映射,小的anchor通常和下部的特征相映射,如下图所示。这是基于启发式的,即上层特征图有更多的语义信息适合于检测大的目标,而下层特征图有更多的细粒度细节适合于检测小目标。然而,这种设计有两个局限性:1)启发式引导的特征选择;2)基于覆盖锚取样。在训练过程中,每个实例总是根据IoU重叠匹配到最近的锚盒。而锚框则通过人类定义的规则(如框的大小)与特定级别的功能映射相关联。因此,为每个实例选择的特性级别完全基于自组织启发式。例如,一个汽车实例大小50×50像素和另一个类似的汽车实例规模60×60像素可能分配到两个不同的特征层,而另一个40×40像素大小的实例可能被分配到和50x50相同的特征层,如下图所示。

换句话说,锚匹配机制本质上是启发式引导的。这导致了一个主要缺陷,即用于训练每个实例的所选特性级别可能不是最优的。

动机:

我们的动机是让每个实例自由地选择最佳级别的特性,以优化网络,因此在我们的模块中不应该存在约束特性选择的锚框。本文提出了FSAF模块(Feature Selective Anchor-Free)模块来同时解决这两个局限性。相反,我们以无锚的方式对实例进行编码,以了解用于分类和回归的参数。下图给出了一般概念。每个层次的特征金字塔都构建一个无锚分支,独立于基于锚的分支。与基于锚的分支类似,它由分类子网和回归子网组成。可以将实例分配到无锚分支的任意级别。在训练过程中,我们根据实例内容动态地为每个实例选择最合适的特性级别,而不是仅仅根据实例框的大小。然后,所选的特性级别将学习检测所分配的实例。在推断时,FSAF模块可以独立运行,也可以与基于锚的分支联合运行。FSAF模块与主干网无关,可以应用于具有特征金字塔结构的单阶段检测器。此外,无锚分支的实例化和在线特性选择可以是多种多样的。在这项工作中,我们保持我们的FSAF模块的实现简单,相对于整个网络其计算成本很边缘化。

解决方法:

(1)如何在网络中创建无锚分支

从网络的角度来看,FSAF模块非常简单。下图说明了带有FSAF模块的RetinaNet的体系结构。简而言之,RetinaNet由一个主干网络和两个特定于任务的子网组成。特征金字塔由P3到P7的骨干网构成,其中l为金字塔级,P_l 为输入图像的1/2^l 分辨率。为了简单起见,只显示了三个级别。金字塔的每一层都用于探测不同尺度的物体。为此,P_l 附加了classification subnet和regression subnet,它们都是小型的全卷积网络。分类子网为每个A锚和K个对象类预测对象在每个空间位置的概率。如果存在,回归子网预测每个A锚到附近实例的4维类无关偏移量。

在RetinaNet的顶部,FSAF模块仅为每个金字塔层引入两个额外的conv层,上图中虚线特征图所示。这两层分别负责无锚分支的分类和回归预测。更具体地说,分类子网中的feature map上附加了一个带有K个filter的3×3 conv层,后面是sigmoid函数,与基于ancho分支的feature map并行。它预测对象在每个空间位置上的叉对象类的概率。同样的,回归子网中的feature map上也附加了一个3×3 conv层,带有四个filter,然后是ReLU函数。它负责预测以无锚定方式编码的框偏移量。为此,无锚和基于锚的分支以多任务的方式联合工作,共享每个金字塔级别的特性。给定一个目标实例,一直标签k 和bounding box坐标b=[x, y, w, h](x,y)是目标中心坐标,(w,h) 是目标的宽和高。在训练期间实例被分配到任意P_l 层上。定义投影box b_{p}^{l}=left[x_{p}^{l}, y_{p}^{l}, w_{p}^{l}, h_{p}^{l}right] 作为b在P_l 上的投影,也就是b_{p}^{l}=b / 2^{l} ,也定义有效box b_{e}^{l}=left[x_{e}^{l}, y_{e}^{l}, w_{e}^{l}, h_{e}^{l}right] 并且忽略box b_{e}^{l}=left[x_{e}^{l}, y_{e}^{l}, w_{e}^{l}, h_{e}^{l}right] ,通过固定尺度因子varepsilon_{e} varepsilon_{i} 分别控制b^l_eb^l_i 作为b^l_p 的部分区域。本文分别设置varepsilon_{e}=0.2 varepsilon_{i}=0.5 ,以车为实例,如下图所示。

(2)如何生成无锚分支的监督信号

ground-turuth对分类的输出是K maps,每个map对应一个类。实例用三种方式影响第k阶的ground-truth map。首先有效box b_{e}^{l} 区域是由1填充的正区域,如上图中车的类map中的白色box所示。第二,排除了effective box的the ignoring box b_{i}^{l}-b_{e}^{l} 是ignoring区域如上图中的灰色区域所示,这意味着这个区域的梯度不会向网络回传。邻近特征层存在ignoring box left[b_{i}^{l-1}, b_{i}^{l 1}right] 也是ignoring region。注意,如果两个实例的有效框在一个级别上重叠,则较小的实例具有更高的优先级。地面真相图的其余区域是由零填充的负(黑色)区域,表示没有对象。Focal loss应用在监督中,超参设置为alpha=0.25, gamma=2.0 。图像无锚分支的分类总损失是所有非忽略区域上的Focal loss之和,由所有有效盒区域内的像素总数归一化。

    回归输出的基本事实是4个与类无关的偏移映射。在补偿map上实例仅仅影响b_{e}^{l} 区域。对b_{e}^{l} 内部的每个像素(i, j) ,把投射box b_{p}^{l} ,表示成一个四维的向量d_{i, j}^{l}=left[d_{t_{i, j}}^{l}, d_{l_{i, j}}^{l}, d_{b_{i, j}}^{l}, d_{r_{i, j}}^{l}right] , d^l_t ,d^l_l,d^l_b,d^l_r

分别是当前像素位置(i,j)到顶、左、底、右边界的距离。在当前像素(i,j)处通过四个补偿map得到的四维向量,设置成d_{i, j}^{l} / S ,每个map对应一个维。S是一个归一化常数,在工作时经验上选择S=4.0。有效框外的位置是忽略梯度的灰色区域。采用IoU损失进行优化。图像无锚分支的总回归损失是所有有效盒区域IoU损失的平均值。

在推理过程中,很容易从分类和回归输出中解码预测框。在每个像素位置(i,j),假设预测补偿是left[hat{o}_{t_{i, j}}, hat{o}_{l_{i, j}}, hat{o}_{b_{i, j}}, hat{o}_{r_{i, j}}right] ,预测距离为left[S hat{o}_{t_{i, j}}, S hat{o}_{l_{i, j}}, S hat{o}_{b_{i, j}}, S hat{o}_{r_{i, j}}right] 。左上角和右下角预测的box分别为left(i-S hat{o}_{t_{i, j}}, j-S hat{o}_{l_{i, j}}right)left(i S hat{o}_{b_{i, j}}, j S hat{o}_{r_{i, j}}right) 。进一步将投影框放大2^l ,得到图像平面中的最终框。框的置信度和类别由分类输出图上位置(i, j)处k维向量的最大得分和对应的类决定。

(3)如何为每个实例动态选择feature level

无锚分支的设计允许使用任意金字塔级P_l 的特性来学习每个实例。为了找到最优的特性级别,我们的FSAF模块根据实例内容选择最佳Pl,而不是像基于锚的方法中那样选择实例框的大小。给定一个instance I,我们定义在P_l 上的分类损失和回归损失分别为L_{F L}^{I}(l)L_{I O U}^{I}(l) 。在有效区域b_{e}^{l} 上对Focol loss和IoU loss取平均值得到,例如,

L_{F L}^{I}=frac{1}{Nleft(b_{e}^{l}right)} sum_{i, j in b_{e}^{l}} F L(l, i, j)

L_{I o U}^{I}=frac{1}{Nleft(b_{e}^{l}right)} sum_{i, j in b l} operatorname{IoU}(l, i, j)

Nleft(b_{e}^{l}right)b_{e}^{l} 内部的像素数,F L(l, i, j)operatorname{IoU}(l, i, j) 分别是P_l 上在(i.j) 位置上的Focal loss和IoU loss的平均值。下图给出了在线选择的过程。

 首先,实例I前向传播经过所有特征金字塔,然后在所有anchor-free分支中分别计算L_{F L}^{I}L_{I o U}^{I} ,最终最佳尺度层P_{l *} 产生从实例中学到的最小损失和。

l^{*}=underset{l}{arg min } L_{F L}^{I}(l) L_{I o U}^{I}(l)

对于训练批处理,将为其相应分配的实例更新特性。直观的感觉是,所选的特性目前是对实例建模的最佳特性。它的损失在特征空间中形成一个下界。通过训练,我们进一步拉下这个下界。在推理时,我们不需要选择特征,因为最合适的特征金字塔水平自然会输出较高的置信度得分。

(4)如何联合训练和测试无锚分支和基于锚的分支

当插入RetinaNet时,我们的FSAF模块与基于锚的分支协同工作。保持了基于锚的分支的原始性,在训练和推理过程中,所有超参数都保持不变。

推断:FSAF模块只是在全卷积的视神经网络上增加了几个卷积层,所以推理仍然像通过网络转发图像一样简单。对于无锚点的分支,我们只解码每个金字塔级别中得分最高的1k个位置的框预测,然后将置信值阈值化0.05。这些来自各个级别的顶级预测与基于锚点的分支的box预测合并,然后是阈值为0.5的非最大抑制,得到最终的检测结果。

初始化:主干网络在ImageNet 1k上进行训练,如Focal loss一样对Retinanet进行初始化。对FASF模块中的卷积层用-log ((1-pi) / pi)sigma=0.01 的权重来初始化卷积层,π指定了开始训练的时候每个像素位置在π处输出对象的分数。我们将π= 0.01以下。所有box 回归层初始化用bias b和一个σ= 0.01的高斯权重来初始化。我们在所有实验中使用b = 0.1。初始化有助于在早期迭代中稳定网络学习,避免了较大的损失。

优化:整个网络的损失是无锚和基于锚的分支的综合损失。假设L^{a b} 是原始基于RetinaNet总共的损失。并且令L_{c l s}^{a f}L_{text {reg }}^{a f} 分别是anchor-free分支总共的分类损失和总共的回归损失。整体优化的损失是 L=L^{a b} lambdaleft(L^{a f} L_{text {reg }}^{a f}right) 。在所有实验中设置lambda=0.5,虽然结果对精确值是可靠的。

0 人点赞