SSD算法详解default box

article/2025/9/15 12:30:50

本文提出的SSD算法是一种直接预测目标类别和bounding box的多目标检测算法。

与faster rcnn相比,该算法没有生成 proposal 的过程,这就极大提高了检测速度。针对不同大小的目标检测,传统的做法是先将图像转换成不同大小(图像金字塔),然后分别检测,最后将结果综合起来(NMS)。

而SSD算法则利用不同卷积层的 feature map 进行综合也能达到同样的效果。算法的主网络结构是VGG16,将最后两个全连接层改成卷积层,并随后增加了4个卷积层来构造网络结构。对其中5种不同的卷积层的输出(feature map)分别用两个不同的 3×3的卷积核进行卷积,一个输出分类用的confidence,每个default box 生成21个类别confidence;一个输出回归用的 localization,每个 default box生成4个坐标值(x, y, w, h)。

此外,这5个feature map还经过 PriorBox 层生成 prior box(生成的是坐标)。上述5个feature map中每一层的default box的数量是给定的(8732个)。最后将前面三个计算结果分别合并然后传给loss层。

Default box

文章的核心之一是作者同时采用lower和upper的feature map做检测。

如图Fig 1 所示,这里假定有8×8和4×4两种不同的feature map。第一个概念是feature map cell,feature map cell 是指feature map中每一个小格子,如图中分别有64和16个cell。另外有一个概念:default box,是指在feature map的每个小格(cell)上都有一系列固定大小的box,如下图有4个(下图中的虚线框,仔细看格子的中间有比格子还小的一个box)。

假设每个feature map cell有k个default box,那么对于每个default box都需要预测c个类别score和4个offset,那么如果一个feature map的大小是m×n,也就是有m*n个feature map cell,那么这个feature map就一共有(c+4)*k * m*n 个输出。这些输出个数的含义是:采用3×3的卷积核对该层的feature map卷积时卷积核的个数,包含两部分(实际code是分别用不同数量的3*3卷积核对该层feature map进行卷积):数量c*k*m*n是confidence输出,表示每个default box的confidence,也就是类别的概率;数量4*k*m*n是localization输出,表示每个default 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匹配上。训练的损失包含定位损失和回归损失两部分。

作者的实验表明default box的shape数量越多,效果越好。

这里用到的 default box和Faster RCNN中的 anchor很像,在Faster RCNN中 anchor 只用在最后一个卷积层,但是在本文中,default box 是应用在多个不同层的feature map上。

那么default box的scale(大小)和aspect ratio(横纵比)要怎么定呢?假设我们用m个feature maps做预测,那么对于每个featuer map而言其default box的scale是按以下公式计算的:

Sk=Smin+Smax−Sminm−1(k−1),k∈[1,m]

这里smin是0.2,表示最底层的scale是0.2;smax是0.9,表示最高层的scale是0.9。

至于aspect ratio,用a_r表示为下式:注意这里一共有5种aspect ratio

a_r = {1, 2, 3, 1/2, 1/3}

因此每个default box的宽的计算公式为:

w_k^a=s_ksqrt{a_r}

高的计算公式为:(很容易理解宽和高的乘积是scale的平方)

h_k^a=s_k/sqrt{a_r}

另外当aspect ratio为1时,作者还增加一种scale的default box:

