SSD算法详解Word格式文档下载.docx
《SSD算法详解Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《SSD算法详解Word格式文档下载.docx(7页珍藏版)》请在冰豆网上搜索。
![SSD算法详解Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2023-2/4/91ce8e4d-50e8-4f88-8697-0000b03563c4/91ce8e4d-50e8-4f88-8697-0000b03563c41.gif)
一个输出回归用的
localization,每个
defaultbox生成4个坐标值(x,y,w,h).
此外,这5个featuremap还经过
PriorBox
层生成
priorbox(生成的是坐标)。
上述5个featuremap中每一层的defaultbox的数量是给定的(8732个)。
最后将前面三个计算结果分别合并然后传给loss层。
Defaultbox
文章的核心之一是作者同时采用lower和upper的featuremap做检测。
如图Fig1所示,这里假定有8×
8和4×
4两种不同的featuremap。
第一个概念是featuremapcell,featuremapcell是指featuremap中每一个小格子,如图中分别有64和16个cell.另外有一个概念:
defaultbox,是指在featuremap的每个小格(cell)上都有一系列固定大小的box,如下图有4个(下图中的虚线框,仔细看格子的中间有比格子还小的一个box)。
假设每个featuremapcell有k个defaultbox,那么对于每个defaultbox都需要预测c个类别score和4个offset,那么如果一个featuremap的大小是m×
n,也就是有m*n个featuremapcell,那么这个featuremap就一共有(c+4)*k*m*n
个输出。
这些输出个数的含义是:
采用3×
3的卷积核对该层的featuremap卷积时卷积核的个数,包含两部分(实际code是分别用不同数量的3*3卷积核对该层featuremap进行卷积):
数量c*k*m*n是confidence输出,表示每个defaultbox的confidence,也就是类别的概率;
数量4*k*m*n是localization输出,表示每个defaultbox回归后的坐标)。
训练中还有一个东西:
priorbox,是指实际中选择的defaultbox(每一个featuremapcell不是k个defaultbox都取)。
也就是说defaultbox是一种概念,priorbox则是实际的选取。
训练中一张完整的图片送进网络获得各个featuremap,对于正样本训练来说,需要先将priorbox与groundtruthbox做匹配,匹配成功说明这个priorbox所包含的是个目标,但离完整目标的groundtruthbox还有段距离,训练的目的是保证defaultbox的分类confidence的同时将priorbox尽可能回归到groundtruthbox。
举个列子:
假设一个训练样本中有2个groundtruthbox,所有的featuremap中获取的priorbox一共有8732个。
那个可能分别有10、20个priorbox能分别与这2个groundtruthbox匹配上。
训练的损失包含定位损失和回归损失两部分。
作者的实验表明defaultbox的shape数量越多,效果越好.
这里用到的
defaultbox和FasterRCNN中的
anchor很像,在FasterRCNN中anchor只用在最后一个卷积层,但是在本文中,defaultbox是应用在多个不同层的featuremap上。
那么defaultbox的scale(大小)和aspectratio(横纵比)要怎么定呢?
假设我们用m个featuremaps做预测,那么对于每个featuermap而言其defaultbox的scale是按以下公式计算的:
Sk=Smin+Smax−Sminm−1(k−1),k∈[1,m]
这里smin是0。
2,表示最底层的scale是0.2;
smax是0。
9,表示最高层的scale是0.9。
至于aspectratio,用a_r表示为下式:
注意这里一共有5种aspectratio
a_r={1,2,3,1/2,1/3}
因此每个defaultbox的宽的计算公式为:
w_k^a=s_ksqrt{a_r}
高的计算公式为:
(很容易理解宽和高的乘积是scale的平方)
h_k^a=s_k/sqrt{a_r}
另外当aspectratio为1时,作者还增加一种scale的defaultbox:
s_k^{’}=sqrt{s_{k}s_{k+1}}
因此,对于每个featuremapcell而言,一共有6种defaultbox.
可以看出这种defaultbox在不同的feature层有不同的scale,在同一个feature层又有不同的aspectratio,因此基本上可以覆盖输入图像中的各种形状和大小的object!
(训练自己的样本的时候可以在FindMatch()之后检查是否能覆盖了所有的groundtruthbox)
源代码中的
ssd_pascal.py设计了上面几个参数值,caffe源码
prior_box_layer。
cpp中Forward_cpu()实现。
最后会得到(38*38*4+19*19*6+10*10*6+5*5*6+3*3*4+1*1*4)=
8732个priorbox.
Fig.2SSD框架
正负样本
将priorbox和
grounttruthbox
按照IOU(JaccardOverlap)进行匹配,匹配成功则这个priorbox就是positiveexample(正样本),如果匹配不上,就是negativeexample(负样本),显然这样产生的负样本的数量要远远多于正样本。
这里将前向loss进行排序,选择最高的num_sel个priorbox序号集合
D。
那么如果Match成功后的正样本序号集合P.那么最后正样本集为
P—Dcap{P},负样本集为
D-Dcap{P}.同时可以通过规范num_sel的数量(是正样本数量的三倍)来控制使得最后正、负样本的比例在
1:
3
左右.
Fig.3positiveandnegtivesampleVSground_truthbox
1。
正样本获得
我们已经在图上画出了priorbox,同时也有了groundtruth,那么下一步就是将priorbox匹配到groundtruth上,这是在
src/caffe/utlis/bbox_util。
cpp的
FindMatches以及子函数MatchBBox函数里完成的。
值得注意的是先是从groudtruthbox出发给每个groudtruthbox找到了最匹配的priorbox放入候选正样本集,然后再从priorbox出发为priorbox集中寻找与groundtruthbox满足IOU>
0.5的一个IOU最大的priorbox(如果有的话)放入候选正样本集,这样显然就增大了候选正样本集的数量。
2.负样本获得
在生成一系列的priorboxes之后,会产生很多个符合groundtruthbox的positiveboxes(候选正样本集),但同时,不符合groundtruthboxes也很多,而且这个negativeboxes(候选负样本集),远多于positiveboxes。
这会造成negativeboxes、positiveboxes之间的不均衡.训练时难以收敛.
因此,本文采取,先将每一个物体位置上对应predictions(priorboxes)loss进行排序。
对于候选正样本集:
选择最高的几个priorbox与正样本集匹配(box索引同时存在于这两个集合里则匹配成功),匹配不成功则删除这个正样本(因为这个正样本不在难例里已经很接近groundtruthbox了,不需要再训练了);
对于候选负样本集:
选择最高的几个priorbox与候选负样本集匹配,匹配成功则作为负样本。
这就是一个难例挖掘的过程,举个例子,假设在这8732个priorbox里,经过FindMatches后得到候选正样本P个,候选负样本那就有8732—P个。
将priorbox的predictionloss按照从大到小顺序排列后选择最高的M个priorbox。
如果这P个候选正样本里有a个box不在这M个priorbox里,将这M个box从候选正样本集中踢出去。
如果这8732-P个候选负样本集中包含的8732-P有M-a个在这M个priorbox,则将这M-a个候选负样本作为负样本.SSD算法中通过这种方式来保证positives、negatives的比例。
实际代码中有三种负样本挖掘方式:
如果选择HARD_EXAMPLE方式(源于论文TrainingRegion—basedObjectDetectorswithOnlineHardExampleMining),则默认M=64,由于无法控制正样本数量,这种方式就有点类似于分类、回归按比重不同交替训练了。
如果选择MAX_NEGATIVE方式,则M=P*neg_pos_ratio,这里当neg_pos_ratio=3的时候,就是论文中的正负样本比例1:
3了。
enumMultiBoxLossParameter_MiningType{MultiBoxLossParameter_MiningType_NONE=0,MultiBoxLossParameter_MiningType_MAX_NEGATIVE=1,MultiBoxLossParameter_MiningType_HARD_EXAMPLE=2};
3.Dataaugmentation
本文同时对训练数据做了dataaugmentation,数据增广。
每一张训练图像,随机的进行如下几种选择:
使用原始的图像
随机采样多个patch(CropImage),与物体之间最小的jaccardoverlap为:
0。
1,0.3,0。
5,0.7与0。
9
采样的patch是原始图像大小比例是[0。
3,1.0],aspectratio在0。
5或2.
当groundtruthbox的中心(center)在采样的patch中且在采样的patch中groundtruthbox面积大于0时,我们保留CropImage.
在这些采样步骤之后,每一个采样的patch被resize到固定的大小,并且以0.5的概率随机的水平翻转(horizontallyflipped,翻转不翻转看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)(括号里数字是每一层选取的defaultbox种类)中的每一个再分别采用两个3*3大小的卷积核进行卷积,这两个卷积核是并列的(括号里的数字代表priorbox的数量,可以参考Caffe代码,所以上图中SSD结构的倒数第二列的数字8732表示的是所有priorbox的数量,是这么来的38*38*4+19*19*6+10*10*6+5*5*6+3*3*4+1*1*4=8732),这两个3*3的卷积核一个是用来做localization的(回归用,如果priorbox是6个,那么就有6*4=24个这样的卷积核,卷积后map的大小和卷积前一样,因为pad=1,下同),另一个是用来做confidence的(分类用,如果priorbox是6个,VOC的object类别有20个,那么就有6*(20+1)=126个这样的卷积核)。