目标检测 之 SSD

SSD,全称Single Shot MultiBox Detector
SSD具有如下主要特点:
  • 从YOLO中继承了将detection转化为regression的思路,一次完成目标定位与分类
  • 基于Faster RCNN中的Anchor,提出了相似的Prior box;
  • 加入基于特征金字塔(Pyramidal Feature Hierarchy)的检测方式,即在不同感受野的feature map上预测目标
所用到的特征图以及其大小如下表所示:
对于每个特征图来说,SSD引入初始框的概念,也就是说在每个特征图的单元格的中心设置一系列尺度和大小不同的初始框,这些初始框都会反向映射到原图的某一个位置,如果某个初始框的位置正好和真实目标框的位置重叠度很高,那么就通过损失函数预测这个初始框的类别,同时对这些初始框的形状进行微调,以使其符合我们标记的真实目标框。
 
不同卷积层各层特征信息主要有如下区别:
1、低层卷积可以捕捉到更多的细节信息,高层卷积可以捕捉到更多的抽象信息。
2、低层特性更关心“在哪里”,但分类准确度不高,而高层特性更关心“是什么”,但丢失了物体的位置信息。
 

SSD300与YOLOv1网络结构

目标检测分为了2种主流框架:
  • Two stages:以Faster RCNN为代表,即RPN网络先生成proposals目标定位,再对proposals进行classification+bounding box regression完成目标分类。
  • Single shot:以YOLO/SSD为代表,一次性完成classification+bounding box regression。
SSD与YOLO v1网络结构的区别:
  • YOLO在卷积层后接全连接层,即检测时只利用了最高层Feature maps(包括Faster RCNN也是如此)
  • SSD采用金字塔结构,即利用了conv4-3/conv-7/conv6-2/conv7-2/conv8_2/conv9_2这些大小不同的feature maps,在多个feature maps上同时进行softmax分类和位置回归
  • SSD还加入了Prior box
 
SSD采用VGG16作为基础模型,并且做了以下修改:
  • 分别将VGG16的全连接层FC6和FC7转换成 3x3 的卷积层 Conv6和 1x1 的卷积层Conv7
  • 去掉所有的Dropout层和FC8层
  • 同时将池化层pool5由原来的 stride=2 的 2x2 变成stride=1的 3x3 
  • 添加了Atrous算法(hole算法),目的获得更加密集的得分映射(空洞卷积)
  • 然后在VGG16的基础上新增了卷积层来获得更多的特征图以用于检测
 
(a)是普通的3×3卷积,其视野就是3×3,(b)是扩张率为2,此时视野变成7×7,(c)扩张率为4时,视野扩大为15×15,但是视野的特征更稀疏了。Conv6采用3×3大小但dilation rate=6的扩展卷积。
conv4_3层特征图大小是38×38,但是该层比较靠前,其norm较大,所以在其后面增加了一个L2 Normalization层,以保证和后面的检测层差异不是很大,这个和Batch Normalization层不太一样,其仅仅是对每个像素点在 channle维度做归一化,而Batch Normalization层是在[batch_size, width, height]三个维度上做归一化。
 
单层feature map预测和特征金字塔预测对比
 

Default box 和 Prior box(先验框)

图片被送进网络之后先生成一系列 feature map,传统框架会在 feature map(或者原图)上进行 region proposal 提取出可能有物体的部分然后进行分类,这一步可能非常费时,所以 SSD 就放弃了 region proposal,而选择直接生成一系列 defaul box(筛选出prior boxes投入训练),然后以prior box 为初始bbox,将bboxes回归到正确的GT位置上去,预测出的定位信息实际上是回归后的bboxes和回归前的(prior box)的相对坐标。整个过程通过网络的一次前向传播就可以完成。
 
Defalut box:
Default box是指在feature map的每个单元格(cell)上都有一系列固定大小的box。SSD 训练图像中的 groundtruth 需要赋予到那些固定输出的 boxes 上,看下节Prior box概念。如上图所示,每个单元格使用了4个不同的Defalut box(虚线框,仔细看格子的中间有比格子还小的一个box),图片a中猫和狗分别采用最适合它们形状的Defalut box来进行训练。假设每个feature map cell有k个default box,那么对于每个default box都需要预测C(包括背景)个类别score和4个offset,因此如果一个feature map的大小是m*n,那么这个feature map就一共有K*m*n个default box,每个default box需要预测4个坐标相关的值和C(包括背景)个类别概率,则在m*n的特征图上面将会产生(C+4)* K * m * n个输出。这些输出个数的含义是:采用3×3的卷积核对该层的feature map卷积时卷积核的个数,包含两部分,实际code是分别用不同数量的3*3卷积核对该层feature map进行卷积:比如数量为C*K的卷积核对应confidence输出,表示每个default box的confidence,也就是类别的概率;数量为4*K的卷积核对应localization输出,表示每个default box回归后的坐标)。作者的实验也表明default box的shape数量越多,效果越好。
 
