SSD: Single Shot MultiBox Detector
论文链接: https://arxiv.org/abs/1512.02325
一、Problem Statement
作者认为目前的检测系统都是以下方法的变体:假设bounding box,对每个框重新取样像素或特征,再应用高质量分类器。这些方法对于嵌入式系统来说计算量过大,即使对于高端硬件,对于实时或接近实时的应用来说也太慢。本文提出了第一个基于深层网络的对象检测器,它不会对bounding box假设的像素或特征进行重新取样,但和上面的做法一样精确。
二、Direction
消除bounding box proposal和随后的像素或特征重采样阶段。
- 使用一个小的卷积核去预测目标类别和bounding box 位置补偿;
- 使用单独的预测器(filters)对不同宽高比的图像进行检测;
- 使用这些filters与来自于网络后期的多个feature maps结合,用于多尺度检测;
三、Method
1. 网络结构:
Backbone: VGG-16
可以看到检测是基于多尺度feature maps上的, 其目的是为了能够准确的检测到不同尺度的物体,因为在低层的feature map,感受野比较小,高层的感受野比较大,在不同的feature map进行卷积,可以达到多尺度的目的。作者把一组默认bounding boxes (与Faster R-CNN 提出的anchors一样) 与 feature map cell 关联起来。在每一个feature map 上,我们预测相对于feaure map cell中默认bounding box形状的偏移和预测每个bounding box中实例的每个类别的置信度。也就是说,对于给定位置的K个bounding boxes中的每一个,计算c 个类别的置信度和 4 个相对于原始默认框形状的补偿。所以每个feature map 每一个位置产生 (c+4)k。如果feature map 的大小是 m * n, 则这个feature map 产生 (c+4)kmn 个输出。具体如下图:
2. Training:
(1) Matching strategy
在训练的时候,我们需要决定default boxes 对应于哪一个 ground truth。 我们把与ground truth IoU > 0.5 的 defaut boxes进行匹配。
(2) Training objective
整体的Loss:
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}(L_{conf}(x,c)+\alpha L_{loc}(x,l,g))
L(x,c,l,g)=N1(Lconf(x,c)+αLloc(x,l,g))
N
N
N是匹配上default boxes的数量。如果
N
=
0
N=0
N=0,loss就为0。
l
,
g
l, g
l,g 分别代表预测的bounding box 和ground truth。 localization loss 是 Smooth L1 loss (和Faster R-CNN类似)。
L
l
o
c
(
x
,
l
,
g
)
=
∑
i
∈
P
o
s
N
∑
m
∈
{
c
x
,
c
y
,
w
,
h
}
x
i
j
k
s
m
o
o
t
h
L
1
(
l
i
m
−
g
^
j
m
)
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
=
l
o
g
(
g
j
w
/
d
i
w
)
g
^
j
h
=
(
g
j
h
−
d
i
h
)
L_{loc}(x,l,g)= \sum_{i \in Pos}^N\sum_{m \in \{cx,cy,w,h\}} x_{ij}^k smooth_{L1}(l_i^m-\hat{g}_j^m) \\ \hat{g}_j^{cx}=(g_j^{cx}-d_i^{cx})/d_i^w \quad \hat{g}_j^{cy}=(g_j^{cy}-d_i^{cy})/d_i^h \\ \hat{g}_j^{w}=log(g_j^{w}/d_i^{w})\quad \hat{g}_j^{h}=(g_j^{h}-d_i^{h})
Lloc(x,l,g)=i∈Pos∑Nm∈{cx,cy,w,h}∑xijksmoothL1(lim−g^jm)g^jcx=(gjcx−dicx)/diwg^jcy=(gjcy−dicy)/dihg^jw=log(gjw/diw)g^jh=(gjh−dih)
confidence loss是softmax loss
L
c
o
n
f
(
x
,
c
)
=
−
∑
i
∈
P
o
s
N
x
i
j
p
l
o
g
(
c
^
i
p
)
−
∑
i
∈
N
e
g
l
o
g
(
c
^
i
0
)
w
h
e
r
e
c
^
i
p
=
e
x
p
(
c
i
p
)
∑
p
e
x
p
(
c
i
p
)
L_{conf}(x,c)=-\sum_{i \in Pos}^N x_{ij}^p log(\hat{c}_i^p) - \sum_{i \in Neg}log(\hat{c}_i^0) \quad where \quad \hat{c}_i^p=\frac{exp(c_i^p)}{\sum_pexp(c_i^p)}
Lconf(x,c)=−i∈Pos∑Nxijplog(c^ip)−i∈Neg∑log(c^i0)wherec^ip=∑pexp(cip)exp(cip)
(3) Choosing scales and aspect ratios for default boxes
假设使用m个不同大小的feature maps进行预测,default boxes 的尺度计算如下:
s
k
=
s
m
i
n
+
s
m
a
x
−
s
m
i
n
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代表最低的网络层scale 为0.2 和最高的网络层 scale 为0.9。同时,对default box使用不同的比例
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}。所以每一个default box的长和宽可以通过下式计算:
w
k
a
=
s
k
a
r
h
k
a
=
s
k
/
a
r
w_k^a=s_k\sqrt{a_r} \quad h_k^a=s_k/\sqrt{a_r}
wka=skarhka=sk/ar
每个feature map上的location 有6个 default boxes。每个default box的中心为:
(
i
+
0.5
∣
f
k
∣
,
j
+
0.5
∣
f
k
∣
)
(\frac{i+0.5}{|f_k|}, \frac{j+0.5}{|f_k|})
(∣fk∣i+0.5,∣fk∣j+0.5)
(4) Hard negative mining
大多数default boxes是negative的,这就会导致imbalance 的问题。因此,作者对每个default box的置信度进行排序,选择最高的那一些进行训练。
(5) Data augmentation
能够对不同的输入大小和形状更加的鲁棒,做了如下的随机采样:
1. 使用整个输入的图像
2. 采样一个patch,使得与目标的最小IoU为:0.1,0.3,0.5,0.7,或者0.9
3. 随机采用这些patch
翻转等等数据增强的方式也采用了。
(6) Atrous
采用了空洞下采样,提升了20%的速度。Atrous algorithm空洞卷积可以在其他论文了解。
四、Conclusion
SSD 对相似目标类别分类比较差,可能是因为对多个类别共享了locations信息,且SSD对bounding box的大小很敏感,也就是说对小目标识别不太好。这是不惊讶的,因为在非常高的网络层里可能不存在小目标的信息。提升输入图片的大小能有助于检测小目标。但是简单的SSD结构,比当时的YOLO快,精度比Faster R-CNN低,根据实际的项目需求选择把。但是这是一个很好的baseline。
Reference
- https://blog.csdn.net/denghecsdn/article/details/77429978
- https://blog.csdn.net/thisiszdy/article/details/89576389