SSD 算法详解 及其 keras 实现(上)

https://blog.csdn.net/remanented/article/details/79943418

(看原文吧,我就不进行截图了)

看了几天的SSD的论文和keras实现的代码,对SSD也有了一定的理解,把这几天的学习成果记录下来。可能是因为之前学习了Mask R-CNN 和 YOLOV1、V2,所以SSD一路看下来还是蛮顺利的。

SSD:Single Shot Multibox Detector   

算法原理介绍:
算法摘要:
    目前基于深度学习的object detection 算法主要分为了one-stage和two-stage,基于R-CNN系列的是two-stage,先得到proposal,再得到bounding box 和class;而SSD是直接在单个神经网络中直接完成了bounding box 和class的预测。相比于其他的检测算法,在处理不同大小的物体检测的时候,是将图像转换成不同的大小,分别处理之后再合成在一块,SSD则是直接使用神经网络(VGG)提取到的多层feature map 来解决不同大小物体的检测。算法中与引入了一个新的概念:default box,其实和Faster R-CNN中的anchors的概念很类似。


算法分部介绍:
basenetwork:

    baseNetwork是用来提起图片的特征的,基于VGG16,但在VGG16的基础上有所改变,把两个全连接层FC6和FC7换成了两个卷积网络,并且再加上了4个卷积网络用来构成整个模型的框架。


 

    可以看出其中的6个feature map都用于预测bounding box 和class,并且加起来预测的box的总数为8732个,如此大的数量,可以看出SSD相当于密集采样,从而能到达较好的检测性能。与YOLO不同的是,SSD使用的都是卷积来预测。在keras的实现代码中有和论文中一定的不同。

defaultbox

    default box 是在每一层feature map中预先计算好的box,用于之后的训练和预测。在理解default box之前先介绍一下feature cell 的概念,下图中的有两层的feature map ,大小分别为8*8和4*4,其中featurecell可以认为是其中的一个方格。在每个feature cell中再进行default box的定义,根据不同的scale和aspectratio来确定defaultbox的形状。例如在下图(b)、(c)中,每一个featurecell中有4个defaultbox,并且每个default box的shape是不一样的,但是它们的scale是一样的。当然,除了一个,注意观察在feature cell的中心有一个比feature cell还要小的default box。


    直观上能够感觉到4*4的feature map中default box 要比8*8的feature map中default box要大,这也不难理解,因为在随着卷积的加深,feature map就越来越小,feature map中每一个feature cell是由原图中更大的感受域得到的,所以越小,它的default box的scale就越大。

给出了如下的公式用于计算每一层的scale:


  

    其中Smin=0.2,Smax=0.9,m为feature map的数量,k代表属于具体的哪一层。可得,最低层的scale=0.2,最高层的scale=0.9,当然,它们都是归一化最后的值,故在[0,1]之间。之前我对scale的理解存在一定的偏差,以为scale是面积,然而scale的平方才是面积 

    每层中的aspect ratio为5中,每种如下:

       

    所以每个default box的宽计算公式如下:

       

    每个default box的长计算公式如下:

    

    这两个计算公式也是比较好理解,计算得到的长宽相乘就得到了scale的平方。

    论文提到了当aspect ratio=1的时候,再添加了另外一个scale计算公式:

    


    所以对于每一层feature map中的feature cell理论上都是存在6种defaultbox的,当然在实际的代码中还是会选择性的舍取一些的,因为对于某些aspect ratio 对应的default box 的scale可能会超过原来图片的大小。每个feature cell的default box的中心点分布在各个feature cell的中心。

这也是SSD算法与YOLO的很大不同之处,在很多层的featuremap(每层feature map的resolution也是不同的)上设置大量不同尺寸的default box来检测不同大小的物体。

在官方给你的caffe代码中,6层feature map的default box 对应的实际的scale计算方法如下:

第一层:S1=Smin/2=0.1,scale= S1*img_size = 0.1*300=30

之后的2-6层按照上面公式进行计算:

