SSD算法详解.docx
- 文档编号:2851950
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:9
- 大小:191.91KB
SSD算法详解.docx
《SSD算法详解.docx》由会员分享,可在线阅读,更多相关《SSD算法详解.docx(9页珍藏版)》请在冰点文库上搜索。
SSD算法详解
SSD算法详解defaultbox
本文提出的SSD算法是一种直接预测目标类别和boundingbox的多目标检测算法。
与fasterrcnn相比,该算法没有生成proposal的过程,这就极大提高了检测速度。
针对不同大小的目标检测,传统的做法是先将图像转换成不同大小(图像金字塔),然后分别检测,最后将结果综合起来(NMS)。
而SSD算法则利用不同卷积层的 featuremap 进行综合也能达到同样的效果。
算法的主网络结构是VGG16,将最后两个全连接层改成卷积层,并随后增加了4个卷积层来构造网络结构。
对其中5种不同的卷积层的输出(featuremap)分别用两个不同的 3×3的卷积核进行卷积,一个输出分类用的confidence,每个defaultbox 生成21个类别confidence;一个输出回归用的 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个这样的卷积核)。
如下图是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)中的每一个和数据层(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 表示第 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来从中寻找负样本,检查你的样本集中正负样本比例是否合适
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SSD 算法 详解