目标检测重温SSD目标检测

Posted 超级无敌陈大佬的跟班

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了目标检测重温SSD目标检测相关的知识,希望对你有一定的参考价值。

前言:重温SSD目标检测模型,主要讲解SSD中先验框是如何处理的,适合已经看过SSD网络基本内容的读者。

网络结构图:

采用特征金字塔结构预测目标,共有6个feature map会预测目标。(第三章有详解)

一、SSD的两个预测分支:

  1. 一个是类别预测分支:输出的是单个检测框中每个类别的置信度(得分)。以conv8_2层为例,每个单元格有四个检测框,网络类别共21类。因此分类头channel为4×21=84。
  2. 一个是bbox框预测分支:输出的是bbox的x,y,w,h相对于先验框的偏移量(offset)。同样以conv8_2为例,每个单元格有4个检测框,每个检测框包含4个偏移量。因此bbox检测头的channel为4×4=16。

二、网络学习的是bbox的偏移量:

边界框的location,包含4个值(cx,cy,w,h)  ,分别表示边界框的中心坐标以及宽高。但是网络学习的只是边界框相对于先验框的转换值(偏移量offset)。转换方式如下:

首先,先验框的位置为:

d=(d^{cx},d^{cy},d^{w},d^{h})

真实边界框为:

b=(b^{cx},b^{cy},b^{w},b^{h})

1、encode编码

那么,网络中bbox边界框的预测值l其实是先验框d相对于真实物体边界框b的偏移量:

习惯上,我们称上面这个过程为边界框的编码(encode),预测时,你需要反向这个过程,即进行解码(decode),从预测值中l得到边界框的真实位置b

2、decode解码

3、variance超参

然而,在SSD的Caffe源码实现中还有trick,那就是设置variance超参数来调整检测值,通过bool参数variance_encoded_in_target来控制两种模式,当其为True时,表示variance被包含在预测值中,就是上面那种情况。但是如果是False(大部分采用这种方式,训练更容易),就需要手动设置超参数variance,用来对l的4个值进行放缩,此时边界框需要这样解码:

源码中variance[0,1,2,3]的取值一般为{0.1,0.1,0.2,0.2}.

三、先验框Priorbox是如何设置的?

SSD共选取了6个特征图进行检测框预测,分别如下:

先验框的设置主要有两个方面,一个是尺度,另一个是宽高比。

  1. 先验框的尺度控制每层特征图上先验框的基础尺寸大小
  2. 先验框的宽高比控制先验框的形状(宽高比例)。

3.1先验框的尺度如何设置

先验框的尺度,随着特征图尺度的减小而线性增长:由以下公式计算:

      (1)

  • m指的特征图个数,但取值为5,因为第0层(Conv4_3层)的尺度是单独设置的,设置为\\large s_{1}的1/2。
  • \\large s_{k}表示第K个特征图上先验框大小相对于图片的比例,而\\large s_{max} s_{min}表示比例的最大值与最小值,paper里面取0.2和0.9。
  • 对于第0个特征图,其先验框的尺度比例一般设置为 \\large s_{0}=s_{1}/2=0.1.

通过上面的公式(1)可以计算出\\large s_{(0,1,2,3,4,5)}=(0.1,0.2,0.37,0.54,0.71,0.88)

\\large s_{k}乘以图片大小(300×300),可以得到各个特征图的尺度为30,60,111,162,213,264。

3.2先验框的宽高比设置

先验框的宽高比设置为:

\\large a_{r}\\ =\\left \\{ 1,2,3,\\frac{1}{2},\\frac{1}{3} \\right \\}                        (2)

通过先验框的尺度\\large s_{k}和先验框的宽高比\\large a_{r}就能够计算出每层特征图上先验框的尺寸大小:

        (3)

另外每个特征图还有一个宽高比为1,尺度为\\large s_{k}^{'}=\\sqrt{s_{k}s_{k+1}}的先验框。

所以,真正实现时,先验框的宽高比共有6种:

\\large \\left \\{ 1,2,3,\\frac{1}{2} ,\\frac{1}{3},1^{'}\\right \\}

  • 其中第0、4、5层没有比例为3和1/3的先验框,原因:第0层框已经比较多了,第4、5层特征图尺度只有3*3和1*1,已经很小了,没必要设计3和1/3的比例。
  • 特征图从第0层到第5层,每个单元格的先验框个数为4,6,6,6,4,4。

下图就是先验框宽高比的示意图。

3.3先验框的中心点位置

每个单元格上的先验框的中心点位于单元格的中心,即:

 \\large \\left |f _{k} \\right |为特征图的大小。

3.4SSD网络先验框的总数量

38*38*4 + 19*19*6 + 10*10*6 + 5*5*6 + 3*3*4 + 1*1*4 = 8732个边界框

这是一个相当庞大的数字,因此,SSD本质上是密集采样。

训练过程

1、先验框匹配

在训练过程中,首先要确定训练图片中的ground truth(真实目标)与哪个先验框来进行匹配,与之匹配的先验框所对应的边界框将负责预测它。在Yolo中,ground truth的中心落在哪个单元格,该单元格中与其IOU最大的边界框负责预测它。但是在SSD中却完全不一样,SSD的先验框与ground truth的匹配原则主要有两点。

1)每个ground truth找出与之IOU最大的先验框作为正样本

首先,对于图片中每个ground truth,找到与其IOU最大的先验框,该先验框与其匹配,这样可以保证每个ground truth至少有一个与之匹配的先验框。通常称与ground truth匹配的先验框为正样本,反之,若一个先验框没有与任何ground truth进行匹配,那么该先验框只能与背景匹配,就是负样本。

一个图片中ground truth是非常少的, 而先验框却很多,如果仅按第一个原则匹配,很多先验框会是负样本,正负样本极其不平衡,所以需要第二个原则。

2)剩余先验框中与ground truth的IOU大于阈值(0.5)的先验框也设为正样本

第二个原则是:对于剩余的未匹配先验框,若某个ground truth的IOU大于某个阈值(一般是0.5),那么该先验框也与这个ground truth进行匹配。这意味着某个ground truth可能与多个先验框匹配,这是可以的。但是反过来却不可以,因为一个先验框只能匹配一个ground truth,如果某个先验框与多个ground truth的IOU大于阈值,那么先验框只与IOU最大的那个ground truth进行匹配。

原因:因为每个ground truth只将IOU最大的先验框设为正样本,那么每个ground truth只有一个正样本,导致图像中正样本数量太少,所以,将与ground truth的IOU大于阈值的先验框都设为正样本。

3) hard negative mining

尽管一个ground truth可以与多个先验框匹配,但是ground truth相对先验框还是太少了,所以负样本相对正样本会很多。为了保证正负样本尽量平衡,SSD采用了hard negative mining,就是对负样本进行抽样,抽样时按照置信度误差(预测背景的置信度越小,误差越大)进行降序排列,选取误差的较大的top-k作为训练的负样本,以保证正负样本比例接近1:3

2、损失函数

损失函数定义为位置误差(locatization loss, loc)与置信度误差(confidence loss, conf)的加权和:

 

对于置信度误差,其采用softmax loss:

权重系数\\large \\alpha通过交叉验证设置为1。

参考链接:

https://zhuanlan.zhihu.com/p/33544892

以上是关于目标检测重温SSD目标检测的主要内容,如果未能解决你的问题,请参考以下文章

解读SSD目标检测方法

目标检测网络SSD详解

基于改进SSD的车辆小目标检测方法

从零开始实现SSD目标检测(pytorch)

目标检测方法——SSD

pytorch-ssd目标检测可视化检测结果