SSD算法详解Word格式文档下载.docx

上传人:b****1 文档编号:5251914 上传时间:2023-05-04 格式:DOCX 页数:9 大小:191.91KB
下载 相关 举报
SSD算法详解Word格式文档下载.docx_第1页
第1页 / 共9页
SSD算法详解Word格式文档下载.docx_第2页
第2页 / 共9页
SSD算法详解Word格式文档下载.docx_第3页
第3页 / 共9页
SSD算法详解Word格式文档下载.docx_第4页
第4页 / 共9页
SSD算法详解Word格式文档下载.docx_第5页
第5页 / 共9页
SSD算法详解Word格式文档下载.docx_第6页
第6页 / 共9页
SSD算法详解Word格式文档下载.docx_第7页
第7页 / 共9页
SSD算法详解Word格式文档下载.docx_第8页
第8页 / 共9页
SSD算法详解Word格式文档下载.docx_第9页
第9页 / 共9页
亲,该文档总共9页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

SSD算法详解Word格式文档下载.docx

《SSD算法详解Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《SSD算法详解Word格式文档下载.docx(9页珍藏版)》请在冰点文库上搜索。

SSD算法详解Word格式文档下载.docx

此外,这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:

左右。

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个这样的卷积核)。

如下图是conv6_2的localizaiton的3*3卷积核操作,卷积核个数是24(6*4=24,由于pad=1,所以卷积结果的map大小不变,下同):

这里的permute层就是交换的作用,比如你卷积后的维度是32×

24×

19×

19,那么经过交换层后就变成32×

24,顺序变了而已。

而flatten层的作用就是将32×

24变成32*8664,32是batchsize的大小。

另一方面结合conv4_3(4),fc7(6),conv6_2(6),conv7_2(6),conv8_2(4),conv9_2(4)中的每一个和数据层(groundtruthboxes)经过priorBox层生成priorbox。

经过上述两个操作后,对每一层feature的处理就结束了。

对前面所列的5个卷积层输出都执行上述的操作后,就将得到的结果合并:

采用Concat,类似googleNet的Inception操作,是通道合并而不是数值相加。

Fig.5SSD流程

损失函数方面:

和FasterRCNN的基本一样,由分类和回归两部分组成,可以参考FasterRCNN,这里不细讲。

总之,回归部分的loss是希望预测的box和priorbox的差距尽可能跟groundtruth和priorbox的差距接近,这样预测的box就能尽量和groundtruth一样。

上面得到的8732个目标框经过JaccardOverlap筛选剩下几个了;

其中不满足的框标记为负数,其余留下的标为正数框。

紧随其后:

训练过程中的priorboxes和groundtruthboxes的匹配,基本思路是:

让每一个priorbox回归并且到groundtruthbox,这个过程的调控我们需要损失层的帮助,他会计算真实值和预测值之间的误差,从而指导学习的走向。

SSD训练的目标函数(trainingobjective)源自于MultiBox的目标函数,但是本文将其拓展,使其可以处理多个目标类别。

具体过程是我们会让每一个priorbox经过Jaccard系数计算和真实框的相似度,阈值只有大于 

0.5的才可以列为候选名单;

假设选择出来的是N个匹配度高于百分之五十的框吧,我们令 

表示第 

i个默认框,j表示第 

j个真实框,p表示第p个类。

那么x_{ij}^p表示第i个priorbox与类别p的第j个groundtruthbox相匹配的Jaccard系数,若不匹配的话,则x_{ij}^p=0。

总的目标损失函数(objectivelossfunction)就由localizationloss(loc)与confidenceloss(conf)的加权求和:

N是与groundtruthbox相匹配的priorboxes个数

localizationloss(loc)是FastR-CNN中SmoothL1Loss,用在predictbox(l)与groundtruthbox(g)参数(即中心坐标位置,width、height)中,回归boundingboxes的中心位置,以及width、height

confidenceloss(conf)是SoftmaxLoss,输入为每一类的置信度c

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

1.使用batch_sampler做dataargument时要注意是否crop的样本只包含目标很小一部分。

2.检查对于你的样本来说回归和分类问题哪个更难,以此调整multibox_loss_param中loc_weight进行训练。

3.正负样本比例,HARD_EXAMPLE方式默认只取64个最高predictionsloss来从中寻找负样本,检查你的样本集中正负样本比例是否合适

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2