自从anchor方法在目标检测领域出现时,就以其良好的效果被用于各种算法中,如yolo、SSD等等。但是anchor生成是按照预先设置好的规则来生成了,为了保证算法的检测效果,需要生成大量的anchor,其中绝大部分都是没用的anchor,为了提升这部分的效率,并保证效果,Jiaqi Wang等人在"Region Proposal by Guided Anchoring"文章中提出Guided anchor方法。这个方法能生成少量的但是有效的anchor,如下图所示,其效果很明显。
1、文章思路
目标的位置和输入的图像相关,目标的大小和输入的图像以及位置相关。假设box的参数为
(
x
,
y
,
w
,
h
)
(x, y, w, h)
(x,y,w,h),其中
(
x
,
y
)
(x, y)
(x,y)是box的中心位置,
w
w
w和
h
h
h分别是box的宽度和高度,则对于给定的一副图像
I
I
I,其对应box的概率为:
p
(
x
,
y
,
w
,
h
∣
I
)
=
p
(
x
,
y
∣
I
)
p
(
w
,
h
∣
x
,
y
,
I
)
p(x, y, w, h|I) = p(x, y|I)p(w, h|x, y, I)
p(x,y,w,h∣I)=p(x,y∣I)p(w,h∣x,y,I)
2、网络架构
首先作者设计了一个anchor生成模块,这个模块包含两个部分:位置预测和大小预测。而不同位置的anchor,其特征范围是不一样的,因此作者设计了一个特征自适应模块(feature adaptation module)。主干网络采用FPN时,其网络结构如下图:
3、网络详细描述
3.1 anchor位置预测
位置预测输出的是某个位置
(
i
,
j
)
(i, j)
(i,j)存在anchor的概率
p
(
i
,
j
∣
F
I
)
p(i, j | F_I)
p(i,j∣FI)。产生这个概率的是一个
1
×
1
1\times1
1×1的卷积层+sigmoid函数。概率大于预先定义的阈值
ϵ
L
\epsilon_L
ϵL。
3.2 anchor大小预测
大小预测分支为每个位置预测最佳的大小
(
w
,
h
)
(w, h)
(w,h)。但是直接预测大小会导致精度不高,其原因是目标的大小变化范围比较大。因此采用如下的等式:
w
=
σ
⋅
s
⋅
e
d
w
,
h
=
σ
⋅
s
⋅
e
d
h
w=\sigma \cdot s \cdot e^{dw}, h=\sigma \cdot s \cdot e^{dh}
w=σ⋅s⋅edw,h=σ⋅s⋅edh
大小预测分支输出
d
w
,
d
h
dw, dh
dw,dh,然后用上式计算出
(
w
,
h
)
(w, h)
(w,h)。
s
s
s是步长,
σ
\sigma
σ是一个经验值,文章中取值为
σ
=
8
\sigma=8
σ=8。
大小预测分支的网络构成如下:
1
×
1
1\times1
1×1网络输出两通道的数据,分别表示
d
w
dw
dw、
d
h
dh
dh,然后计算真是位置的层。
3.3 anchor-Guided特征自适应
为什么需要这个网络结果:在传统的RPN或者单阶段检测器,特征层上每个位置上的anchor具有相同的大小和尺度,因此特征层可以具有一直的表达。但是在Guided anchor模型中,anchor的大小随着位置的变化而变化,因此不能按以前的方式生成特征层。
理论上,大的anchor是在大区域上生成特征,而小的anchor是在小区域上生成特征。按照这个原则来设计anchor-guided特征自适应模块。在每个位置上按照anchor大小来生成特征:
f
i
l
=
N
T
(
f
i
,
w
i
,
h
i
)
\bold{f}_i^l = N_T(\bold{f}_i, w_i, h_i)
fil=NT(fi,wi,hi)
其中
f
i
\bold{f}_i
fi是在第
i
i
i个位置上的特征,
(
w
i
,
h
i
)
(w_i, h_i)
(wi,hi)是其对应的anchor的大小。
其网络结构如下:采用
3
×
3
3\times3
3×3可变形卷积层。首先预测anchor的大小,然后利用可变形卷积层来获取
f
I
l
f_I^l
fIl。然后再进行分类以及box的回归。
3.4 训练
1)目标函数
训练的目标函数是由传统的分类回归损失(
L
c
l
s
L_{cls}
Lcls,
L
r
e
g
L_{reg}
Lreg)和anchor定位(
L
l
o
c
L_{loc}
Lloc)和大小(
L
s
h
a
p
e
L_{shape}
Lshape)预测损失组成:
L
=
λ
1
L
l
o
c
+
λ
2
L
s
h
a
p
e
+
L
c
l
s
+
L
r
e
g
L=\lambda_1L_{loc}+\lambda_2L_{shape}+L_{cls}+L_{reg}
L=λ1Lloc+λ2Lshape+Lcls+Lreg
2)anchor定位
定位anchor位置时,希望在ground-truth boxes中心位置的anchor多,远离中心位置的anchor少,并且获取较大的IOU。文章中作者定义了三个区域:
a)中心区域
C
R
=
R
(
x
g
′
,
y
g
′
,
σ
1
w
′
,
σ
1
h
′
)
CR=R(x_g', y_g', \sigma_1w', \sigma_1h')
CR=R(xg′,yg′,σ1w′,σ1h′),在中心区域的点都是正样本;
b)忽略区域
I
R
=
R
(
x
g
′
,
y
g
′
,
σ
2
w
′
,
σ
2
h
′
)
−
C
R
IR=R(x_g', y_g', \sigma_2w', \sigma_2h')-CR
IR=R(xg′,yg′,σ2w′,σ2h′)−CR,其中
σ
2
>
σ
1
\sigma_2>\sigma_1
σ2>σ1。这部分区域在训练时,不向后传递梯度。
c)外围区域
O
R
OR
OR:除去
C
R
CR
CR和
I
R
IR
IR的区域其他部分。这个部分当作负样本区域。
作者是在FPN上使用这个模块,因此需要考虑相邻特征层之间的影响。每一个特征层应该只对应一个范围内的尺度。只有一个特征层的尺度满足目标映射到该层的尺度时,才将该目标的 C R CR CR区域设置在该层。
loss采用Focal loss
3)anchor大小
确定每个anchor的最佳大小分为两步:首先需要确定和ground-truth box匹配的anchor;其次预测能覆盖box的最好的宽和高。Guided anchor中的宽和高是一个变量,而不是预先定义好的。因此需要采用与之前方法不同的方法。
定义可变anchor
a
w
h
=
{
(
x
0
,
y
0
,
w
,
h
)
∣
w
>
0
,
h
>
0
}
a_{wh}=\{(x_0, y_0, w, h) | w > 0, h >0\}
awh={(x0,y0,w,h)∣w>0,h>0}和ground truth box
g
t
=
(
x
g
,
y
g
,
w
g
,
h
g
)
gt=(x_g, y_g, w_g, h_g)
gt=(xg,yg,wg,hg)的
I
O
U
IOU
IOU为
v
I
o
U
vIoU
vIoU
v
I
o
U
(
a
w
h
,
g
t
)
=
m
a
x
w
>
0
,
h
>
0
I
o
U
n
o
r
m
a
l
(
a
w
h
,
g
t
)
vIoU(a_{wh}, gt) = \underset{w>0,h>0}{max}IoU_{normal}(a_{wh}, gt)
vIoU(awh,gt)=w>0,h>0maxIoUnormal(awh,gt)
其中
I
o
U
n
o
r
m
a
l
IoU_{normal}
IoUnormal是
I
o
U
IoU
IoU的typical定义。
但是计算
v
I
o
U
(
a
w
h
,
g
t
)
vIoU(a_{wh}, gt)
vIoU(awh,gt)是非常复杂的,很难在端到端的网络上实现。因此对于给定点
(
x
0
,
y
0
)
(x_0, y_0)
(x0,y0),用若干个常用的
w
w
w和
h
h
h的值来代表所有的值。然后用这些采样的值来计算
v
I
o
U
(
a
w
h
,
g
t
)
vIoU(a_{wh}, gt)
vIoU(awh,gt)。文章中,在训练阶段,作者用了9对
(
w
,
h
)
(w, h)
(w,h)来估算
v
I
o
U
vIoU
vIoU。
大小的损失函数定义如下:
L
s
h
a
p
e
=
L
1
s
(
1
−
m
i
n
(
w
w
g
,
w
g
w
)
)
+
L
1
s
(
1
−
m
i
n
(
h
h
g
,
h
g
h
)
)
L_{shape}=L_1^s(1-min(\frac{w}{w_g}, \frac{w_g}{w})) + L_1^s(1-min(\frac{h}{h_g}, \frac{h_g}{h}))
Lshape=L1s(1−min(wgw,wwg))+L1s(1−min(hgh,hhg))
(
w
,
h
)
(w, h)
(w,h)和
(
w
g
,
h
g
)
(w_g, h_g)
(wg,hg)分别表示预测的大小和对应ground-truth box的大小。
L
1
s
L_1^s
L1s是平滑的
L
1
L_1
L1 loss。