FoveaBox 笔记

在这里插入图片描述
2019 年 4 月放到 arxiv 上的(似乎投的是 ICCV2019,没有中?)然后又投了 ICLR2020,没有中,在 这里 可以看到 ICLR 的公开审稿意见,这篇笔记也是关于 ICLR2020 版本的(应该相差不大)。

这也是一篇 anchor-free 的文章,FoveaBox 不用 anchor,直接学类别和回归坐标。通过以下两点来实现:

  1. 对于存在物体的概率预测类别敏感的语义图
  2. 对于每一个位置生成与类别无关的 bbox

目标检测需要解决两个任务:识别和定位。给定一张图片,需要确定图片中是否含有给定类别范围的物体,如果有,还要返回物体的坐标。在之前,定位主要依靠滑动窗口法(sliding window)

深度学习可以自动从数据中学到特征表示,从 Faster RCNN 开始,两阶段的检测器通常使用 anchor-based RPN(region proposal network)来提取局部特征。简而言之,anchor 的目的在于将图片分成离散的盒子,然后在各自盒子中完成对 bbox 的精细调整。anchor 可以看成特征共享的滑动窗口法,其目的仍然是尽可能地去覆盖目标所有可能出现地位置。

但是,anchor 必须精心设计:

  1. anchor 覆盖的密集程度需要精心设计,为了达到尽可能高的召回,需要用到数据集的统计信息
  2. 对于一个数据集的设计并不总能应用到其他地方,影响泛化能力
  3. 在训练时,anchor-based 需要计算 IoU 来进行正负样本的定义,这一步骤耗时并且引入了超参。(讲道理我觉得 IoU 的计算时间没那么夸张吧)

而与之相对,我们人眼并不需要预先定义的形状模板就可以识别并完成定位。也就是说,人类根本不需要枚举候选框,所以很自然地想到 anchor 也许并不是必要的。

FoveaBox 的动机来源于人眼的 fovea:视觉域的中心有着最强烈的视觉敏锐度。

在这里插入图片描述
整体的结构我感觉和 FCOS 很像,也是基于 FPN,然后 detection head 由两个子网络构成:分类和定位

在这里插入图片描述
核心部分:

  • 物体出现概率(Object Occurrence Possibility)

ground truth 定义为 (x1,y1,x2,y2)(x_1,y_1,x_2,y_2) 分别表示左上角和右下角的坐标,首先将其映射到目标 feature level PlP_l 上:

在这里插入图片描述
sls_l 为 feature level 的 stride (FoveaBox 用的 FPN 的尺度为 8, 16, 32, 64, 128),(cx,cy)(c_x,c_y) 为中心点的坐标,然后定义正样本区域 RposR^{pos}

在这里插入图片描述
其中 σ\sigma 是缩减因子,所以正样本区域就是 gt 映射到 feature level 之后形成框框的中间区域;而负样本区域就是剩下所有的区域。预测时每个 feature level 出来的 subnet 维度为 C×H×WC\times H\times W 其中 CC 是种类数,H,WH,W 是 feature map 的大小,每个 channel 表示该类别的概率。由于正样本区域相较于整个区域较小,因此使用了 Focal Loss。

  • 尺度分配 (Scale Assignment)

目标是预测每个物体的坐标,但是直接回归是不稳定的,因为有的很大,有的很小。因此定义一系列的尺度范围,每个 feature level 都对应一个范围,每个 feature level 有一个基准 scale rlr_l ,这个范围计算为:

[rlη,ηrl] [\frac{r_l}{\eta},\eta\cdot r_l]

η\eta 是用来控制范围的,rlr_l 对于 FPN 出来的 5 个 feature level 的取值为 32,64,128,256,512。

  • bbox 预测

每个 gt 是 G=(x1,y1,x2,y2)G=(x_1,y_1,x_2,y_2) ,从 RposR^{pos} 中的一个正样本点 (x,y)(x,y) 出发,FoveaBox 直接计算 (x,y)(x,y) 和 四个边界之间的归一化的偏移:

在这里插入图片描述
即首先将 (x,y)(x,y) 映射回原图,然后计算归一化之后的偏移。

使用 Smooth L1 loss 进行计算。在 box subnet 中,每层 feature level 由 4 个 channel,分别回归 (tx1,ty1,tx2,ty2)(t_{x_1},t_{y_1},t_{x_2},t_{y_2})

  • 网络结构

在这里插入图片描述

  • 实现

很常规,没什么需要很注意的

实验部分

  • 消融实验

不同的 anchor 密度: 通常认为一个位置的 anchor 数量越多,效果越好,但是实验证明,超过 6-9 个时并不会带来更多的提升。

在这里插入图片描述
过于密集的 anchor 不仅会增加前景后景的优化难度,还会产生模糊的位置定义问题。每一个位置有 A 个 anchor,他们的分类目标通过其与 gt 之间的 IoU 来确定,同一个位置对应的 anchor 中,可能有些对应的是正样本,有些对应的是负样本,但是他们共享相同的输入特征,因此分类器不单单要分辨来自不同位置的样本,还要分辨来自相同位置的不同 anchor,这进一步加剧了训练难度。

作为对比,FoveaBox 在每个位置明确预测一个目标。和 anchor-based 相比,有以下好处:

  1. 输出空间降为了原来的 1/A
  2. 没有模糊的位置定义问题,优化目标也更加直接
  3. FoveaBox 有更少的参数,更加灵活

FoveaBox 对于框的分布更加鲁棒: 将 box 根据不同的长宽比进行分类查看效果,发现 FoveaBox 的效果更加鲁棒

在这里插入图片描述
生成高质量的 region proposals: 将分类目标改成类别无关的头是很直接的,并且可以生成 region proposal,FoveaBox 的效果更好。

IoU-based assignment vs. fovea area: 正负样本的定义不同造成的影响:

在这里插入图片描述
更好的检测头+特征对齐: RefineDet 和 RepPoints 都建议进行 feature alignment,所以论文中也用 deformable convolution 搞了一把,效果很好。

在这里插入图片描述
总体对比:

在这里插入图片描述
这个 feature alignment 的操作还是很有意思的,可以涨一个点。

在这里插入图片描述
简单总结:看完 FCOS 后再看这篇,就会发现两者的思想惊人的一致。而 FCOS 后来的 center sampling 的改进其实本质就是 FoveaBox 里面这种选取正样本的操作。

再看看 ICLR 的 review 意见吧,reject 的原因主要还是性能不足,我主观来看确实同期的 FCOS 做的更好一些(FCOS 还有一个 centerness 的分支),但是其实在 FCOS 没有加 center sampling 等一系列的改进之前,效果其实应该是差不多的(R50-FPN 大概在 37.1)

在这里插入图片描述

摘一些比较有启发性的 review:

The scale is still discretized. So that is essentially anchors in the scale space. I wonder how could the approach applies to scale to?

在这里插入图片描述

posted @ 2020-04-16 20:39  winechord  阅读(290)  评论(0编辑  收藏  举报