论文
SSD
SSD是在YOLO之后出的一个single stage的检测模型,精度与Faster R-CNN相当,但速度可以达到59FPS。
SSD的模型架构
特征提取
采用VGG-16提取特征,将两个全连接层换成了两个卷积层,并在后面额外增加了4组共计8个卷积层(每一组都是1×1卷积接3×3卷积),这样得到了多个尺度不同的特征图。
anchors生成
anchor在原文中称为default box
特征图上每一个格子称为cell,在特征图每一个cell中设置大小形状不同的anchor。假设特征图大小是 m × n × c m×n×c m×n×c,每个cell中设置anchor的个数是k,那么这个特征图产生的anchor的总个数是 m ⋅ n ⋅ k m\cdot n \cdot k m⋅n⋅k。
例如这个8×8的特征图,每个cell设置3个anchor,那么总的anchor个数是8×8×3=192
不同尺寸的特征图上anchor的感受野不一样,为了充分利用提取出来的特征,保证大物体和小物体都能得到好的检测效果,再不同的feature maps上生成anchor。
层 | 特征图大小 | cell中anchor个数 | anchor总个数 |
---|---|---|---|
conv4_3 | 38*38 | 4 | 5776 |
conv7 | 19*19 | 6 | 2166 |
conv8_2 | 10*10 | 6 | 600 |
conv9_2 | 5*5 | 6 | 150 |
conv10_2 | 3*3 | 4 | 36 |
conv11_2 | 1*1 | 4 | 4 |
总计共生成8732个anchors。相比于YOLO 7×7×2=49,多出了很多,所以能解决YOLO召回率低的问题。
预测
对每一个anchor,要预测4个位置变换参数(anchor相对于gt box应该进行的变换参数)和C个类别概率。总共(C+4)个参数。二者都是通过一个 3 ∗ 3 3*3 3∗3的卷积来完成,如下图所示。
假设特征图大小5×5,anchor数为3。因此总共anchor数为75;在预测位置变换参数的分支上,每个cell需要预测4×3(3指anchor个数)个参数;在预测类别概率上,每个cell需要预测21×3的参数(21为类别,3为anchor数)
对类别参数取softmax函数,就能得到每个anchor哪个类别概率最大以及概率具体的值。
非极大值抑制
根据生成的预测结果,执行非极大值抑制算法,就能得到预测结果。
训练
匹配策略
训练的时候要为生成的anchor指定gt,由于生成的anchor很多,但真正和gt有大部分重叠的只是一小部分。对于和gt有较大重叠部分的,训练的时候更容易回归到gt的位置。在为anchor指定gt的时候,流程如下
- 首先,对每一个gt,找到与之IoU最大的anchor,设定该anchor的gt;
由于生成的anchor很多,gt很少,这样正样本数目仍然很少,因此执行第二个原则。
- 其次,对于剩下每一个anchor,找到与其IoU最大的gt,若IoU大于0.5,则将该anchor的目标定为该gt。注意!一个anchor只能对应一个gt,而一个gt可以对应多个anchor。标记该anchor为正样本
- 最后,由于这样正样本的数目还是远少于负样本数目,因此在计算损失时要限制负样本的数目。选取背景置信度较小(置信度误差较大)的负样本,使得正负样本数目在1:3左右。
损失函数
损失函数包含置信度损失和位置损失:
L
(
x
,
c
,
l
,
g
)
=
1
N
(
L
c
o
n
f
(
x
,
c
)
+
α
L
l
o
c
(
x
,
l
,
g
)
)
L(x, c, l, g)=\frac{1}{N}\left(L_{conf}(x, c)+\alpha L_{l o c}(x, l, g)\right)
L(x,c,l,g)=N1(Lconf(x,c)+αLloc(x,l,g))
- c 置信度
- l l l预测框体
- g g g实际框体
- N N N正样本数目
先看位置损失:
L
l
o
c
(
x
,
l
,
g
)
=
∑
i
∈
Pos
N
∑
m
∈
{
c
x
,
c
y
,
w
,
h
}
x
i
j
k
smooth
L
1
(
l
i
m
−
g
^
j
m
)
L_{l o c}(x, l, g)=\sum_{i \in \text {Pos} }^{N} \sum_{m \in\{c x, c y, w, h\}} x_{i j}^{k} \operatorname{smooth}_{L 1}\left(l_{i}^{m}-\hat{g}_{j}^{m}\right)
Lloc(x,l,g)=i∈Pos∑Nm∈{cx,cy,w,h}∑xijksmoothL1(lim−g^jm)
计算所有正样本和它对应gt的损失,损失共有四项,框体的中心坐标(x,y)和宽高。这里并不是预测他们实际的值,而是预测相对于anchor的变换参数。变换方法如下:
g
^
j
c
x
=
(
g
j
c
x
−
d
i
c
x
)
/
d
i
w
g
^
j
c
y
=
(
g
j
c
y
−
d
i
c
y
)
/
d
i
h
g
^
j
w
=
log
(
g
j
w
d
i
w
)
g
^
j
h
=
log
(
g
j
h
d
i
h
)
\hat{g}_{j}^{c x}=\left(g_{j}^{c x}-d_{i}^{c x}\right) / d_{i}^{w} \\ \hat{g}_{j}^{c y}=\left(g_{j}^{c y}-d_{i}^{c y}\right) / d_{i}^{h} \\ \hat{g}_{j}^{w}=\log \left(\frac{g_{j}^{w}}{d_{i}^{w}}\right) \\ \hat{g}_{j}^{h}=\log \left(\frac{g_{j}^{h}}{d_{i}^{h}}\right)
g^jcx=(gjcx−dicx)/diwg^jcy=(gjcy−dicy)/dihg^jw=log(diwgjw)g^jh=log(dihgjh)
再看置信度损失:
L
c
o
n
f
(
x
,
c
)
=
−
∑
i
∈
Pos
N
x
i
j
p
log
(
c
^
i
p
)
−
∑
i
∈
N
e
g
log
(
c
^
i
0
)
where
c
^
i
p
=
exp
(
c
i
p
)
∑
p
exp
(
c
i
p
)
L_{c o n f}(x, c)=-\sum_{i \in \text {Pos}}^{N} x_{i j}^{p} \log \left(\hat{c}_{i}^{p}\right)-\sum_{i \in N e g} \log \left(\hat{c}_{i}^{0}\right) \quad \text { where } \quad \hat{c}_{i}^{p}=\frac{\exp \left(c_{i}^{p}\right)}{\sum_{p} \exp \left(c_{i}^{p}\right)}
Lconf(x,c)=−i∈Pos∑Nxijplog(c^ip)−i∈Neg∑log(c^i0) where c^ip=∑pexp(cip)exp(cip)
置信度损失正样本和负样本都要计算。式中的
p
p
p指正样本对应的类别,0指的是背景类。
anchor尺寸和形状的选取
先看大小:
在不同的features maps上设置的anchor大小不一样。越浅层的feature maps,anchor越小。设置方式如下:
s
k
=
s
min
+
s
max
−
s
min
m
−
1
(
k
−
1
)
,
k
∈
[
1
,
m
]
s_{k}=s_{\min }+\frac{s_{\max }-s_{\min }}{m-1}(k-1), \quad k \in[1, m]
sk=smin+m−1smax−smin(k−1),k∈[1,m]
s
m
i
n
=
0.2
,
s
m
a
x
=
0.9
s_{min}=0.2, s_{max}=0.9
smin=0.2,smax=0.9。s指相对于feature maps的缩放系数。
再看形状:宽高的比例有5种: a r ∈ 1 , 2 , 3 , 1 2 , 1 3 a_r \in {1,2,3,\frac{1}{2}, \frac{1}{3}} ar∈1,2,3,21,31。因此就能计算出宽和高的值: w k a = s k a r , h k a = s k / a r w_k^a=s_k\sqrt{a_r}, h_k^a=s_k/\sqrt{a_r} wka=skar,hka=sk/ar。
最后计算anchor中心坐标: x = i + 0.5 ∣ f k ∣ , y = j + 0.5 ∣ f k ∣ x=\frac{i+0.5}{|f_k|}, y=\frac{j+0.5}{|f_k|} x=∣fk∣i+0.5,y=∣fk∣j+0.5, 其中 f k f_k fk是特征图的大小, i , j i,j i,j是anchor所在cell对应在特征图上的位置, 0.5 0.5 0.5是为了将中心设置在cell中心。
数据增强的方法
- 直接输入原图
- 在原图上采样patch(与原图的比例为[0.1,0.9],aspect ratio为[0.5,2]),patch与目标的最小IoU为[0.1,0.3,0.5,0.7,0.9]。
实验结论
- 数据增强很重要
- anchor形状越多越好
- 使用空洞卷积更快
- 使用不同尺度的特征图,能提高精度