前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Feature Selective Anchor-Free Module for Single-Shot Object Detection(文献阅读)

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

作者头像
狼啸风云
修改2022-09-04 21:55:34
1.9K0
修改2022-09-04 21:55:34
举报

问题:

目标的多尺度变化在目标检测中是一个很重要的问题,利用特征层多尺度(或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}{N\left(b_{e}^{l}\right)} \sum_{i, j \in b_{e}^{l}} F L(l, i, j)

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

N\left(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}+\lambda\left(L^{a f}+L_{\text {reg }}^{a f}\right) 。在所有实验中设置\lambda=0.5,虽然结果对精确值是可靠的。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年06月06日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题:
  • 动机:
  • 解决方法:
    • (1)如何在网络中创建无锚分支
      • (2)如何生成无锚分支的监督信号
        • (3)如何为每个实例动态选择feature level
          • (4)如何联合训练和测试无锚分支和基于锚的分支
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档