-
本文提出的
SSD
算法是一种直接预测目标类别
和
bounding
box
的多目标检测
算法。
与
faster
rcnn
相比,该算法没有生成
proposal
的过程,这就极大提高了检
测速度。
针对不同大小的目标检测,
传统的做法是先将
图像转换成不同大小
(图
像金字塔),然后分别检测,最后将结
果综合起来(
NMS
)。
而
SSD
算法则利用不同卷积层的
feature
map
进行综合也能达到同样的效
果。算法的主网络结构是
VGG16
,将最后两个全连接层改成卷积层,
并随后增
< br>加了
4
个卷积层来构造网络结构。对其中
5
种不同的卷积层的输出(
feature
map
)
分别
用两
p>
个不
同的
3×3
的卷积
核进行卷积,一
个输
出分类用的
confidence
,
每个
default box
生成
21
个类别
confidence
;
一个输出回归用
的
localization
,每个
default box
生成
4
个坐标值(
x, y, w,
h
)。
此外,这
5
个
feature
map
还经过
PriorBox
层生成
prior
box
(生成的是
坐标)
。
上述
5
p>
个
feature
map
中每一层的
default box
的数量是给定的
(8732
个
)<
/p>
。最后将前面三个计算结果分别合并然后传给
loss
层。
Default
box
文章的核心之一是作者同时采用
lower
和
upper
的
feature map
做检测。
如图
Fig
1
所示,这里假定有
8×8
和
4×4
两种不同的
feature
map<
/p>
。第一
个概念是
feature map
cell
,
feature map cell
是指
feature map
中每一个
小格子
,如图中分别有
64
和
16
个
cell
。另外有一个概念:
default
box
,是
指在
feature ma
p
的每个小格
(cell)
上都有一系
列固定大小的
box
,
如下图有
4
个(下图中的虚线框,仔细看格子的中间有比格子还小的一个
box
)。
假设每个
feature map cell
< br>有
k
个
default
box
,那么对于每个
default box
都需要预测
c
个类别
scor
e
和
4
个
of
fset
,那么如果一个
feature
map
的大
小是
m×n
,也就是有
m*n
个
fe
ature map cell
,那么这个
feature m
ap
就
一共有
(
c+4
)
*k * m*n
个输出
。这些输出个数的含义是
:采用
3×3
的卷积
核对该层的
feature map
卷积时卷积核的个数,包含两部分(实际
code
是分
p>
别用不同数量的
3*3
卷积核对该层
feature map
进行卷积):
数量<
/p>
c*k*m*n
是
confidence
输出,表示每个
default box
的
confidence
,也就是类别的概
< br>率;数量
4*k*m*n
是
lo
calization
输出,表示每个
default
box
回归后的坐
标
)。训练中还有一个东西:
prior
box
,是指实际中选择的
default
box
(每
一个
feature
map cell
不是
k
个
default box
都取)。
也就是说
default
box
是一种概念,
prior box
则是实际的选取。
训练中一张完
整的图片送进网络获得各个<
/p>
feature
map
,对于正样本训
练来说,需要先将
prior
box
与
ground truth box
< br>做
匹配
,匹配成功说明这个
pr
ior box
所包
含的是个目标,但离完整目标的
ground
truth
box
还有段距离,训练的目的
是保证
default <
/p>
box
的分类
confidence
p>
的同时将
prior
box
尽可能回归到
ground
truth box
。
举个列子:假
设一个训练样本中有
2
个
ground
truth
box
,所有的
feature
map
中获取的
prior box<
/p>
一共有
8732
个。
那个可能分别有
10
、
20
个
prior
box
能分别与这
2
个
ground
truth box
匹配上。训练的损失包含定位损失和
回归损
失两部分。
作者的实验表明
default box
的
shape
数量越多,效果越好。
这里用到的
default
box
和
Faster
RCNN
中的
anchor
很像,在
Faster
RCNN
中
anchor
只用在最后一个卷积层,但是在本文中,
default
box
是
应用在多个不同层的
feature
map
上。
那么
default box
的
scale
(大小)和
aspect rat
io
(横纵比)要怎么定呢?假
设我们用
m
个
feature
maps
p>
做预测,那么对于每个
featuer
map
而言其
default box
的
scale
是按以下公式计算的:<
/p>
∨
Sk=S
min+Smax?Sminm?1(k?1),k
∈
[1,m
]
这里
smin
是
0.2
,表示最底层的
scal
e
是
0.2
;
smax
是
0.9
,表示最高层的
p>
scale
是
0.9
。
至于
aspect ratio
,用
a_r
表示为下式:注意这里一共
有
5
种
aspect ratio
a_r = {1, 2, 3, 1/2, 1/3}
因此每个
default
box
的宽的计算公式为:
w_k^a=s_ksqrt{a_r}
高的计算公式为:(很容易理解宽和高的乘积是
scale
的平方)
h_k^a=s_k/sqrt{a_r}
另外当
aspect ratio
为<
/p>
1
时,作者还增加一种
scale
的
default
box
:
s_k^{'}=sqrt{s_{k}s_{k+1}}
因此,对于每个
feature map cell
而言,一共有
6
种
def
ault box
。
可以看出这种
default
box
在不同的
feature
层有不同的<
/p>
scale
,在同一个
feature<
/p>
层又有不同的
aspect
ratio
,因此基本上可以覆盖输入图像中的各种
形状和大小的
object
!
(训
练自己的样本的时候可以在
FindMatch()
之后检查是
否能覆盖了所有的
ground truth
box
)
源
代
码
中
的
<
/p>
ssd_
设
计
了
上
面
几
个
p>
参
数
值
,
caffe
源
码
<
/p>
prior_box_
中
Forward
_cpu()
实现。
最后会得到(
38*38*4
+
19*19*6
+
10*10*6
+
5*5*6
+
3*3*4
+
1*1*4
)
=
8732
个
prior
box
。
Fig.2 SSD
框架
正负样本
将
prior
box
和
grount truth
box
按照
IOU
(
JaccardOverlap
)进行匹配,
匹配成功
则这个
prior
box
就是
positive example
(正样本),
如果匹配不上,
就是
negative example
(负样本),显然这样产生的负样本的数量要远
远多于
正样本。
这里将前向
loss<
/p>
进行排序,
选择最高的
num_sel<
/p>
个
prior
box
序号集
合
D
。
那么如果
Match
成功后的正样本序号集合
P
。
< br>那么最后正样本集为
P -
Dcap{P}
,
负样本集为
D - Dcap{P}
。
同时可以通
过规范
num_sel
的数量
(是
p>
正样本数量的三倍)来控制使得最后正、负样本的比例在
1
:
3
左右。
Fig.3
positive and negtive sample VS ground_truth
box
1.
正样本获得
我们已经在图上画出了
prior
box
,同时也有了
ground truth
,那么下一步就
是
将
prio
r
box
匹
配
到
ground
truth
上
p>
,
这
是
在
src/caffe/utlis/bbox_
的
FindMatches
以及子
函数
MatchBBox
函数里完成的。
值得注意的是先是从
groudtruth
box
出发给每个
groudtruth
box
找到了最匹配的
prior b
ox
放入
候选正样本集
,然后再从
p>
prior
box
出发
为
prior
box
集中寻找与
groundtruth
p>
box
满足
IOU>0.5
的一个
IOU
最大
的
prior box
(如果有的话)放入
候选正
样本集
,这样显然就增大了候选正样本
集的数量。
2.
负样本获得
在生成一系列的
prior
boxes
之后,会产生很多个符合
ground
truth
box
的
positive
boxes
(候选正样本集),但同时,不符合
ground truth boxes
也很多,
而且这个
negative boxes
(候选负样本集)
,
远多于
positive
boxes
。
这会造成
negative
boxes
、
positive boxes
之间的不均衡。训练时难以收敛。
因
此,
本文采取,
先将每一个物体位置上对应
predictions
(
prior
boxes
)
loss
进行排序。
对于
候选正样本集
:
选择最高的几个
p
rior box
与正样本集匹配
(box
索引同时存在于这两个集合里则匹配成功
)
,匹配不成功则
删除这个正样本(因
为这个正样本不在难例里已经很接近
gro
und truth box
了,
不需要再训练了)
;
对于
候选负样本
集:选
择最高的几个
prior
box
与候
选负样本集匹配,匹配成
功则作为负样本。
< br>这就是一个难例挖掘的过程,举个例子,假设在这
8732
个
prior box
里,经
过
p>
FindMatches
后得到候选正样本
P
个,
候选负样本那就有
8732-P
个。
将
prior
box
的
prediction loss
按照从大到小顺序排列后选择最高的
M
个
< br>prior
box
。如果这
P
个候选正样本里有
a
个
box
不在这
M
个
prior
box
里,将这
M
个
box
从候选正样本集中踢出
去。如果这
8732-P
个候选负样本集中包含
的
8732-P
有
M-a
p>
个在这
M
个
pri
or box
,则将这
M-a
个候选负
样本作为
负样本。
SSD
算法中通过这
种方式来保证
positives
、
negatives
的比例。实
际代
码中有三种负样本挖掘方式:
如果选择
HARD_EXAMPLE
方式
(源于论文
< br>Training Region-based Object
Detectors with Online Hard Example
Mining
),则默认
M = 64
,由于
无法控制正样本数量,
这种方式就有点类似于分类、
p>
回归按比重不同交替训练了。
如
果
选
择
MAX_NEG
ATIVE
方
式
,
则
M
=
P*neg_pos_
ratio
,
这
里
当
neg_pos_ratio = 3
的时候
,
就是论文中的正负样本比例
1:3
了。
enum
{
MultiBoxLossParameter_MiningType
MultiBoxLossParameter_MiningType_NONE
=
0,