论文: FoveaBox: Beyond Anchor-based Object Detector
代码: https://github.com/taokong/FoveaBox
作者: Tao Kong, Fuchun Sun, Huaping Liu, Yuning Jiang, Jianbo Shi
一、FoveaBox的提出
大多数state-of-the-art的检测器依赖于anchor boxes来枚举目标对象的可能位置、尺寸和宽高比。在two-stage的检测器中,anchors是预测候选框的回归参考;在one-stage的检测器中,anchors是最终bouding boxes的参考。但是它们的性能和泛化能力受限于anchor boxes的设计。其缺点主要体现在:
- anchor boxes引入了额外的超参数。在设计anchor boxes时的一个重要因素是它可以覆盖多少的对象位置空间。
- 在特定数据集上设计的anchor boxes并不总是适用于其它的应用,这影响了泛化能力。
- 会造成背景-前景的不均衡性
作者考虑到我们人类可以很自然地识别视觉场景中的物体,不需要枚举候选框。受此启发,一个直觉性的问题是,anchor boxes方案是引导物体搜索的最佳方法吗? 如果答案是否定的,我们能否设计出一个精确的不依赖于anchors或者candidate boxes的物体检测框架吗?
为此作者提出了FoveaBox,这是一个anchor-free的object detection框架。FoveaBox主要受人的眼睛的fovea的启发: 视野(对象)的中心具有最高的视敏度。 FoveaBox同时预测object的中心区域位置和在每个有效位置的边界框。
FoveaBox在训练和测试时不依赖于anchor,因此它对bouding boxes的分布更加鲁棒,而且相较于基于anchor的检测器,其泛化能力也更强。
二、FoveaBox的介绍
FoveaBox是一个简单、统一的网络,包括一个骨干网络和两个task-specific的子网络。骨干网络负责提取输入图像的特征。第一个子网络在骨干网络输出的特征图上进行逐像素的分类;第二个子网络在响应的位置进行bounding box的预测。 为了简洁性和公平的对比,这里采用了RetinaNet的设计, 如Figure 4所示。
2.1 Feature Pyramid Network Backbone and Scale Assignment
FoveaBox的骨干网络采取了ResNet(ResNeXt) + FPN, FPN的每一个level负责检测一定尺寸的物体。FoveaBox中构建了 { P l } , l = 3 , 4 , 5 , 6 , 7 \lbrace P_l \rbrace, l = 3, 4, 5, 6, 7 {Pl},l=3,4,5,6,7的金字塔level。 P l P_l Pl level特征图的分辨率是输入图像的 1 2 l \frac{1}{2^l} 2l1。所有金字塔level具有256个通道。
尽管我们的目标是预测目标对象的边界,但是由于对象尺度变化较大,直接预测这些数字不稳定。作者根据特征金字塔的level的数量,将objects的尺寸划分为几个bins,
对于level
P
l
P_l
Pl,basic面积
S
l
S_l
Sl由以下公司计算
S
l
=
4
l
∗
S
0
S_l = 4^l*S_0
Sl=4l∗S0
S
0
S_0
S0设置为 16, 对于level
l
l
l 负责的尺寸范围是
[
S
l
/
η
2
,
S
l
∗
η
2
]
[S_l / \eta ^ 2, S_l * \eta ^ 2 ]
[Sl/η2,Sl∗η2]
η \eta η根据经验设置,来控制每一层金字塔的尺度范围,作者通过试验发现 η = 2 \eta = 2 η=2是一个最好的选择。
在训练时,不在相应尺寸范围的目标对象将会被忽略。要注意的是可能被网络的多个金字塔检测,这是不同于之前方法中只把物体映射到一层特征金字塔。
在这里简单了解一下这个区域范围的特征, l l l层的上限是 S l ∗ η 2 = 4 l ∗ S 0 ∗ η 2 S_l * \eta ^ 2 = 4 ^ l * S_0 * \eta ^2 Sl∗η2=4l∗S0∗η2, l + 1 l+1 l+1层的下限是 S l + 1 / η 2 = 4 l + 1 ∗ S 0 / η 2 S_{l+1} / \eta ^ 2 = 4^{l+1} * S_0 / \eta ^ 2 Sl+1/η2=4l+1∗S0/η2, 两者相除得到 4 / η 4 4/\eta^4 4/η4,当 η > 2 \eta > \sqrt2 η>2时,两者是有交集的。
当
S
0
=
16
,
η
=
2
S_0 = 16, \eta = 2
S0=16,η=2时,level
l
=
3
,
4
,
5
,
6
,
7
l = 3, 4, 5, 6, 7
l=3,4,5,6,7 的检测范围是
[
1
6
2
,
6
4
2
]
,
[
3
2
2
,
12
8
2
]
,
[
6
4
2
,
25
6
2
]
,
[
12
8
2
,
51
2
2
]
,
[
25
6
2
,
102
4
2
]
[16 ^ 2, 64 ^ 2], [32 ^ 2, 128 ^ 2], [64 ^ 2, 256^2], [128 ^ 2, 512 ^ 2], [256 ^ 2, 1024 ^2]
[162,642],[322,1282],[642,2562],[1282,5122],[2562,10242]
2.2 Object Fovea
在每一个level的特征图的分类输出的通道数是K个,即类别的数目。每一个通道是一个二值mask,表示它是该类的一个概率。
下面介绍object的fovea区域和分类分支。
给定输入图像中的一个ground-truth box的左上和右下角的点 ( x 1 , y 1 , x 2 , y 2 ) (x_1, y_1, x_2, y_2) (x1,y1,x2,y2),我们首选将其映射到步长是 2 l 2^l 2l金字塔 P l P_l Pl,
x 1 ∗ = x 1 2 l , y 1 ∗ = y 1 2 l , x 2 ∗ = x 2 2 l , y 2 ∗ = y 2 2 l x_1^* = \frac{x_1}{2^l}, y_1^* = \frac{y_1}{2^l}, x_2^* = \frac{x_2}{2^l}, y_2^* = \frac{y_2}{2^l} x1∗=2lx1,y1∗=2ly1,x2∗=2lx2,y2∗=2ly2
c x ∗ = x 1 ∗ + 0.5 ( x 2 ∗ − x 1 ∗ ) , c y ∗ = y 1 ∗ + 0.5 ( y 2 ∗ − y 1 ∗ ) c_x^* = x_1^* + 0.5(x_2^* - x_1^*), c_y^* = y_1^* + 0.5(y_2^* - y_1^*) cx∗=x1∗+0.5(x2∗−x1∗),cy∗=y1∗+0.5(y2∗−y1∗)
这个物体的fovea(正样本)区域定义为 R p o s = ( x 1 ∗ ∗ , y 1 ∗ ∗ , x 2 ∗ ∗ , y 2 ∗ ∗ ) R^{pos} = (x_1^{**}, y_1^{**}, x_2^{**}, y_2^{**}) Rpos=(x1∗∗,y1∗∗,x2∗∗,y2∗∗), 由如下公式计算得到:
x
1
∗
∗
=
c
x
∗
−
0.5
(
x
2
∗
−
x
1
∗
)
∗
σ
1
x_1^{**} = c_x^* - 0.5(x_2^* - x_1^*)*\sigma_1
x1∗∗=cx∗−0.5(x2∗−x1∗)∗σ1
y
1
∗
∗
=
c
y
∗
−
0.5
(
y
2
∗
−
y
1
∗
)
∗
σ
1
y_1^{**} = c_y^* - 0.5(y_2^* - y_1^*)*\sigma_1
y1∗∗=cy∗−0.5(y2∗−y1∗)∗σ1
x
2
∗
∗
=
c
x
∗
+
0.5
(
x
2
∗
−
x
1
∗
)
∗
σ
1
x_2^{**} = c_x^* + 0.5(x_2^* - x_1^*)*\sigma_1
x2∗∗=cx∗+0.5(x2∗−x1∗)∗σ1
y
1
∗
∗
=
c
y
∗
−
0.5
(
y
2
∗
−
y
1
∗
)
∗
σ
1
y_1^{**} = c_y^* - 0.5(y_2^* - y_1^*)*\sigma_1
y1∗∗=cy∗−0.5(y2∗−y1∗)∗σ1
σ 1 \sigma_1 σ1是缩小系数,论文中设置为0.3。fovea区域内部的cell被赋予这个标签groud-truth box的标签
通过 σ 2 \sigma_2 σ2产生 R n e g R^{neg} Rneg,论文中设置为0.4。负区域指的是特征图中除了 R n e g 的 区 域 R^{neg}的区域 Rneg的区域,如果一个cell既不是正样本,也不是负样本,在训练时将会忽略。由于正(fovea)区域在整个特征图中只占一小部分,所以这里使用Focal Loss来训练这个分支的分类误差。
2.3 Box Prediction
Object fovea仅编码对象目标存在的可能性,为例确定其位置,还需要对每一个潜在的实例预测bouding box。 对于任意一个ground-truth bounding box G = ( x 1 , y 1 , x 2 , y 2 ) G = (x_1, y_1, x_2, y_2) G=(x1,y1,x2,y2),我们的目标是使特征图(x, y)位置的网络输出 ( t x 1 , t y 1 , t x 2 , t y 2 ) (t_{x1}, t_{y1}, t_{x2}, t_{y2}) (tx1,ty1,tx2,ty2)通过变换可以映射到 G G G。
t
x
1
=
l
o
g
2
l
(
x
+
0.5
)
−
x
1
z
t_{x1} = log\frac{2^l(x + 0.5) - x_1}{z}
tx1=logz2l(x+0.5)−x1
t
y
1
=
l
o
g
2
l
(
y
+
0.5
)
−
y
1
z
t_{y1} = log\frac{2^l(y + 0.5) - y_1}{z}
ty1=logz2l(y+0.5)−y1
t
x
2
=
l
o
g
x
2
−
2
l
(
x
+
0.5
)
z
t_{x2} = log\frac{x_2 - 2^l(x + 0.5)}{z}
tx2=logzx2−2l(x+0.5)
t
y
2
=
l
o
g
y
2
−
2
l
(
y
+
0.5
)
z
t_{y2} = log\frac{y_2 - 2^l(y + 0.5)}{z}
ty2=logzy2−2l(y+0.5)
z = S l z = \sqrt {S_l} z=Sl是将输出空间投影到以1为中心空间的归一化因子。论文中使用smooth L1 Loss训练预测框的误差。
对于bouding box的训练,我们将在 R n e g 内 部 的 c e l l 都 参 与 训 练 , 这 与 分 类 的 训 练 是 不 同 的 。 R^{neg}内部的cell都参与训练,这与分类的训练是不同的。 Rneg内部的cell都参与训练,这与分类的训练是不同的。
2.4 Inference
在预测时作者采用了常规的方法,流程如下:
- 首先使用0.05的confidence阈值过滤掉低的预测
- 根据score选择top-1000的bboxes
- 分别对每类使用NMS(阈值是0.5)
- 对于每一张图像,根据score选择top-100的预测
三、FoveaBox的实验结果
四、FoveaBox的不足
五、疑惑
- 金字塔的level 3, 4, 5, 6, 7是如何实现的? (待查看源码)
- 在预测时选择top-100,之后呢?需要怎么处理这100个候选框呢?