目标检测重温SSD目标检测
Posted 超级无敌陈大佬的跟班
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了目标检测重温SSD目标检测相关的知识,希望对你有一定的参考价值。
前言:重温SSD目标检测模型,主要讲解SSD中先验框是如何处理的,适合已经看过SSD网络基本内容的读者。
网络结构图:
采用特征金字塔结构预测目标,共有6个feature map会预测目标。(第三章有详解)
一、SSD的两个预测分支:
- 一个是类别预测分支:输出的是单个检测框中每个类别的置信度(得分)。以conv8_2层为例,每个单元格有四个检测框,网络类别共21类。因此分类头channel为4×21=84。
- 一个是bbox框预测分支:输出的是bbox的x,y,w,h相对于先验框的偏移量(offset)。同样以conv8_2为例,每个单元格有4个检测框,每个检测框包含4个偏移量。因此bbox检测头的channel为4×4=16。
二、网络学习的是bbox的偏移量:
边界框的location,包含4个值 ,分别表示边界框的中心坐标以及宽高。但是网络学习的只是边界框相对于先验框的转换值(偏移量offset)。转换方式如下:
首先,先验框的位置为:
真实边界框为:
1、encode编码
那么,网络中bbox边界框的预测值其实是先验框相对于真实物体边界框的偏移量:
习惯上,我们称上面这个过程为边界框的编码(encode),预测时,你需要反向这个过程,即进行解码(decode),从预测值中得到边界框的真实位置:
2、decode解码
3、variance超参
然而,在SSD的Caffe源码实现中还有trick,那就是设置variance超参数来调整检测值,通过bool参数variance_encoded_in_target来控制两种模式,当其为True时,表示variance被包含在预测值中,就是上面那种情况。但是如果是False(大部分采用这种方式,训练更容易),就需要手动设置超参数variance,用来对的4个值进行放缩,此时边界框需要这样解码:
源码中variance[0,1,2,3]的取值一般为{0.1,0.1,0.2,0.2}.
三、先验框Priorbox是如何设置的?
SSD共选取了6个特征图进行检测框预测,分别如下:
先验框的设置主要有两个方面,一个是尺度,另一个是宽高比。
- 先验框的尺度控制每层特征图上先验框的基础尺寸大小
- 先验框的宽高比控制先验框的形状(宽高比例)。
3.1先验框的尺度如何设置
先验框的尺度,随着特征图尺度的减小而线性增长:由以下公式计算:
(1)
- m指的特征图个数,但取值为5,因为第0层(Conv4_3层)的尺度是单独设置的,设置为的1/2。
- 表示第K个特征图上先验框大小相对于图片的比例,而表示比例的最大值与最小值,paper里面取0.2和0.9。
- 对于第0个特征图,其先验框的尺度比例一般设置为 .
通过上面的公式(1)可以计算出
乘以图片大小(300×300),可以得到各个特征图的尺度为30,60,111,162,213,264。
3.2先验框的宽高比设置
先验框的宽高比设置为:
(2)
通过先验框的尺度和先验框的宽高比就能够计算出每层特征图上先验框的尺寸大小:
(3)
另外每个特征图还有一个宽高比为1,尺度为的先验框。
所以,真正实现时,先验框的宽高比共有6种:
- 其中第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先验框的中心点位置
每个单元格上的先验框的中心点位于单元格的中心,即:
为特征图的大小。
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:
权重系数通过交叉验证设置为1。
参考链接:
以上是关于目标检测重温SSD目标检测的主要内容,如果未能解决你的问题,请参考以下文章