对公式中的Sk进行100的扩大来计算步长:ceil((ceil(0.9*100)-ceil(0.2*100))/(5-1))=17。且第二层扩到后scale=20,其他的依次为37,54,71,88。然后再除以100回到归一化的scale上,最终再乘以img_size300 得到60,111,162,213,264。所以6层的实际scale依次为:30、60、111、 162、213、264。最后再根据aspect ratio来调整defaul tbox的具体shape。

在图C中每个defaultbox预测了4个location值,分别为cx,cy,w,h,以及预测了每个类(c1,c2.....cp)。其中是经过以下的公式编码之后得到的值。其中b为bounding box 的实际值, d为defaul tbox的实际值。

    


   

    在预测的过程中要得到实际的bounding box 需要进行解码,解码的公式也就是编码的逆过程:

       

    在实际的代码中还加入了4个variance值来帮助训练,如果存在variance,则解码公式如下有所改变:


    综上所述,对于一个大小m*n的特征图,共有mn个feature cell,每个feature cell设置的default box记为k,那么每个cell共需要(c+4)k个预测值,所有的cell共需要(c+4)kmn个预测值,由于SSD采用卷积做检测,所以就需要(c+4)k个3*3的卷积核完成这个特征图的检测过程。检测的示意图如下:


Matching the groud truth and default boxes


    在图中,绿框代表的是groud truth,其他颜色的框是default box。利用每一个groud truth去和所有的default box进行match,计算两者的IOU,如果IOU大于一个阈值如:0.5,则认为这个defaultbox是对应于该groudtruth,认为是正样本,否则认为是负样本。如示意图中红色框就存在两个正样本和一个负样本,对于蓝色框而言,应该是属于dog的正样本,所以一个groud truth可以对应多个default box,但是反过来是不行的。

    因为正负样本数量差距是很大的,如果直接用于训练的话会带来很大的不平衡,也不容易收敛,所以需要进行一定的采样来控制正负样本的数量比例为1:3。对负样本采样的方式是:把match的误差进行排序,然后取所需要的负样本数量top-k即可。


损失函数:


    训练样本确定了,然后就是损失函数了。损失函数定义为位置误差(locatization loss, loc)与置信度误差(confidence loss, conf)的加权和:

其中N是先验框的正样本数量。这里为一个指示参数,当时表示第i个先验框与第j个ground truth匹配,并且ground truth的类别为p。c为类别置信度预测值。l为先验框的所对应边界框的位置预测值,而g是ground truth的位置参数。对于位置误差,其采用SmoothL1 loss,定义如下:


    由于的存在,所以位置误差仅针对正样本进行计算。值得注意的是,要先对groundtruth的g进行编码得到,因为预测值 l 也是编码值,若需要使用到variance,编码时要加上variance:

对于置信度误差,其采用softmaxloss:

权重系数a通过交叉验证设置为1。

数据增广
    为了达到更好的性能,对数据进行一定增广,来增加数据量。主要采用的技术有水平翻转(horizontal flip),随机裁剪加颜色扭曲(random crop & color distortion),随机采集块域(Randomly sample a patch)(获取小目标训练样本),如下图所示

   随机剪切具有较大的优势可以认为是因为:对于小物体,具有放大的作用;对于大物体,具有展现更多细节的作用。


预测过程:
    预测过程比较简单,对于每个预测框,首先根据类别置信度确定其类别(置信度最大者)与置信度值,并过滤掉属于背景的预测框。然后根据置信度阈值(如0.5)过滤掉阈值较低的预测框。对于留下的预测框进行解码,根据先验框得到其真实的位置参数(解码后一般还需要做clip,防止预测框位置超出图片)。解码之后,一般需要根据置信度进行降序排列,然后仅保留top-k(如400)个预测框。最后就是进行NMS算法,过滤掉那些重叠度较大的预测框。最后剩余的预测框就是检测结果了。

可能原理这块讲的不太好,可以跳转到了keras具体实现的博文中,里面详细的介绍了各个部分的实现:SSD keras实现
--------------------- 
作者:remanented 
来源:CSDN 
原文:https://blog.csdn.net/remanented/article/details/79943418 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值