精华内容
下载资源
问答
  • 2021-11-03 20:36:42

    SSD是YOLO之后又一个引人注目的目标检测结构,它沿用了YOLO中直接回归 bbox和分类概率的方法,同时又参考了Faster R-CNN,大量使用anchor来提升识别准确度。通过把这两种结构相结合,SSD保持了很高的识别速度,还能把mAP提升到较高的水平。

    以每个anchor为中心点,人为设置不同的尺度(scale)和长宽比(aspect ratio),即可得到基于anchor的多个anchor box,用以框定图像中的目标,这就是所谓的anchor 机制。如下图所示,左侧显示了基于一个anchor点生成的9个anchor box(红、绿、蓝三种颜色),右侧显示了该特征图上密集分布的所有anchor box。

    在这里插入图片描述
    (1)使用anchor机制产生密集的anchor box,使得网络可直接在此基础上进行目标分类及边界框坐标回归;

    (2)密集的anchor box可有效提高网络目标召回能力,对于小目标检测来说提升非常明显。

    1 基本结构与原理

    更多相关内容
  • ssd目标检测代码完整版 keras版本
  • keras版本SSD目标检测模型H5文件,用于模型训练和测试。包含SSD300的权重文件。
  • 可以在arm嵌入式设备上运行的代码,在树莓派上测试过,无需编译直接运行
  • 运行环境: 1.python 3.7.4 2.pytorch 1.4.0 ...ssd_net_vgg.py 定义class SSD的文件 Train.py 训练代码 voc0712.py 数据集处理代码(没有改文件名,改的话还要改其他代码) loss_function.py 损失函
  • SSD目标检测

    千次阅读 2021-04-20 12:08:05
    SSD,全称Single Shot MultiBox Detector,是Wei Liu在ECCV 2016上提出的一种目标检测算法,是主要的检测框架之一,相比Faster RCNN有明显的速度优势,相比YOLO又有明显的mAP优势。 SSD主要用来解决目标检测的问题...

    一、简介

    SSD,全称Single Shot MultiBox Detector,是Wei Liu在ECCV 2016上提出的一种目标检测算法,是主要的检测框架之一,相比Faster RCNN有明显的速度优势,相比YOLO又有明显的mAP优势。
    SSD主要用来解决目标检测的问题(定位+分类),即输入一张待测图像,输出多个box的位置信息和类别信息;测试时,输入一张图像到SSD中,网络输出一个下tensor(多维矩阵),对该矩阵进行非极大值抑制(NMS)就能得到每个目标的位置和label信息
    在这里插入图片描述
    SSD具有如下主要特点:

    • 从YOLO中继承了将detection转化为regression的思路,一次完成目标定位与分类;
    • 基于Faster RCNN中的Anchor,提出了相似的Prior box;
    • 加入基于特征金字塔(Pyramidal Feature Hierarchy)的检测方式,即在不同感受野的feature map上预测目标

    二、SSD 300网络结构

    在这里插入图片描述
    截止到目前目标检测分为了2种主流框架:

    Two stages:以Faster RCNN为代表,即RPN网络先生成proposals目标定位,再对proposals进行classification+bounding box regression完成目标分类。
    Single shot:以YOLO/SSD为代表,一次性完成classification+bounding box regression。
    SSD与YOLO区别:

    YOLO在卷积层后接全连接层,即检测时只利用了最高层Feature maps(包括Faster RCNN也是如此)
    SSD采用金字塔结构,即利用了conv4-3/conv-7/conv6-2/conv7-2/conv8_2/conv9_2这些大小不同的feature maps,在多个feature maps上同时进行softmax分类和位置回归

    在这里插入图片描述
    2 Prior Box
    在SSD300中引入了Prior Box,实际上与Faster RCNN Anchor非常类似,就是一些目标的预选框,后续通过classification+bounding box regression获得真实目标的位置。
    SSD按照如下规则生成prior box:

    • 以feature map上每个点的中点为中心(offset=0.5),生成一些列同心的prior box(然后中心点的坐标会乘以step,相当于从feature map位置映射回原图位置)
    • 正方形prior box最小边长为 m i n − s i z e min_-size minsize,最大边长为 m i n − s i z e ∗ m a x − s i z e \sqrt{min_-{size}*max _-{ size}} minsizemaxsize
    • 每在prototxt设置一个aspect ratio,会生成2个长方形,长宽为: a s p e c t − r a t i o ∗ m a x − s i z e \sqrt{aspect_-{ratio}}*max _-{ size} aspectratio maxsize
      1 / a s p e c t − r a t i o ∗ m i n − s i z e 1/\sqrt{aspect_-{ratio}}*min _-{ size} 1/aspectratio minsize

    在这里插入图片描述
    而每个feature map对应prior box的min_size和max_size由以下公式决定:
    [公式]

    公式中的 m 是指进行预测时使用feature map的数量,如SSD300使用conv4-3等6个feature maps进行预测,所以 m = 6 。同时原文设定 s m i n s_{min} smin=0.2 , s m a x s_{max} smax=0.9。

    那么:

    对于conv4-3: k=1 , m i n − s i z e = s 1 ∗ 300 min_ -{size}=s_{1}*300 minsize=s1300 , m a x − s i z e = s 2 ∗ 300 max_ -{size}=s_{2}*300 maxsize=s2300
    对于conv-7:k=2 , m i n − s i z e = s 2 ∗ 300 min_ -{size}=s_{2}*300 minsize=s2300 , m a x − s i z e = s 3 ∗ 300 max_ -{size}=s_{3}*300 maxsize=s3300

    显然可以用上述公式推导出每个feature maps使用的Prior Box size。但是在SSD300中prior box设置并不能完全和上述公式对应:
    在这里插入图片描述

    三、SSD的数据流
    对于新学习SSD的人,肯定有一个很大的困惑,就是这么多feature maps和Prior Box,如何组合在一起进行forwards/backwards。本节专门介绍SSD的数据流动方式,也许有点难。但是只有了解SSD的数据流动方式才能真的理解。
    在这里插入图片描述四、 SSD网络结构优劣分析
    SSD算法的优点应该很明显:运行速度可以和YOLO媲美,检测精度可以和Faster RCNN媲美.
    但也有缺点:

    需要人工设置prior box的min_size,max_size和aspect_ratio值。网络中prior box的基础大小和形状不能直接通过学习获得,而是需要手工设置。而网络中每一层feature使用的prior box大小和形状恰好都不一样,导致调试过程非常依赖经验。
    虽然采用了pyramdial feature hierarchy的思路,但是对小目标的recall依然一般,并没有达到碾压Faster RCNN的级别。作者认为,这是由于SSD使用conv4_3低级feature去检测小目标,而低级特征卷积层数少,存在特征提取不充分的问题。
    五、算法
    (1)算法步骤
    1、输入一幅图片(300x300),将其输入到预训练好的分类网络中来获得不同大小的特征映射,修改了传统的VGG16网络

    ①将VGG16的FC6和FC7层转化为卷积层,如图1上的Conv6和Conv7;
    ②去掉所有的Dropout层和FC8层;
    ③添加了Atrous算法(hole算法);
    ④将Pool5从2x2-S2变换到3x3-S1;
    2、抽取Conv4_3、Conv7、Conv8_2、Conv9_2、Conv10_2、Conv11_2层的feature map,然后分别在这些feature map层上面的每一个点构造6个不同尺度大小的bbox,然后分别进行检测和分类,生成多个bbox。

    3、将不同feature map获得的bbox结合起来,经过NMS(非极大值抑制)方法来抑制掉一部分重叠或者不正确的bbox,生成最终的bbox集合(即检测结果);
    (2)算法细节
    ①多尺度特征映射

    SSD算法中使用到了conv4_3,conv_7,conv8_2,conv7_2,conv8_2,conv9_2,conv10_2,conv11_2这些大小不同的feature maps,其目的是为了能够准确的检测到不同尺度的物体,因为在低层的feature map,感受野比较小,高层的感受野比较大,在不同的feature map进行卷积,可以达到多尺度的目的。

    我们将一张图片输入到一个卷积神经网络中,经历了多个卷积层和池化层,我们可以看到在不同的卷积层会输出不同大小的feature map(这是由于pooling层的存在,它会将图片的尺寸变小),而且不同的feature map中含有不同的特征,而不同的特征可能对我们的检测有不同的作用。
    总的来说,浅层卷积层对边缘更加感兴趣,可以获得一些细节信息,而深层网络对由浅层特征构成的复杂特征更感兴趣,可以获得一些语义信息,对于检测任务而言,一幅图像中的目标有复杂的有简单的,对于简单的patch我们利用浅层网络的特征就可以将其检测出来,对于复杂的patch我们利用深层网络的特征就可以将其检测出来,因此,如果我们同时在不同的feature map上面进行目标检测,理论上面应该会获得更好的检测效果。

    ②Defalut box

    在这里插入图片描述
    如上图所示,在特征图的每个位置预测K个bbox,对于每一个bbox,预测C个类别得分,以及相对于Default box的4个偏移量值,这样总共需要 (C+4)×K个预测器,则在m×n的feature map上面将会产生 (C+4)×K×m×n个预测值。

    SSD中的Defalut box和Faster-rcnn中的anchor机制很相似。就是预设一些目标预选框,后续通过softmax分类+bounding box regression获得真实目标的位置。对于不同尺度的feature map 上使用不同的Default boxes。

    ③Loss
    loss函数分为两部分:计算相应的default box与目标类别的confidence loss以及相应的位置回归。
    在这里插入图片描述

    其中N是match到Ground Truth的default box数量;而alpha参数用于调整confidence loss和location loss之间的比例,默认alpha=1。

    位置回归则是采用 Smooth L1 loss,loss函数为:
    在这里插入图片描述

    confidence loss是典型的softmax loss:
    在这里插入图片描述
    ④数据增广
    数据增强可以明显的提高算法的性能。

    不同于Faster R-CNN,SSD算法使用了多种数据增强的方法,包括水平翻转、裁剪、放大和缩小等。主要的目的是为了使得该算法对输入的不同大小和不同形状的目标具有更好的鲁棒性。直观的理解是通过这个数据增强操作可以增加训练样本的个数,同时构造出更多的不同形状和大小的目标,将其输入到网络中,可以使得网络学习到更加鲁棒的特征。
    在这里插入图片描述
    在这里插入图片描述
    ⑤ NMS(非极大值抑制)
    NMS简单原理: 对于Bounding Box的列表B及其对应的置信度S,采用下面的计算方式.选择具有最大 score的检测框M,将其从B集合中移除并加入到最终的检测结果D中.通常将B中剩余检测框中与M的IoU大于阈值的框从B中移除.重复这个过程,直到B为空。

    在 SSD 算法中,NMS 至关重要。因为多个 feature map 最后会产生大量的 bounding boxes,即最终检测结果。然而在这些bounding boxes中存在着大量的错误的、重叠的、不准确的样本,这不仅造成了巨大的计算量,如果处理不好会影响算法的性能。仅仅依赖于IOU 是不现实的,IOU值设置的太大,可能就会丢失一部分检测的目标,即会出现大量的漏检情况;IOU值设置的太小,则会出现大量的重叠检测,会大大影响检测器的性能。

    即使在IOU处理掉大部分的bounding boxes之后,仍然会存在大量的错误的、重叠的、不准确的bounding boxes(,这就需要NMS进行迭代优化。
    在这里插入图片描述
    ⑥SSD算法的局限:
    SSD采用多尺度的特征图来预测物体,使用具有较大感受野的高层特征信息预测大物体,具有较小感受野的低层特征信息预测小物体。

    这样就带来一个问题:使用的低层网络的特征信息预测小物体时,由于缺乏高层语义特征,导致SSD对于小物体的检测效果较差。

    而解决这个问题的思路就是对高层语意信息和低层细节信息进行融合。DSSD采用Top Down的网络结构进行高低层特征的融合并且改进了传统上采样的结构。

    DSSD算法思想:

    DSSD使用一种通用的Top Down的融合方法,使用VGG和Resnet网络,以及不同大小的训练图片尺寸来验证算法的通用性。

    将高层的语义信息融入到低层网络的特征信息中,丰富预测回归位置框和分类任务输入的多尺度特征图,以此来提高检测精度。

    在提取出多尺度特征图之后,DSSD 提出由残差单元组成的预测模块,进一步提取深度的特征最后输入给框回归任务和分类任务。
    其他的就不多赘述了~

    展开全文
  • SSD目标检测算法论文-英文原版,SSD: Single Shot MultiBox Detector
  • SSD 目标检测

    千次阅读 2018-09-30 17:23:57
    转载自:...SSD github : https://github.com/weiliu89/caffe/tree/ssd SSD paper : https://arxiv.org/abs/1512.02325 SSD eccv2016 slide pdf : http://do...

    转载自:https://blog.csdn.net/a8039974/article/details/77592395

    SSD github : https://github.com/weiliu89/caffe/tree/ssd

    SSD paper : https://arxiv.org/abs/1512.02325

    SSD eccv2016 slide pdf : http://download.csdn.NET/download/zy1034092330/9940054

    SSD pose estimation paper : http://download.csdn.net/download/zy1034092330/9940059



    图1

    缩进SSD,全称Single Shot MultiBox Detector,是Wei Liu在ECCV 2016上提出的一种目标检测算法,截至目前是主要的检测框架之一,相比Faster RCNN有明显的速度优势,相比YOLO又有明显的mAP优势(不过已经被CVPR 2017的YOLO9000超越)。SSD具有如下主要特点:

    1. 从YOLO中继承了将detection转化为regression的思路,同时一次即可完成网络训练
    2. 基于Faster RCNN中的anchor,提出了相似的prior box;
    3. 加入基于特征金字塔(Pyramidal Feature Hierarchy)的检测方式,相当于半个FPN思路

    本文接下来都以SSD 300为例进行分析。


    1 SSD网络结构

    图2 SSD网络结构(和代码貌似有点差别)

    缩进上图2是原论文中的SSD 300网络结构图。可以看到YOLO在卷积层后接全连接层,即检测时只利用了最高层feature maps(包括Faster RCNN也是如此);而SSD采用了特征金字塔结构进行检测,即检测时利用了conv4-3,conv-7(FC7),conv6-2,conv7-2,conv8_2,conv9_2这些大小不同的feature maps,在多个feature maps上同时进行softmax分类和位置回归,如图3。

    图3 单层feature map预测和特征金字塔预测对比


    2 Prior Box

    缩进在SSD中引入了Prior Box,实际上与anchor非常类似,就是一些目标的预选框,后续通过softmax分类+bounding box regression获得真实目标的位置。SSD按照如下规则生成prior box:

    • 以feature map上每个点的中点为中心(offset=0.5),生成一些列同心的prior box(然后中心点的坐标会乘以step,相当于从feature map位置映射回原图位置)
    • 正方形prior box最小边长为,最大边长为:
    • 每在prototxt设置一个aspect ratio,会生成2个长方形,长宽为: 和 


    图4 prior box

    • 而每个feature map对应prior box的min_size和max_size由以下公式决定,公式中m是使用feature map的数量(SSD 300中m=6):

    第一层feature map对应的min_size=S1,max_size=S2;第二层min_size=S2,max_size=S3;其他类推。在原文中,Smin=0.2,Smax=0.9,但是在SSD 300中prior box设置并不能和paper中上述公式对应:

     min_sizemax_size
    conv4_3
    30
    60
    fc7
    60
    111
    conv6_2
    111
    162
    conv7_2
    162
    213
    conv8_2
    213
    264
    conv9_2 
    264
    315

    不过依然可以看出,SSD使用低层feature map检测小目标,使用高层feature map检测大目标,这也应该是SSD的突出贡献了。其中SSD 300在conv4_3生成prior box的conv4_3_norm_priorbox层prototxt定义如下:

    1. layer {  
    2.   name: "conv4_3_norm_mbox_priorbox"  
    3.   type: "PriorBox"  
    4.   bottom: "conv4_3_norm"  
    5.   bottom: "data"  
    6.   top: "conv4_3_norm_mbox_priorbox"  
    7.   prior_box_param {  
    8.     min_size: 30.0  
    9.     max_size: 60.0  
    10.     aspect_ratio: 2  
    11.     flip: true  
    12.     clip: false  
    13.     variance: 0.1  
    14.     variance: 0.1  
    15.     variance: 0.2  
    16.     variance: 0.2  
    17.     step: 8  
    18.     offset: 0.5  
    19.   }  
    20. }  

    知道了priorbox如何产生,接下来分析prior box如何使用。这里以conv4_3为例进行分析。

    图5

    从图5可以看到,在conv4_3 feature map网络pipeline分为了3条线路:

    • 经过一次batch norm+一次卷积后,生成了[1, num_class*num_priorbox, layer_height, layer_width]大小的feature用于softmax分类目标和非目标(其中num_class是目标类别,SSD 300中num_class = 21)
    • 经过一次batch norm+一次卷积后,生成了[1, 4*num_priorbox, layer_height, layer_width]大小的feature用于bounding box regression(即每个点一组[dxmin,dymin,dxmax,dymax],参考Faster RCNN 2.5节)
    • 生成了[1, 2, 4*num_priorbox]大小的prior box blob,其中2个channel分别存储prior box的4个点坐标和对应的4个variance

    缩进后续通过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上的,而且大小不同。

    缩进还有一个细节就是上面prototxt中的4个variance,这实际上是一种bounding regression中的权重。在图4线路(2)中,网络输出[dxmin,dymin,dxmax,dymax],即对应下面代码中bbox;然后利用如下方法进行针对prior box的位置回归:

    1. decode_bbox->set_xmin(  
    2.     prior_bbox.xmin() + prior_variance[0] * bbox.xmin() * prior_width);  
    3. decode_bbox->set_ymin(  
    4.     prior_bbox.ymin() + prior_variance[1] * bbox.ymin() * prior_height);  
    5. decode_bbox->set_xmax(  
    6.     prior_bbox.xmax() + prior_variance[2] * bbox.xmax() * prior_width);  
    7. decode_bbox->set_ymax(  
    8.     prior_bbox.ymax() + prior_variance[3] * bbox.ymax() * prior_height);  

    上述代码可以在SSD box_utils.cpp的void DecodeBBox()函数见到。


    3 Permute,Flatten And Concat Layers

    图6

    缩进上一节以conv4_3 feature map分析了如何检测到目标的真实位置,但是SSD 300是使用包括conv4_3在内的共计6个feature maps一同检测出最终目标的。在网络运行的时候显然不能像图6一样:一个feature map单独计算一次softmax socre+box regression(虽然原理如此,但是不能如此实现)。那么多个feature maps如何协同工作?这时候就要用到Permute,Flatten和Concat这3种层了。其中conv4_3_norm_conf_perm的prototxt定义如下:

    Permute是SSD中自带的层,上面conv4_3_norm_mbox_conf_perm的的定义。Permute相当于交换caffe blob中的数据维度。在正常情况下caffe blob的顺序为:

    bottom blob = [batch_num, channel, height, width]

    经过conv4_3_norm_mbox_conf_perm后的caffe blob为:

    top blob = [batch_num, height, width, channel]

    而Flattlen和Concat层都是caffe自带层,请参照caffe official documentation理解。



    图7 SSD中部分层caffe blob shape变化


    缩进那么接下来以conv4_3和fc7为例分析SSD是如何将不同size的feature map组合在一起进行prediction。图7展示了conv4_3和fc7合并在一起的过程中caffe blob shape变化(其他层类似,考虑到图片大小没有画出来,请脑补)。

    • 对于conv4_3 feature map,conv4_3_norm_priorbox(priorbox层)设置了每个点共有4个prior box。由于SSD 300共有21个分类,所以conv4_3_norm_mbox_conf的channel值为num_priorbox * num_class = 4 * 21 = 84;而每个prior box都要回归出4个位置变换量,所以conv4_3_norm_mbox_loc的caffe blob channel值为4 * 4 = 16。
    • fc7每个点有6个prior box,其他feature map同理。
    • 经过一系列图7展示的caffe blob shape变化后,最后拼接成mbox_conf和mbox_loc。而mbox_conf后接reshape,再进行softmax(为何在softmax前进行reshape,Faster RCNN有提及)。
    • 最后这些值输出detection_out_layer,获得检测结果

    4 SSD网络结构优劣分析

    缩进SSD算法的优点应该很明显:运行速度可以和YOLO媲美,检测精度可以和Faster RCNN媲美。除此之外,还有一些鸡毛蒜皮的优点,不解释了。这里谈谈缺点:

    1. 需要人工设置prior box的min_size,max_size和aspect_ratio值。网络中prior box的基础大小和形状不能直接通过学习获得,而是需要手工设置。而网络中每一层feature使用的prior box大小和形状恰好都不一样,导致调试过程非常依赖经验。
    2. 虽然采用了pyramdial feature hierarchy的思路,但是对小目标的recall依然一般,并没有达到碾压Faster RCNN的级别。作者认为,这是由于SSD使用conv4_3低级feature去检测小目标,而低级特征卷积层数少,存在特征提取不充分的问题。


    5 SSD训练过程


    缩进对于SSD,虽然paper中指出采用了所谓的“multibox loss”,但是依然可以清晰看到SSD loss分为了confidence loss和location loss两部分,其中N是match到GT(Ground Truth)的prior box数量;而α参数用于调整confidence loss和location loss之间的比例,默认α=1。SSD中的confidence loss是典型的softmax loss:


    其中代表第i个prior box匹配到了第j个class为p类别的GT box;而location loss是典型的smooth L1 loss:

    Matching strategy:

    缩进在训练时,groundtruth boxes 与 default boxes(就是prior boxes) 按照如下方式进行配对:

    • 首先,寻找与每一个ground truth box有最大的jaccard overlap的default box,这样就能保证每一个groundtruth box与唯一的一个default box对应起来(所谓的jaccard overlap就是IoU,如图8)。
    • SSD之后又将剩余还没有配对的default box与任意一个groundtruth box尝试配对,只要两者之间的jaccard overlap大于阈值,就认为match(SSD 300 阈值为0.5)。
    • 显然配对到GT的default box就是positive,没有配对到GT的default box就是negative。

    图8 jaccard overlap

    Hard negative mining:
    缩进值得注意的是,一般情况下negative default boxes数量>>positive default boxes数量,直接训练会导致网络过于重视负样本,从而loss不稳定。所以需要采取:
    • 所以SSD在训练时会依据confidience score排序default box,挑选其中confidience高的box进行训练,控制positive:negative=1:3

    Data augmentation:

    缩进数据增广,即每一张训练图像,随机的进行如下几种选择:

    • 使用原始的图像
    • 采样一个 patch,与物体之间最小的 jaccard overlap 为:0.1,0.3,0.5,0.7 或 0.9
    • 随机的采样一个 patch
    采样的 patch 是原始图像大小比例是[0.1,1],aspect ratio在1/2与2之间。当 groundtruth box 的 中心(center)在采样的patch中时,保留重叠部分。在这些采样步骤之后,每一个采样的patch被resize到固定的大小,并且以0.5的概率随机的 水平翻转(horizontally flipped)。


    其实Matching strategy,Hard negative mining,Data augmentation,都是为了加快网络收敛而设计的。尤其是Data augmentation,翻来覆去的randomly crop,保证每一个prior box都获得充分训练而已。不过当数据达到一定量的时候,不建议再进行Data augmentation,毕竟“真”的数据比“假”数据还是要好很多。

    展开全文
  • 主要文件说明: ssd_net_vgg.py 定义class SSD的文件 Train.py 训练代码 voc0712.py 数据集处理代码(没有改文件名,改的话还要改其他代码) loss_function.py 损失函数 detection.py 检测结果的处理代码,将SSD返回...
  • SSD方法图像目标检测,该模型为Tesnorflow版本,可以直接在Tesorflow环境下载入进行预测.
  • 针对SSD算法在计算机视觉中检测多目标时出现的漏检现象,在SSD算法的基础上,将VGG-16网络替换为密集型网络,并对目标检测后的所有预测框进行非极大值抑制算法改进,使得每层网络都直接连接输入和损失,保证所提取到...
  • 为提升原始SSD算法的小目标检测精度及鲁棒性,提出一种基于通道注意力机制的SSD目标检测算法。在原始SSD算法的基础上对高层特征图进行全局池化操作,结合通道注意力机制增强高层特征图的语义信息,并利用膨胀卷积...
  • 前言:重温SSD目标检测模型,主要讲解SSD中先验框是如何处理的,适合已经看过SSD网络基本内容的读者。 网络结构图: 采用特征金字塔结构预测目标,共有6个feature map会预测目标。 分别为: 参考...

    前言:重温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算法的网络结构为基础的一种新颖的目标检测算法RF_SSD,...
  • SSD是经典的一阶目标检测网络框架,特点是速度快,网络简洁。 主要思想: (1)数据增强,包括光学变换和几何变换 (2)网络骨架,SSD在VGG基础上延伸了4个卷积模块(生成不同尺度的特征图) (3)PriorBox与...
  • SSD训练结核杆菌冻结训练、解冻训练各50世代总共100世代,训练得到的模型权重文件。后续可在此权重基础上继续迁移学习
  • https://blog.csdn.net/qq_41368247/article/details/88027340
  • SSD目标检测】3:训练自己的数据集

    万次阅读 多人点赞 2018-07-20 14:22:34
    前言:上一章已经详细介绍了SSD——多目标定位检测识别算法,该框架是Google开源的代码,所以自然有很多前辈做改进了。我也不过是站在前辈的肩膀上,这一章就是讲解如何训练自己的数据集,让SSD框架识别。源码也无偿...
  • 睿智的目标检测37——TF2搭建SSD目标检测平台(tensorflow2)学习前言什么是SSD目标检测算法源码下载SSD实现思路一、预测部分1、主干网络介绍2、从特征获取预测结果3、预测结果的解码4、在原图上进行绘制二、训练...
  • 之前搜集的基于SSD目标检测结构的改进论文英文原文,看过的大佬不必在意,如果需要进行相关文档而不愿意费力去找的可以直接下载。
  • 基于SSD算法的人脸目标检测的研究.pdf
  • 该文为实践李沐《动手学深度学习》目标检测这一章节,所有代码均出自于该电子书,为个人反思和总结
  • opencv运行SSD目标检测

    2018-06-20 15:46:06
    VS2015+OPENCV3.4.0+SSD进行目标完整检测的工程,包括图片目标检测和相应的加载视频进行目标检测。直接下载编译即可以运行。
  • 提出了一种基于深度学习的多视窗 SSD(Single Shot multibox Detector)目标检测方法。首先 阐述了经典 SSD 方法的模型与工作原理,并根据卷积感受野的概念和模型特征层与原始图像的映射 关系,分析了各层级卷积感受野...
  • 上一章我们了解到,物体识别检测算法是在传统CNN算法基础上加上目标区域建议策略和边框回归算法得到的。前辈们的工作主要体现在目标区域建议的改进策略上,从最开始的穷举建议框,到划分图像区域,再到从特征图上...
  • 端到端的目标检测算法SSD,论文中涉及的目标框个数,长宽比等计算
  • 返回主目录 返回 目标检测史 目录 上一章:深度篇——目标检测史(四)细说从 Fast R-CNN到 Faster R-CNN目标检测 ...本小节,细说 SSD目标检测,下一小节细说 YOLO-V3目标检测 六.SSD目标检测 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,820
精华内容 8,728
关键字:

ssd目标检测

友情链接: sl.zip