SSD:Single Shot MultiBox Detector解读。若博文有不妥之处,望加以指点,笔者一定及时修正。
文章目录
① 论文概要
1. 前言
SSD的研究目标检测接触的第一个模型,先介绍一点相关知识:
参考链接附在[1],[3],推荐,打call!
①评估速度用
F
P
S
/
S
P
F
FPS/SPF
FPS/SPF
F
P
S
:
F
r
a
m
e
p
e
r
s
e
c
o
n
d
;
FPS:Frame \ per \ second ;
FPS:Frame per second;每秒识别的图像帧数,越大速度越快;
S
P
F
:
S
e
c
o
n
d
p
e
r
f
r
a
m
e
:
SPF:Second \ per \ frame :
SPF:Second per frame: 处理一张图片所需要的时间,越小速度越快;
②IOU(Jaccard \ overlap/similarity)
可以理解为两个框的重叠程度,最大为1,最小为0。
I
O
U
=
(
A
∩
B
)
(
A
∪
B
)
IOU=\frac{(A \ ∩ \ B)}{(A \ ∪ \ B)}
IOU=(A ∪ B)(A ∩ B)
③分类/检测常用的评价标准
分类/检测常用的评价标准:recall(R),precision(P),AP,mAP,PR曲线,ROC曲线
recall(R):所有的好瓜中有多少比例被挑出来。
precision(P):挑出来的西瓜里面有多少比例是好瓜。
这两个度量是一对矛盾的量。准确率越高,召回率越低!反之亦然!
下面介绍一下
T
P
,
F
P
,
F
N
,
T
N
TP,FP,FN,TN
TP,FP,FN,TN:
首先
p
o
s
i
t
i
v
e
s
:
positives:
positives:正样本,
n
e
g
a
t
i
v
e
s
:
negatives:
negatives:负样本。
T
P
:
T
r
u
e
p
o
s
i
t
i
v
e
s
TP:True \ positives
TP:True positives:被正确地划分为正例的个数,即正样本被划分到正例中的数目;
F
P
:
F
a
l
s
e
p
o
s
i
t
i
v
e
s
FP:False \ positives
FP:False positives:被错误地划分为正例的个数,即负样本被划分到正例中的数目;
F
N
:
F
a
l
s
e
n
e
g
a
t
i
v
e
s
FN:False \ negatives
FN:False negatives:被错误地划分为负例的个数,即正样本被划分到负例中的数目;
T
N
:
T
r
u
e
n
e
g
a
t
i
v
e
s
TN:True \ negatives
TN:True negatives:被正确的划分到负例的个数,也就是负样本被划分成负例的数目;
recall(R):所有的好瓜中有多少比例被挑出来,分母为测试集中所有正例,分子为划分正确的正例。
r
e
c
a
l
l
=
T
P
T
P
+
F
N
recall=\frac{TP}{TP + FN}
recall=TP+FNTP
precision(P):挑出来的西瓜里面有多少比例是好瓜,分母所有测试集,包括正例和负例,分子为划分正确的正例。
p
r
e
c
i
s
i
o
n
=
T
P
T
P
+
F
P
precision=\frac{TP}{TP + FP}
precision=TP+FPTP我们可以通过调整阈值来限定识别的程度,来改变
r
e
c
a
l
l
recall
recall 和
p
r
e
c
i
s
i
o
n
precision
precision。这个阈值就是上面介绍的
I
O
U
IOU
IOU。根据
R
e
c
a
l
l
Recall
Recall 和
p
r
e
c
i
s
i
o
n
precision
precision 可以画出
P
R
PR
PR 曲线。
上图可以看出,精确率越高,召回率越低。P-R曲线围起来的面积就是AP值,通常一个分类器性能越好,AP值越高。
步骤:计算预测框与真实框之间的
I
O
U
IOU
IOU,再与设定的
I
O
U
IOU
IOU 做对比;大于,则认为是真实检测,否则,则认为是错误检测。
A
P
:
A
v
e
r
a
g
e
P
r
e
c
i
s
i
o
n
AP:Average \ Precision
AP:Average Precision(平均精确度)
单纯用准确率和召回率作为衡量指标是不合理的。AP:PR 曲线下面的面积,等于对
p
r
e
c
i
s
i
o
n
precision
precision 进行取平均。
m
A
P
:
M
e
a
n
A
v
e
r
a
g
e
P
r
e
c
i
s
i
o
n
mAP:Mean \ Average \ Precision
mAP:Mean Average Precision(平均AP值)
是对多个验证集个体求平均AP值,作为
O
b
j
e
c
t
d
e
c
t
i
o
n
Object \ dection
Object dection 中衡量检测精度的指标。
R
O
C
曲
线
ROC曲线
ROC曲线
T
P
R
:
T
r
u
e
p
o
s
i
t
i
v
e
r
a
t
e
TPR:True \ positive \ rate
TPR:True positive rate:
T
P
T
P
+
F
N
\frac{TP}{TP + FN}
TP+FNTP,分类器预测的正类中实际的正例占测试集所有的正例的比例;
F P R : F a l s e p o s i t i v e r a t e FPR:False \ positive \ rate FPR:False positive rate: F P F P + T N \frac{FP}{FP + TN} FP+TNFP,分类器预测的正例里面的实际是负例(预测错了)占所有测试集中负实例的比例;
T N R : T r u e n e g a t i v e r a t e TNR:True \ negative \ rate TNR:True negative rate: T N F P + T N \frac{TN}{FP+TN} FP+TNTN,分类器里面预测的负样本里面的实际是正样本占测试集所有负实例的比例。
关系: T N R = 1 − F P R TNR=1-FPR TNR=1−FPR。
横轴是:FPR;纵轴是:TPR。
横轴 FPR 越大表示预测的正样本中实际包含负样本类越多;
纵轴 TPR 越大表示预测的正样本中实际包含的正样本越多;
理想目标:(0,1),也就是 预测的正样本里面一个负样本也没有,都是正样本。所以 ROC曲线越接近(0,1),越偏离 45度对角线效果越好。
如何画 ROC 曲线,这个会在下一个博客介绍。
那么为什么要使用 ROC 曲线呢?
因为ROC曲线有个很好的特性:当测试集中的正负样本的分布变换的时候,ROC曲线能够保持不变。在实际的数据集中经常会出现样本类不平衡,即正负样本比例差距较大,而且测试数据中的正负样本也可能随着时间变化。举个例子:分类器在原始测试集(正负样本分布平衡),将测试集中负样本的数量增加到原来的10倍后,分类器的结果是ROC曲线基本保持原貌,而Precision-Recall曲线变化较大。
2、引言
主要介绍了SSD算法的优点:
①比
F
a
s
t
e
r
−
R
C
N
N
Faster-RCNN
Faster−RCNN 快,精度比
Y
O
L
O
YOLO
YOLO 高(兼顾速度和精度,在不同的测试集上,效果都很不错)。(但是
Y
O
L
O
YOLO
YOLO 系列的
Y
O
L
O
V
3
YOLOV3
YOLOV3 性能比
S
S
D
SSD
SSD 好,前面的博客我有介绍。)
②多尺度,不同的特征图上进行预测,类似于金字塔;
③端对端,可多分类,对分辨率比较小的图片,分类也很准确。
3、网络结构
3.1 多尺度特征图检测
论文中采用的是VGG网络来进行特征提取:
然后把最后面的一个全连接层去掉,加6个卷积层(0,1,2,3,4,5)在VGG网络里面取两个卷积层
C
o
n
v
4
−
3
和
C
o
n
v
7
(
F
c
7
)
Conv4-3 和 Conv7(Fc7)
Conv4−3和Conv7(Fc7),后面6个卷积层里面取4个(2,3,4,5),假设输入图片的分辨率是
300
X
300
300X300
300X300,那么这6个选取好的作为特征图的尺寸分别为(38X38,19X19,10X10, 5X5,3X3,1X1),与原图相比,缩小的
s
t
e
p
step
step分别为(8,16,32,64,128,256)。我们在不同的特征图上画固定比例的框,大分辨率上小框对检测小目标有帮助,小分辨率上的框对检测大目标有帮助。所以可以得到多个尺度的预测值。图参考[4]:
3.2 卷积预测
Y
O
L
O
YOLO
YOLO 是使用全连接提取检测结果,而
S
S
D
SSD
SSD 直接采用卷积对不同的特征图进行提取检测结果。对于大小为
m
m
m x
n
n
n x
p
p
p 的特征图,使用
3
3
3 x
3
3
3 x
p
p
p 的小卷积核就可以得到检测值。下面介绍一下通过
3
3
3 x
3
3
3 x
p
p
p 或者
1
1
1 x
1
1
1 x
p
p
p 这些小的卷积核如何产生所需要的检测值,网络结构图如上:
所需要的预测值是:物体的类别与坐标。由于
f
e
a
t
u
r
e
m
a
p
feature \ map
feature map 是多尺度的,感受野不同,所以我们可以认为检测环节是对不同尺度的框进行回归和分类。
检测环节可以分为3个环节:
a) 生成 A n c h o r b o x e s Anchor \ boxes Anchor boxes:针对不同的卷积层,产生不同的尺寸(scale),不同的纵横比(aspect ratio)的 default boxes。
b) c l a s s i f i c a t i o n classification classification:上面生成的 A n c h o r b o x e s Anchor \ boxes Anchor boxes 预测对应的格子的类别(C+1类,比如VOC就是20+1),格子就理解为 以像素点偏移一定的量(代码里面是0.5) 为中心点的框,这个框不是4个就是6个,代码中规定了一层上每个中心点生成框的个数。这边与 YOLO 不同哦!
c) l o c a l i z a t i o n localization localization:上述的 d e f a u l t b o x e s default \ boxes default boxes 通过 l o c a t i o n location location 预测对应 f e a t u r e m a p c e l l feature \ map \ cell feature map cell 的坐标。这边与 YOLO 不同哦!
拿38x38 特征图举例,在特征图上的 p i p e l i n e pipeline pipeline 分为3条线路:小卷积核卷积
①经过一次 B N BN BN,再进行一次卷积,生成了 [ 1 , n u m − c l a s s ∗ n u m − p r i o r b o x , l a y h e i g h t , l a y w i d t h ] [1, num-class*num-priorbox, layheight, laywidth] [1,num−class∗num−priorbox,layheight,laywidth] 大小的 f e a t u r e feature feature 用于 s o f t m a x softmax softmax 分类([1, 通道数,特征图的高,特征图的宽]),对应上面的 b)。
②经过一次 B N BN BN,再进行一次卷积,生成了 [ 1 , 4 ∗ n u m − p r i o r b o x , l a y h e i g h t , l a y w i d t h ] [1, 4*num-priorbox, layheight, laywidth] [1,4∗num−priorbox,layheight,laywidth] 大小的 f e a t u r e feature feature 用于 b o u n d i n g r e g r e s s i o n bounding \ regression bounding regression回归(这边的 4 代表 框的坐标),对应上面的 c)。
③生成了 [ 1 , 2 , 4 ∗ n u m − p r i o r b o x ] [1, 2,4*num-priorbox] [1,2,4∗num−priorbox] 大小的 框,对应上面的 a).(这里我不太了解)。
3.3 锚框的选择 与 框不同的比例
S S D SSD SSD 为每一层的各个单元格设置了 4 或 6 个框。而且这些框的长宽比都不一样。假设特征图的尺寸大小为:m x n,假设每个格子预测的框数为 k k k。那么这张特征图一共会预测出 m x n x k 个框,每个框会预测出每个类的置信度,如VOC里面,类别数 C =21,所以产生了 ( C + 4 ) ∗ m ∗ n ∗ k (C + 4)* m * n * k (C+4)∗m∗n∗k 个输出,这里的 4 代表一个框的4个点的坐标 。因为通过卷积做的,所以需要卷积核的个数为 ( C + 4 ) ∗ k (C + 4)*k (C+4)∗k。
测试时候:将不同将不同 f e a t u r e m a p feature \ map feature map获得的 框 结合起来,经过 NMS(非极大值抑制)方法来抑制掉一部分重叠或者不正确的框,生成最终的框集合(即检测结果)。
那么这4 个或 6 个框的尺寸和长宽比怎么确定呢?
以
f
e
a
t
u
r
e
m
a
p
feature \ map
feature map上每个点的中点为中心(
o
f
f
s
e
t
=
0.5
offset=0.5
offset=0.5),生成一系列同心的
D
e
f
a
l
u
t
b
o
x
Defalut \ box
Defalut box(然后中心点的坐标会乘以step,相当于从
f
e
a
t
u
r
e
m
a
p
feature \ map
feature map位置映射回原图位置)。使用 6 个不同大小的
f
e
a
t
u
r
e
m
a
p
feature \ map
feature map 来做预测,最底层的
f
e
a
t
u
r
e
m
a
p
feature \ map
feature map 的
s
c
a
l
e
scale
scale 值为
S
m
i
n
=
0.2
S_{min}=0.2
Smin=0.2,最高层的为
S
m
a
x
=
0.95
S_{max}=0.95
Smax=0.95,其他层通过下面的公式计算得到:
使用不同的长宽值,
[
1
,
2
,
3
,
1
2
,
1
3
]
[1, 2, 3, \frac{1}{2}, \frac{1}{3}]
[1,2,3,21,31],通过下面的公式计算
d
e
f
a
u
l
t
b
o
x
default \ box
default box 的宽度
w
w
w 和高度
h
h
h:
而每个格子还预测的两个正方形框为:
所以预测的6个框为:
3.4 匹配策略
在训练过程中,首先要确定训练图片中的
g
r
o
u
n
d
t
r
u
t
h
ground \ truth
ground truth 与哪个先验框来进行匹配,与之匹配的先验框所对应的边界框将负责预测它。
在
Y
O
L
O
YOLO
YOLO中,
g
r
o
u
n
d
t
r
u
t
h
ground \ truth
ground truth的中心落在哪个单元格,该单元格中与其 IOU 最大的边界框负责预测它。
S S D SSD SSD 中完全不一样,SSD的先验框与 g r o u n d t r u t h ground \ truth ground truth的匹配是任两框匹配,按准确度说话,原则主要有两点。
①对于图片中每个 g r o u n d t r u t h ground \ truth ground truth,找到与其 IOU 最大的先验框,该先验框与其匹配,这样,可以保证每个 g r o u n d t r u t h ground \ truth ground truth一定与某个先验框匹配。通常称与 g r o u n d t r u t h ground \ truth ground truth匹配的先验框为正样本,反之,若一个先验框没有与任何 g r o u n d t r u t h ground \ truth ground truth 进行匹配,那么该先验框只能与背景匹配,就是负样本。一个图片中 g r o u n d t r u t h ground \ truth ground truth是非常少的, 而先验框却很多,如果仅按第一个原则匹配,很多先验框会是负样本,正负样本极其不平衡,所以需要第二个原则。
②对于剩余的未匹配先验框,若某个 g r o u n d t r u t h ground \ truth ground truth 的 IOU大于某个阈值(一般是0.5),那么该先验框也与这个 g r o u n d t r u t h ground \ truth ground truth 进行匹配。这意味着某个 g r o u n d t r u t h ground \ truth ground truth可能与多个先验框匹配,这是可以的。但是反过来却不可以,因为一个先验框只能匹配一个 g r o u n d t r u t h ground \ truth ground truth。如果多个 g r o u n d t r u t h ground \ truth ground truth与某个先验框IOU大于阈值,那么先验框只与 IOU 最大的那个先验框进行匹配。第二个原则一定在第一个原则之后进行。
3.5 数据增强和负样本挖掘
数据增强很重要,尤其对小目标。
尽管一个
g
r
o
u
n
d
t
r
u
t
h
ground \ truth
ground truth可以与多个先验框匹配,但是
g
r
o
u
n
d
t
r
u
t
h
ground \ truth
ground truth相对先验框还是太少了,所以负样本相对正样本会很多。为了保证正负样本尽量平衡,SSD采用了
h
a
r
d
n
e
g
a
t
i
v
e
m
i
n
i
n
g
hard \ negative \ mining
hard negative mining,就是对负样本进行抽样,抽样时按照置信度误差(预测背景的置信度越小,误差越大)进行降序排列,选取误差的较大的top-k作为训练的负样本,以保证正负样本比例接近1:3。代码中这个
K
K
K 取值为200。
负样本太多,选取有用的,使正负样本比为 1:3 。
4、损失函数
SSD 训练的目标函数 来源于
M
u
l
t
i
B
o
x
MultiBox
MultiBox 的目标函数,
S
S
D
SSD
SSD进行扩展,使其可以处理多个目标类别。
a)让每一个 先验框 经过 J a c c a r d Jaccard Jaccard系数计算和真实框的相似度,阈值只有大于 0.5的才可以列为候选名单;
b)假设候选名单里面有 N 个框,令 i i i 表示第 i i i个默认框, j j j 表示第 j j j个真实框, p p p表示第 p p p个类。那么 x i j p x_{ij}^p xijp表示 第 i i i 个先验框也就是 A n c h o r b o x e s Anchor \ boxes Anchor boxes 也就是 D e f a u l t b o x e s Default \ boxes Default boxes与 类别 p p p 的 第 j j j 个 g r o u n d t r u t h b o x ground \ truth \ box ground truth box 相匹配的 J a c c a r d Jaccard Jaccard系数,若不匹配的话,则 x i j p = 0 x_{ij}^p=0 xijp=0。总的目标损失函数就由 l o c a l i z a t i o n l o s s localization \ loss localization loss 与 c o n f i d e n c e l o s s confidence \ loss confidence loss的加权求和。
③ 参考博客
这几位的博客十分好,隆重推荐!
[1] :https://blog.csdn.net/qq_29893385/article/details/81213377
[2]:《机器学习》 周志华,清华大学出版社
[3]:https://www.cnblogs.com/dlml/p/4403482.html
[4]:https://blog.csdn.net/qq_36302589/article/details/84989392
[5]:https://cloud.tencent.com/developer/article/1052779