background
在single-stage模型中,通常定义一系列不同宽高比的、稠密的、均匀分布的anchor-box,这些anchor-box会根据其不同的尺寸大小和不同的feature map联系起来。
以FPN为结构的检测器中,anchor-box分配到对应的 ground-truth 方式如下:
- 将FPN 上所有feature map的所有 anchor-box 与图像中的 ground-truth 计算 IoU,
- 设定的阈值或者是选择最大的 IoU,可以得到这个 ground-truth 的 positive-anchor。
如上所说,在anchor匹配ground-truth阶段,ground-truth与anchor匹配就确定ground-truth属于哪些anchor,这个决定了ground-truth会由哪层feature map负责预测:
- 深层的feature map分辨率高,得到的anchor数量多尺寸小,对应的小的ground-truth 被分配到高分辨率层上
- 浅层的feature map分辨率低,得到的anchor数量少尺寸大,对应的大的ground-truth 被分配到低分辨率层上
这样的设计作者认为它是启发式的,仅仅利用框的大小来决定哪些feature map来检测物体是一种暴力的做法,可能会使得选择的特征不是最优的,从而影响检测器的性能。
上图所示,60x60大小的car和50x50大小的car被分在了不同feature map,50x50和40x40的被分在了同一级feature map,我们无法证明这种方法是不是最好。所以换个思路:让模型自己学习来选择合适的feature map去做预测。
Feature Selective Anchor-Free Module (FSAF)
FSAF模块让每个instance自动的选择最合适的feature map,anchor box的大小不再决定选择哪些feature map进行预测(anchor-free),也就是说哪一层的 FSAF 对于这个实例的损失最小,则可以认为该层是最适合检测这个实例。下图为RetinaNet+FSAF模块:
- 在特征金字塔的每一层构建一个anchor-free的分支且与anchor-based分支 相互独立。
- ancho-freer分支也包含分类(class)与回归(box)两个子网络(subnet)。
- 一个实例可以被分配到任意层的anchor-free分支上。
- 训练时,基于实例的内容而不是实例框的大小动态的为每个实例选择最适合的特征层次。
- FSAF与backbone无关,同时可以应用在具有特征金字塔的单阶段检测中。
那么会引入以下问题:
- 如何创建anchor-free branch
- 如何监督(训练)anchor-free branch
- 如何为每个实例动态选择特征
- 如何结合anchor branch与anchor-free branch
---建立---
RetinaNet:
- 在FPN每层feature map的后面添加分类及回归子网络,二者都为全卷积网络。
- 分类网络预测每个位置的A个anchor及K个类别的分数值
- 回归分支预测A个anchor框距离ground truth的偏差值
RetinaNet+FSAF:
我们可以看到:在RetinaNet的输出端,FSAF在每层引入了额外的两层卷积层。
- class subnet 加了一层(3x3-k)conv layer,用于anchor-free branch的分类,该卷积层添加到分类分支的输出,后接sigmoid函数,与anchor-based branch分支部分相互平行,其作用是预测目标物在每个位置上K个类别的概率值。
- box subnet 加了一层 (3x3-4)conv layer,用于anchor-free branch的回归,该卷积层添加到回归分支的输出,后接ReLU函数,与anchor-based branch分支部分相互平行,其作用是以anchor-free的方式编码的预测框偏移量。
- anchor-based与anchor-free每层共享特征以多任务的方式进行运作。
---监督(Ground-truth and loss)---
如上图所示,对于一个instance类别为k,bounding box坐标为b=[x,y,w,h],它映射到第 层feature level上的坐标为
,定义一个有效区域
,其占
的
,文章设定了
=0.2。同时定义一个忽略区域
,其占
的
,文章设定
=0.5。ignore 区域的相邻层的区域(
,
)特征也是被看作是忽略的,如果同一层中有两个实例发生了重叠,则以小区域的优先级较高。白色是有效区域,灰色是忽略区域。
Classification Output:
为一个WxHxK大小的feature map,K表示物体类别数,那么对于坐标为(i,j)的点,其是一个长度为[1xK]的向量,表示属于每个类别的概率。分支对应的gt是图中白色区域内值为1,表示正样本,黑色区域内值为0,表示负样本,灰色区域是忽略区域不回传梯度。分支采用Focal Loss(α = 0.25&γ = 2.0),整个classification loss是非忽略区域的focal loss之和,然后除以非忽略区域内像素个数之和进行正则化。
Box Regression Output:
回归输出的是与类别无关的4个offset maps,实例只作用于offeset maps上的有效区域,对于该区域内的每个像素,用一个四维的向量表示映射框
。[
,
,
,
] 表示该instance的上、左、下、右4边界和坐标(i,j)的距离。该向量做了一个正则化处理
,分别作用于四个offset maps中的每一个,其中根据经验设置s=4.0,超出有效框的位置为ignore 区域,即灰色区域,该区域的梯度值被忽略。分支采用IoU Loss,整个regression loss是一张图片中每个非忽略区域的IoU Loss的均值。
在inference阶段,对classification output和regression output的输出进行decode,过程也很简单。假设像素坐标为(i,j),对应的偏移量为 ,decode过程为:
最后乘以stride = 就得到了在image上的位置坐标。confidence score由(i,j)位置K向量最大值决定。
值得注意的是,FSAF模块没有了anchor scale、aspect ratio等概念,是一个anchor-free的检测方法。
---动态选择特征---(Online feature selection):
自动选择特征:
- 对于每个instance通过特征金字塔所有层,计算每个feature level的classification loss和box regression loss。
- 计算loss = classification loss + box regression loss
- 在所有feature level中选择loss最小的作为监督信号(梯度)反传。
具体过程如下图:
Joint Inference and Training
如果不采用 loss 决定分配层,而是采用 FPN 应用于 two-stage 中公式 来选层的话,对于 anchor-free branch,AP 下降了 1.2 (35.9 → 34.7),当有 anchor-based branch 后,采用 online feature selection 可以比公式选层增加 1.1 的 AP(36.1 → 37.2)。
online feature selection 分配的框和 RetinaNet 分配的框有什么区别如下图。作者说,总体上 FSAF 还是遵循了上层选择较大的实例,下层负责较小的实例( upper levels select larger instances, lower levels are responsible for smaller instances)。然而有很多例外,即online feature selection不同于只用anchor-free branch来选框。我们将这些异常标记为红色的框。绿色框表示双方都检测出来的框。通过捕获这些例外,我们的FSAF模块可以使用更好的功能,进一步提升了 AP 。
利用多尺度训练和测试,在 ResNeXt-101-64x4d 的backbone 下达到了 44.6 的 AP。在时间消耗方面,作者声称在 ResNeXt-101 下比原来 RetinaNet 慢了6ms。