SSD的一个核心是同时采用lower和upper的feature maps做检测。SSD中的Defalut box和Faster-rcnn中的anchor机制很相似。就是预设一些目标预选框,后续通过softmax分类+bounding box regression获得真实目标的位置。对于不同尺度的feature map上使用不同的Default boxes。如上图所示,我们选取的feature map包括38x38x512、19x19x1024、10x10x512、5x5x256、3x3x256、1x1x256。具体怎么得到的看下面的表。我们总共可以获得8732个box,然后我们将这些box送入NMS模块中,获得最终的检测结果。
以上的操作都是在特征图上面的操作,即我们在不同尺度的特征图上面产生很多的bbox,如果映射到原始图像中,我们会获得一个密密麻麻的bbox集合,如下图所示:
                                                     
Prior box概念:
       训练中还有一个东西: Prior box,是指实际中选择的要投入训练过程的Default box(每一个feature map cell 不是k个Default box都取)。
      也就是说Default box是一种概念,Prior box则是实际的选取。训练中一张完整的图片送进网络获得各个feature map,对于正样本训练来说,需要先将prior box与ground truth box做匹配,匹配成功说明这个prior box所包含的是个目标,但离完整目标的ground truth box还有段距离,训练的目的是保证default box的分类confidence的同时将prior box尽可能回归到ground truth box。
       举个列子:假设一个训练样本中有2个ground truth box,所有的feature map中获取的prior box一共有8732个。那可能分别有10、20个prior box能分别与这2个ground truth box匹配上。
 
SSD按照如下规则生成prior box:
对于输入大小是W×H的feature map,生成的prior box中心就是W×H个,均匀分布在整张图上,在每个中心上,可以生成多个不同长宽比的prior box,如[1/3, 1/2, 1, 2, 3]。所以在一个feature map上可以生成的prior box总数是W×H×length_of_aspect_ratio,对于比较大的feature map,如VGG的conv4_3,生成的prior box可以达到数千个。虽然prior box的位置是在W×H的格子上,但prior box的大小并不是跟格子一样大,而是人工指定的,原论文中随着feature map从底层到高层,prior box的大小在0.2到0.9之间均匀变化。 
先验框的设置,包括尺度(或者说大小)和长宽比两个方面。对于先验框的尺度,其遵守一个线性递增规则:随着特征图大小降低,先验框尺度线性增加:
 
其中m指的特征图个数,但却是5,因为第一层(Conv4_3层)是单独设置的,sk表示先验框大小相对于图片的比例,而smin和smax表示比例的最小值与最大值,paper里面取0.2和0.9。对于第一个特征图,其先验框的尺度比例一般设置为smin/2=0.1,那么尺度为300×0.1=30。对于后面的特征图,先验框尺度按照上面公式线性增加,可以得到各个特征图的先验框尺度 30,60,111,162,213,264。对于长宽比,一般选取ar∈{1,2,3,1/2,1/3},对于特定的长宽比,按如下公式计算先验框的宽度与高度(后面的sk均指的是先验框实际尺度,而不是尺度比例):
默认情况下,每个特征图会有一个 且尺度为 的先验框,除此之外,还会设置一个尺度为 的先验框,这样每个特征图都设置了两个长宽比为1但大小不同的正方形先验框。注意最后一个特征图需要参考一个虚拟 来计算 。因此,每个特征图一共有6个先验框 ,但是在实现时,Conv4_3,Conv10_2和Conv11_2层仅使用4个先验框,它们不使用长宽比为3,1/3的先验框。每个单元的先验框的中心点分布在各个单元的中心,即 ,其中 为特征图的大小。
 
Prior box如何使用: 以conv4_3为例进行分析
1、经过一次batch norm+一次卷积后,生成了[1, num_class*num_priorbox, layer_height, layer_width]大小的feature用于softmax分类目标和非目标(其中num_class是目标类别,SSD 300的VOC数据集中num_class = 21)
      2、经过一次batch norm+一次卷积后,生成了[1, 4*num_priorbox, layer_height, layer_width]大小的feature用于bounding box regression(即每个点一组偏移量[dxmin,dymin,dxmax,dymax])
      3、生成了[1, 2, 4*num_priorbox]大小的prior box blob,其中2个channel分别存储prior box的4个点坐标和对应的4个variance。4个variance,这实际上是一种bounding regression中的权重。
 
