❝上期我们一起学习了
Faster RCNN
的损失函数以及如何进行模型训练的相关知识,如下: Faster RCNN的损失函数以及模型训练流程❞
本文主要学习:
- One-Stage / Two-Stage
- SSD模型结构
我们知道之前学的RCNN
系列需要选取候选框和分类回归两步操作,称为Two-Stage
类算法。今天我们学习一种新的目标检测算法SSD
(Single Shot MultiBox Detector
),该算法属于One-Stage
类算法范畴。首先我们先看一下One-Stage
和Two-Stage
类算法到底有哪些区别。
One-Stage / Two-Stage
- Two-Stage:Faster RCNN
Two-Stage
算法将检测问题划分为两个阶段,首先产生候选区域(Region Proposals
),然后再对候选区域进行分类和位置回归。 特点:错误率低,漏识别率低,但是速度较慢,不太能满足实时监测场景。 - One-Stage:SSD YOLO
One-Stage
算法不需要Region Proposals
阶段,可以直接产生物体的类别概率和位置坐标值,经过单次检测即可直接得到最终的检测结果。 特点:有着更快的检测速度。
如下图,我们也可以从下图中看到One-Stage
和Two-Stage
算法的性能差异:
可以看到在VOC2007
测试集上One-Stage
算法有着更快的检测速度。
SSD模型结构
SSD
算法的模型结构简单的说包括VGG16
基础网络和后面的特征提取检测网络,我们逐一学习。
基础网络
SSD
算法的基础网络是VGG16
,我们先复习下VGG16
的网络结构,如下图:
VGG16模型结构
可以看到:
VGG16
的网络输入是224*224*3
的图像- 经过两个卷积层(
Conv1
)得到224*224*64
尺寸的特征图 - 经过一个池化层和两个卷积层(
Conv2
)后得到112*112*128
尺寸的特征图 - 经过一个池化层和三个卷积层后(
Conv3
)得到56*56*256
尺寸的特征图 - 经过一个池化层和三个卷积层后(
Conv4
)得到28*28*512
尺寸的特征图 - 经过一个池化层和三个卷积层后(
Conv5
)得到14*14*512
尺寸的特征图 - 经过一个池化层后得到
7*7*512
尺寸的特征图 - 最后经过全连接层(
FC6&FC7
)后再接一个softmax
层后输出结果
上面的输入是224*224*3
的图像,这里SSD
算法有两种尺寸,一种是SSD300
就是输入图像大小为300*300*3
的,另外一种是SSD500
,即输入图像尺寸为500*500*3
。以SSD300
为例,则上面第5
步的Conv4
后,将得到38*38*512
的特征图。
SSD模型结构
了解了VGG16
这个基础网络,我们来看下SSD
的结构框架是什么样子的,如下图:
SDD结构框架
从图中我们可以看到,SSD
算法结构流程如下:
- 将尺寸大小为
300*300*3
的图像输入到VGG16
网络中,在VGG16
的第5
步也就是Conv4
之后得到38*38*512
的特征图 - 接着通过一个池化和
3*3*1024
的卷积层Conv6
得到19*19*1024
的特征图 - 之后再经过一个
1*1*1024
的卷积操作Conv7
,得到19*19*1024
的特征图 - 接着做一个
1*1*256
和3*3*512-s2
(s2
为stride=2
)的卷积操作Conv8
后得到10*10*512
的特征图 - 继续做卷积操作
Conv9
,具体为1*1*128
和3*3*256-s2
卷积之后得到5*5*256
的特征图 - 继续做卷积操作
Conv10
,具体为1*1*128
和3*3*256-s1
卷积之后得到3*3*256
的特征图 - 继续做卷积操作
Conv11
,具体为1*1*128
和3*3*256-s1
卷积之后得到1*1*256
的特征图
SSD
算法的大概结构如上,但是是如何进行分类和回归的呢?
我们发现,上图中Conv4
,Conv7
,Conv8
,Conv9
,Conv10
和Conv11
都有指向后面的8732
分类和最后的非极大值抑制。以Conv4为例,Conv4
后得到的特征图尺寸为38*38*512
,对该38*38
的特征图上的每个像素类似前面Faster-RCNN
中的anchor
一样,映射到输入图片上产生4
个候选框,总共产生38*38*4=5776
个候选框,然后对每个候选框进行分类和回归,而该分类和回归是通过一个3*3*(4*(Classes 4))
的卷积操作完成的。其他类似,比如对Conv7
,Conv8
和Conv9
特征图中每个像素产生6
个候选框,对Conv10
和Conv11
特征图中的每个像素产生4
个候选框。总计产生8732
个候选框,对每个候选框逐级分类和回归之后进行非极大值抑制操作,即得出目标检测结果。
SSD检测实例
我们知道根据特征图往输入图片上映射候选框会根据特征图大小进行不同比例的映射,也就是说前面的特征图,比如Conv4
和Conv7
映射的候选框偏小,可以用来检测小物体;Conv8
和Conv9
映射的候选框尺寸中等,可以用来检测中等大小的物体,而Conv10
和Conv11
映射到原图的候选框偏大,则可以用来检测大物体。这样实现的检测不同尺度物体的目的。接下来,我们实例看一下SSD
的预测过程,如下图:
SSD详细结构
在上图中,
- 输入图片
size
为300*300*3
,经过VGG16
的Conv4
后得到38*38*512
的特征图,对此特征图机芯正则化后对38*38*4=5776
个候选框进行分类和回归,由于该特征图常用来检测小物体,所以在该特征图上并未检测到图片中的汽车。 - 接着对上一步的特征图进行卷积操作得到
19*19*1024
的特征图,对生成的19*19*6=2166
个候选框进行分类和回归,在该特赠图上仍未检出物体。 - 继续做卷积操作,得到
10*10*512
的特征图,对生成的10*10*6=600
个候选框进行分类和回归,仍未检出目标物体。 - 继续做卷积操作,得到
5*5*256
的特征图,对生成的5*5*6=150
个候选框进行分类和回归,检出两个目标。 - 继续做卷积操作,得到
3*3*256
的特征图,对生成的3*3*4=36
个候选框进行分类和回归,检出一个目标。 - 继续做卷积操作,得到
1*1*256
的特征图,对生成的1*1*4=4
个候选框进行分类和回归,检出一个目标。 - 对这
5776 2166 600 150 36 4=8732
个候选框分类和回归之后,对检出结果进行非极大值抑制后得到最终的检测结果。
就这样,SSD
算法得到了不同尺寸特征图的特征映射,同时在不同的特征映射上面进行预测,由于它考虑了更多尺度的特征,在增加运算量的同时增提高了检测精度。下期我们将一起学习下SSD
算法的损失函数,Match
策略以及训练过程中的注意点。