s_k^{'}=sqrt{s_{k}s_{k+1}}

因此,对于每个feature map cell而言,一共有6种default box。

可以看出这种default box在不同的feature层有不同的scale,在同一个feature层又有不同的aspect ratio,因此基本上可以覆盖输入图像中的各种形状和大小的object!

(训练自己的样本的时候可以在FindMatch()之后检查是否能覆盖了所有的 ground truth box)

源代码中的 ssd_pascal.py设计了上面几个参数值,caffe 源码 prior_box_layer.cppForward_cpu()实现。

最后会得到(38*38*4 + 19*19*6 + 10*10*6 + 5*5*6 + 3*3*4 + 1*1*4)= 8732个prior box。

Fig.2 SSD 框架

正负样本

prior box和 grount truth box 按照IOU(JaccardOverlap)进行匹配,匹配成功则这个prior box就是positive example(正样本),如果匹配不上,就是negative example(负样本),显然这样产生的负样本的数量要远远多于正样本。这里将前向loss进行排序,选择最高的num_sel个prior box序号集合 D。那么如果Match成功后的正样本序号集合P。那么最后正样本集为 P - Dcap{P},负样本集为 D - Dcap{P}。同时可以通过规范num_sel的数量(是正样本数量的三倍)来控制使得最后正、负样本的比例在 1:3 左右。

Fig.3 positive and negtive sample VS ground_truth box

1.正样本获得

我们已经在图上画出了prior box,同时也有了ground truth,那么下一步就是将prior box匹配到ground truth上,这是在 src/caffe/utlis/bbox_util.cpp的 FindMatches以及子函数MatchBBox函数里完成的。值得注意的是先是从groudtruth box出发给每个groudtruth box找到了最匹配的prior box放入候选正样本集,然后再从prior box出发为prior box集中寻找与groundtruth box满足IOU>0.5的一个IOU最大的prior box(如果有的话)放入候选正样本集,这样显然就增大了候选正样本集的数量。

2.负样本获得

在生成一系列的 prior boxes 之后,会产生很多个符合 ground truth box 的 positive boxes(候选正样本集),但同时,不符合 ground truth boxes 也很多,而且这个 negative boxes(候选负样本集),远多于 positive boxes。这会造成 negative boxes、positive boxes 之间的不均衡。训练时难以收敛。

因此,本文采取,先将每一个物体位置上对应 predictions(prior boxes)loss 进行排序。 对于候选正样本集:选择最高的几个prior box与正样本集匹配(box索引同时存在于这两个集合里则匹配成功),匹配不成功则删除这个正样本(因为这个正样本不在难例里已经很接近ground truth box了,不需要再训练了);对于候选负样本集:选择最高的几个prior box与候选负样本集匹配,匹配成功则作为负样本。

这就是一个难例挖掘的过程,举个例子,假设在这8732个prior box里,经过FindMatches后得到候选正样本P个,候选负样本那就有8732-P个。将prior box的prediction loss按照从大到小顺序排列后选择最高的M个prior box。如果这P个候选正样本里有a个box不在这M个prior box里,将这M个box从候选正样本集中踢出去。如果这8732-P个候选负样本集中包含的8732-P有M-a个在这M个prior box,则将这M-a个候选负样本作为负样本。SSD算法中通过这种方式来保证 positives、negatives 的比例。实际代码中有三种负样本挖掘方式:

如果选择HARD_EXAMPLE方式(源于论文Training Region-based Object Detectors with Online Hard Example Mining),则默认M = 64,由于无法控制正样本数量,这种方式就有点类似于分类、回归按比重不同交替训练了。

如果选择MAX_NEGATIVE方式,则M = P*neg_pos_ratio,这里当neg_pos_ratio = 3的时候,就是论文中的正负样本比例1:3了。

enum MultiBoxLossParameter_MiningType { MultiBoxLossParameter_MiningType_NONE = 0, MultiBoxLossParameter_MiningType_MAX_NEGATIVE = 1, MultiBoxLossParameter_MiningType_HARD_EXAMPLE = 2};3.Data augmentation

本文同时对训练数据做了 data augmentation,数据增广。

每一张训练图像,随机的进行如下几种选择:

  • 使用原始的图像

  • 随机采样多个 patch(CropImage),与物体之间最小的 jaccard overlap 为:0.1,0.3,0.5,0.7 与 0.9

采样的 patch 是原始图像大小比例是 [0.3,1.0],aspect ratio 在 0.5 或 2。

当 groundtruth box 的 中心(center)在采样的 patch 中且在采样的 patch中 groundtruth box面积大于0时,我们保留CropImage。

在这些采样步骤之后,每一个采样的 patch 被 resize 到固定的大小,并且以 0.5 的概率随机的 水平翻转(horizontally flipped,翻转不翻转看prototxt,默认不翻转)

这样一个样本被诸多batch_sampler采样器采样后会生成多个候选样本,然后从中随机选一个样本送人网络训练。

网络结构

SSD的结构在VGG16网络的基础上进行修改,训练时同样为conv1_1,conv1_2,conv2_1,conv2_2,conv3_1,conv3_2,conv3_3,conv4_1,conv4_2,conv4_3,conv5_1,conv5_2,conv5_3(512),fc6经过3*3*1024的卷积(原来VGG16中的fc6是全连接层,这里变成卷积层,下面的fc7层同理),fc7经过1*1*1024的卷积,conv6_1,conv6_2(对应上图的conv8_2),conv7_1,conv7_2,conv,8_1,conv8_2,conv9_1,conv9_2,loss。然后一方面:针对conv4_3(4),fc7(6),conv6_2(6),conv7_2(6),conv8_2(4),conv9_2(4)(括号里数字是每一层选取的default box种类)中的每一个再分别采用两个3*3大小的卷积核进行卷积,这两个卷积核是并列的(括号里的数字代表prior box的数量,可以参考Caffe代码,所以上图中SSD结构的倒数第二列的数字8732表示的是所有prior box的数量,是这么来的38*38*4+19*19*6+10*10*6+5*5*6+3*3*4+1*1*4=8732),这两个3*3的卷积核一个是用来做localization的(回归用,如果prior box是6个,那么就有6*4=24个这样的卷积核,卷积后map的大小和卷积前一样,因为pad=1,下同),另一个是用来做confidence的(分类用,如果prior box是6个,VOC的object类别有20个,那么就有6*(20+1)=126个这样的卷积核)。

如下图是conv6_2的localizaiton的3*3卷积核操作,卷积核个数是24(6*4=24,由于pad=1,所以卷积结果的map大小不变,下同):这里的permute层就是交换的作用,比如你卷积后的维度是32×24×19×19,那么经过交换层后就变成32×19×19×24,顺序变了而已。而flatten层的作用就是将32×19×19×24变成32*8664,32是batchsize的大小。另一方面结合conv4_3(4),fc7(6),conv6_2(6),conv7_2(6),conv8_2(4),conv9_2(4)中的每一个和数据层(ground truth boxes)经过priorBox层生成prior box。

经过上述两个操作后,对每一层feature的处理就结束了。对前面所列的5个卷积层输出都执行上述的操作后,就将得到的结果合并:采用Concat,类似googleNet的Inception操作,是通道合并而不是数值相加。

Fig.5 SSD 流程

损失函数方面:和Faster RCNN的基本一样,由分类和回归两部分组成,可以参考Faster RCNN,这里不细讲。总之,回归部分的loss是希望预测的box和prior box的差距尽可能跟ground truth和prior box的差距接近,这样预测的box就能尽量和ground truth一样。

上面得到的8732个目标框经过Jaccard Overlap筛选剩下几个了;其中不满足的框标记为负数,其余留下的标为正数框。紧随其后:

训练过程中的 prior boxes 和 ground truth boxes 的匹配,基本思路是:让每一个 prior box 回归并且到 ground truth box,这个过程的调控我们需要损失层的帮助,他会计算真实值和预测值之间的误差,从而指导学习的走向。

SSD 训练的目标函数(training objective)源自于 MultiBox 的目标函数,但是本文将其拓展,使其可以处理多个目标类别。具体过程是我们会让每一个 prior box 经过Jaccard系数计算和真实框的相似度,阈值只有大于 0.5的才可以列为候选名单;假设选择出来的是N个匹配度高于百分之五十的框吧,我们令 表示第 i个默认框,j表示第 j个真实框,p表示第p个类。那么x_{ij}^p表示 第 i 个 prior box 与 类别 p 的 第 j 个 ground truth box 相匹配的Jaccard系数,若不匹配的话,则x_{ij}^p=0。总的目标损失函数(objective loss function)就由 localization loss(loc) 与 confidence loss(conf) 的加权求和:

  • N 是与 ground truth box 相匹配的 prior boxes 个数

  • localization loss(loc) 是 Fast R-CNN 中 Smooth L1 Loss,用在 predict box(l) 与 ground truth box(g) 参数(即中心坐标位置,width、height)中,回归 bounding boxes 的中心位置,以及 width、height

  • confidence loss(conf) 是 Softmax Loss,输入为每一类的置信度 c

  • 权重项 α,可在protxt中设置 loc_weight,默认设置为 1

使用注意

1. 使用batch_sampler做data argument时要注意是否crop的样本只包含目标很小一部分。2.检查对于你的样本来说回归和分类问题哪个更难,以此调整multibox_loss_param中loc_weight进行训练。3.正负样本比例,HARD_EXAMPLE方式默认只取64个最高predictions loss来从中寻找负样本,检查你的样本集中正负样本比例是否合适。


http://chatgpt.dhexx.cn/article/H7UPqY1W.shtml

相关文章

【个人整理】一文看尽目标检测算法SSD的核心架构与设计思想

前言:SSD(Single Shot MultiBox Detector)是大神Wei Liu在 ECCV 2016上发表的一种的目标检测算法。对于输入图像大小300x300的版本在VOC2007数据集上达到了72.1%mAP的准确率并且检测速度达到了惊人的58FPS( Faster RCNN&#xff1…

目标检测:SSD算法原理综述

SSD(Single Shot Detection)是一个流行且强大的目标检测网络,网络结构包含了基础网络(Base Network),辅助卷积层(Auxiliary Convolutions)和预测卷积层(Predicton Convol…

SSD算法阅读记录

SSD: Single Shot MultiBox Detector 一、网络结构二、模型设计1、多尺度特征映射2、使用卷积进行检测3、使用default boxes 三、模型训练1、匹配策略2、损失函数3、default boxes的确定4、难分样本挖掘 四、参考链接 一、网络结构 SSD网络是在VGG16的基础上修改得到的&#xf…

2.1 SSD算法理论

前言 随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。来源于哔哩哔哩博主“霹雳吧啦Wz”,博主学习作为笔记记录,欢迎大家一起讨论学习交流。 一…

SSD检测算法理解

SSD检测算法理解 简介1 SSD模型2 SSD算法的核心设计思想3 多尺度特征图检测思想4 单尺度特征图检测4.1 先验框的设置4.2 先验框的比例和宽高比4.3 Loss计算 5 性能评估 简介 在作者的原论文中提到,SSD算法要比当时优秀的Faster RCNN算法和YOLO算法识别效果更好&…

SSD算法通俗详解

算法简介 算法原理 样本构造 损失函数 使用细节 # ssd算法: ##简介 刘伟在2016年提出,发表在ECCV;是一种通过直接回归的方式去获取目标类别和位置的one-stage算法,不需要proposal;作用在卷积网络的输出特征图上进行预…

详细解读目标检测经典算法-SSD

学习目标: 知道SSD的多尺度特征图的网络知道SSD中先验框的生成方式知道SSD的损失函数的设计 目标检测算法主要分为两类: Two-stage方法:如R-CNN系列算法,主要思路就是通过Selective Search或者CNN网络产生一系列的稀疏矩阵的候…

SSD目标检测算法——通俗易懂解析

目录 前言SSD网络 前言 前面几篇文章我们讲解了YOLO系类的论文,今天我们来看下SSD算法。对YOLO有兴趣的小伙伴们可以一步到我前面的几篇博文: YOLOv1目标检测算法——通俗易懂的解析YOLOv2目标检测算法——通俗易懂的解析YOLOv3目标检测算法——通俗易懂…

SSD算法理解(1)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010167269/article/details/52563573 Preface 这是今年 ECCV 2016 的一篇文章,是 UNC Chapel Hill(北卡罗来纳大学教堂山分校) 的 Wei Li…

SSD算法分析

SSD算法分析 1 SSD算法概述2 SSD整体流程3 SSD中的重要概念3.1 多尺度Feature Map检测3.2 Default Box3.2.1 设计思路3.2.2 参数计算 4 SSD网络架构与网络预测4.1 网络架构4.2 网络预测4.3 预测值解码 5 网络训练5.1 Ground Truth编码5.2 匹配策略5.3 损失函数5.3.1 定位损失5.…

SSD算法简单解析

前言 今天学习SSD目标检测算法,SSD,全称Single Shot MultiBox Detector,是2016年提出的算法,今天我们还是老规矩,最简单的做算法解析,力求让像我一样的小白也可以看得懂。 算法初识 1》算法能干什么&…

深度学习算法之-SSD(一)

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载需注明出处。 https://blog.csdn.net/qianqing13579/article/details/82106664 </div><link rel"stylesheet" href"https://csdnimg.cn/release/phoenix/template/css/ck_html…

SSD系列算法原理讲解----(1)SSD系列算法介绍(主干网络、多尺度Feature Map预测)(笔记)

SSD系列算法原理介绍 SSD算法介绍&#xff1a; Single Shot MultiBox Detector&#xff08;One-stage方法&#xff09; - Wei Liu在ECCV 2016提出 - 直接回归目标类别和位置 - 不同尺度的特征图上进行检测 - 端到端的训练 - 图像的分辨率比较低&#xff0c;也能保证检测的精度 …

目标检测算法——SSD详解

目录 一、 背景&#xff08;基本介绍&#xff09; 二、 网络结构 三、 具体过程 1. default box 匹配 2. 损失函数 3. 数据增广 4. Atrous Algothrim 5. NMS&#xff08;非极大值抑制&#xff09; 五、 性能评估 优点&#xff1a; 缺点&#xff1a; SSD 算法的改进…

SSD算法原理与代码(三)

说明&#xff1a;这几篇文章是讲解SSD&#xff0c;从算法原理、代码到部署到rk3588芯片上的过程。环境均是TF2.2&#xff0c;具体的安装过程请参考网上其他的文章。 一、SSD简介 SSD算法是一个优秀的one-stage目标检测算法。能够一次就完成目标的检测和分类过程。主要是的思路…

目标检测算法之SSD

码字不易&#xff0c;欢迎给个赞&#xff01; 欢迎交流与转载&#xff0c;文章会同步发布在公众号&#xff1a;机器学习算法全栈工程师(Jeemy110) 目录 目录前言设计理念网络结构训练过程预测过程性能评估TensorFlow上的实现小结参考文献 前言 目标检测近年来已经取得了很重…

深度学习 -- SSD 算法流程详解

SSD同样是经典论文&#xff0c;后续很多论文以此为基础&#xff0c;所以搞懂流程比较重要&#xff0c;中间如果 有写的不对、有问题或者有看不懂的地方&#xff0c;还望指正。如果有了新的理解&#xff0c;我会持续更新。 作为经典论文&#xff0c;SSD算法也同样产生了很多后续…

SSD原理解读-从入门到精通

前言 当初写这篇博客的初衷只是记录自己学习SSD的一些心得体会&#xff0c;纯属学习笔记&#xff0c;后来由于工作上的需要&#xff0c;需要对小伙伴进行目标检测方面的培训&#xff0c;后来就基于这篇博客进行了扩展&#xff0c;逐渐演变成了现在的样子&#xff0c;本文力求从…

SSD算法理论

SSD算法 SSD(Single Shot MultiBox Detector)是one-stage目标检测方法&#xff0c;one-stage算法就是目标检测和分类是同时完成的&#xff0c;其主要思路是利用CNN提取特征后&#xff0c;均匀地在图片的不同位置进行密集抽样&#xff0c;抽样时可以采用不同尺度和长宽比&#…

SSD算法详解

SSD github : https://github.com/weiliu89/caffe/tree/ssd SSD paper : https://arxiv.org/abs/1512.02325 SSD 动态PPT&#xff1a; https://docs.google.com/presentation/d/1rtfeV_VmdGdZD5ObVVpPDPIODSDxKnFSU0bsN_rgZXc/pub?startfalse&loopfalse&delayms3000…