后续通过softmax分类+bounding box regression即可从priox box中预测到目标。熟悉Faster RCNN的读者应该对上述过程应该并不陌生。其实pribox box的与Faster RCNN中的anchor非常类似,都是目标的预设框,没有本质的差异。区别是每个位置的prior box一般是4~6个,少于Faster RCNN默认的9个anchor;同时prior box是设置在不同尺度的feature maps上的,而且大小不同。
 
 
 

SSD训练过程:

在训练过程中,首先要确定训练图片中的ground truth(真实目标)与哪个先验框来进行匹配,与之匹配的先验框所对应的边界框将负责预测它。在Yolo中,ground truth的中心落在哪个单元格,该单元格中与其IOU最大的边界框负责预测它。但是在SSD中却完全不一样,SSD的先验框与ground truth的匹配原则主要有两点。 首先,对于图片中每个ground truth,找到与其IOU最大的先验框,该先验框与其匹配,这样,可以保证每个ground truth一定与某个先验框匹配。通常称与ground truth匹配的先验框为正样本,反之,若一个先验框没有与任何ground truth进行匹配,那么该先验框只能与背景匹配,就是负样本。一个图片中ground truth是非常少的, 而先验框却很多,如果仅按第一个原则匹配,很多先验框会是负样本,正负样本极其不平衡,所以需要第二个原则。 第二个原则是:对于剩余的未匹配先验框,若某个ground truth的IOU大于某个阈值(一般是0.5),那么该先验框也与这个ground truth进行匹配。这意味着某个ground truth可能与多个先验框匹配,这是可以的。但是反过来却不可以,因为一个先验框只能匹配一个ground truth,如果多个ground truth与某个先验框IOU大于阈值,那么先验框只与IOU最大的那个先验框进行匹配。第二个原则一定在第一个原则之后进行,仔细考虑一下这种情况,如果某个ground truth所对应最大IOU小于阈值,并且所匹配的先验框却与另外一个ground truth的IOU大于阈值,那么该先验框应该匹配谁,答案应该是前者,首先要确保某个ground truth一定有一个先验框与之匹配。
(1)每一个 prior box 经过Jaccard系数计算和真实框的相似度。
(2)阈值只有大于 0.5 的才可以列为候选名单;假设选择出来的是N个匹配度高于百分之五十的框。
(3)我们令 i 表示第 i 个默认框,j 表示第 j 个真实框,p表示第p个类。那么 表示 第 i 个 prior box 匹配到 第 j 个 ground truth box ,并且这个ground truth box的 类别是p,若不匹配的话,则=0 。
(4)总的目标损失函数(objective loss function)为 localization loss(loc) 与 confidence loss(conf) 的加权求和。
下图为一个匹配示意图,其中绿色的GT是ground truth,红色为先验框,FP表示负样本,TP表示正样本。
尽管一个ground truth可以与多个先验框匹配,但是ground truth相对先验框还是太少了,所以负样本相对正样本会很多。为了保证正负样本尽量平衡,SSD采用了hard negative mining,就是对负样本进行抽样,抽样时按照置信度误差(预测背景的置信度越小,误差越大)进行降序排列,选取误差的较大的top-k作为训练的负样本,以保证正负样本比例接近1:3。
损失函数 Loss计算:
 
总体目标损失函数定位损失(loc)和置信度损失(conf)的加权和:
 
 
        对于SSD,虽然paper中指出采用了所谓的“multibox loss”,但是可以看到与常见的 Object Detection模型的目标函数相同,SSD算法的目标函数分为两部分:计算相应的default box与目标类别的confidence loss以及相应的location loss(位置回归)。其中N是匹配到GT(Ground Truth)的prior box数量,如果N=0,则将损失设为0;而 α 参数用于调整confidence loss和location loss之间的比例,默认 α=1。
 
SSD中的confidence loss是是在多类别置信度(c)上的softmax loss,公式如下:
      其中 i 指代搜索框序号,j 指代真实框序号,p 指代类别序号,p=0 表示背景。其中中取1表示第 i 个prior box匹配到第 j 个GT box,而这个GT box的类别为 p 。 表示第i个搜索框对应类别p的预测概率。此处有一点需要关注,公式前半部分是正样本(Pos)的损失,即分类为某个类别的损失(不包括背景),后半部分是负样本(Neg)的损失,也就是类别为背景的损失。
而location loss(位置回归)是典型的smooth L1 loss:
其中,  为预测框,  为 ground truth。   为补偿(regress to offsets)后的默认框 的中心,  为默认框的宽和高
 
更详细的解释看一看下图:
 
 
 
发布了34 篇原创文章 · 获赞 3 · 访问量 736

猜你喜欢

转载自blog.csdn.net/qq_41168327/article/details/105019193