精华内容
下载资源
问答
  • 目标检测SSD系列论文合集 包括了2016年ECCV SSD论文,2018 ECCV RFBNet,2018 CVPR Single Shot Refinement Neural Network,及SSD各个变式演变论文。
  • 使用一系列的卷积器,产生一系列固定大小的预测(predictions)。对于一个大小为m * n,具有P通道的特征图,使用的卷积器就是3 * 3 * P的卷积核来预测类别和边框值。 Default boxes—默认边框 将一组默认边框...

    一、简述

    单个深度神经网络来做目标检测。(加速)
    将bounding boxes输出离散化,为在每一个feature map上的一组不同长宽比及不同尺寸的一组默认边框。
    

    在预测阶段:计算出每一个default box中的目标,其属于每个类别的可能性,即score(得分)。如对于poscal voc数据集,总共有20类,那么得出每一个bounding boxes中物体属于这20个类别的每一种的可能性。同时。要对这些bounding boxes的shape进行微调,使得其符合目标物体的外接矩形。为了处理相同物体不同尺寸的情况,SSD结合了不同分辨率的feature map的预测(predictions)。

    二、基础网络

    基于VGG16

    1. 将VGG中的FC6 layer,FC7 layer转化为卷积层,并从模型的FC6,FC7上的参数,进行下采样得到这个两个卷积层的参数。
    2. 将poling layer的参数,从2 * 2 -s2 转变成3 * 3 -s1,但这样变化后,会改变感受野的大小。(采用了空洞卷积的技术)
    3. 并删除fc8 layer 和 所有的dropout层。
    4. 增加4个卷积层。
    5. 使用SGD精调;学习率0.001,momentum 0.9,weight decay 0.00005,batch size 32.

    三、多尺寸特征图检测

    使用不同的卷积层来预测,卷积层的特征图逐步减少,可以在不同的scale上预测。

    卷机器检测

    使用一系列的卷积器,产生一系列固定大小的预测(predictions)。对于一个大小为m * n,具有P通道的特征图,使用的卷积器就是3 * 3 * P的卷积核来预测类别和边框值。

    Default boxes—默认边框

    将一组默认边框default boxes与不同层的feature map cell关联。假设每个feature map call有k个default box,那么对于每个default box都要预测C个类别score 和 4个坐标偏置(offset)。如果一个feature map的大小是m * n,也就是有m * n个feature map cell,那么这个feature map就是有 m * n * k * (c+4)个输出。

    四、训练过程

    匹配策略

    • 对每个ground truth box找IOU最高的default box。
    • default boxes 如果任一个ground truth box的IUO大于0.5

    以上两种情况可以匹配的default boxes就是候选框的样本;其中完全匹配gt的是正样本,其他为负样本。

    困难负样本挖掘

    在匹配策略完成后,产生的负样本远远大于正样本。
    使用负样本中分类置信度损失函数最高的那些样本作为新的负样本,选择数量的正样本:负样本比例1:3。

    数据增广

    对图像随机crop,比例为[0.1, 1.0],并resize到固定尺寸。

    default boxes 设置

    对于每一张特征图,按照不同的尺寸(scale)和宽高比(ratio),生成k个默认框。

    1. 尺寸(scale) 每个feature map中default box的尺寸大小,计算:
      Sk = Smin + ((Smax-Smin) / (m - 1)) * (k - 1) k->[1, M]
      Smin = 0.2,Smax=0.95,表示最低层的尺度是0.2,最高层的尺度为0.95.
    2. 宽高比(ratio) 使用不同的ratio值 ar = 1,2,3,1/2,1/3 . 计算default box的宽度和高度。
    3. 中心
      ( (i + 0.5)/|Fk| ,(j + 0.5)/|Fk|)
      |Fk| 是 feature map的尺寸大小

    五、预测过程

    对生成大量的bounding boxes,首先通过设置confidence(置信度)的阈值为0.1,过滤掉大多数的boxes。然后对每一类使用0.45的阈值进行NMS。对每张图最终保留最佳的200个检测结果。

    展开全文
  • 目标检测经典论文:RCNN系列,YOLO系列,SSD,相关综述类论文包括算法对比分析等
  • SSD论文总结

    千次阅读 2018-04-22 23:46:02
    SSD论文总结 目录 SSD论文总结 目录 一、one-stage 检测器和two-stage检测器 1) ont-stage 检测器 2) two-stage 检测器 二、SSD与YOLOv1 三、网络结构中的一些tricks 1)SSD的结构示意图 2) L2Norm的...

    SSD论文总结

    目录

    一、one-stage 检测器和two-stage检测器

    SSD属于one-stage的物体检测器

    1) ont-stage 检测器

    • 主要以YOLO和SSD为代表,这种one-stage的检测主要是对图片不同位置进行采样预测,利用卷积层输出的相对于原图相对位置的特征,直接预测对象类别和对象位置信息。
    • 如YOLO,最后输出相对于原图的7x7的网格,也就是对图中的49个位置进行均匀采样预测,如使用anchor技术,对同一位置进行不同长宽比例的预测。而SSD则对多个分辨率的fmaps进行密集的均匀采样预测。
    • 我们可以发现,这种均匀采样存在一定缺陷:导致正负例的比例不均衡,均匀采样中大部分对应着背景图。这会导致模型精度不高。论文Focal Loss就是一种从损失方面针对这种问题进行优化的方法。而OHEM技术也对这种正负不均衡问题的一种优化技术。

    2) two-stage 检测器

    主要以R-CNN系列算法,主要是通过启发式方法Selective search或者RPN产生较为准确的候选框,然后再对这些候选框进行分类与回归。有利用多级方式,则预测精度更加准确。因而RefineDet 论文就是利用两个SSD级联,一个相当于RPN对anchor修正,第二个SSD对第一个的修正anchor后的输出进行预测,取得更好的结果。

    二、SSD与YOLOv1

    • SSD用CNN来直接进行检测,而YOLOv1使用全连接进行检测;
    • SSD将背景background当做一个类别来预测(对于20类的VOC,则实际预测21类),而YOLO只对对象类别进行预测(实际预测为20类)
    • SSD利用了多层不同分辨率的特征图进行预测输出,而且对大尺度的图进行小物体检测,小尺度的图进行大物体检测;从而更有利于多scale的物体的检测
    • SSD采用了Faster rcnn中的anchor技术,利用不同长宽比先验框进行对象检测;而YOLOv1没有用anchors技术。
    • SSD的这几个改进,一定程度上克服了YOLOv1**难以检测小目标定位不准**等不足。

    三、网络结构中的一些tricks

    1)SSD的结构示意图

    SSD示意图
    可以看出,后面几层用于对象预测(类别和位置的预测)

    2) L2Norm的使用

    该技术来自于ParseNet,conv4_3作为第一个输出预测的特征图,其大小为38x38,该层比较靠前,norm较大,因而使用L2Norm对特征图进行归一化,保证其与后面高语义层的差异不是很大。
    - 注意L2Norm与BatchNorm(BN)的区别,BN是在batch_size,width,height三个维度上进行归一化,;而L2Norm仅仅在channel每个像素的维度上进行归一化,归一化后一般设置一个可训练的放缩变量gamma。

    pytorch代码
    class L2Norm2d(nn.Module):
        '''L2Norm layer across all channels'''
        def __init__(self,scale):  # scale是参数初始化的值,代码中设置为20
            super(L2Norm2d, self).__init__()
            self.scale = Parameter(torch.Tensor([scale]))  # self.scale是可学习的
        '''
        因为conv4_3层比较靠前,而且norm较大所以加一个L2Norm使其与后面层差别不大
        不同于BN,这是在通道维度上进行Norm (spatial normalization)
        '''
        def forward(self,x,dim=1):
            '''out = scale * x / sqrt(\sum x_i^2)'''
            return self.scale[0] * x * x.pow(2).sum(dim).unsqueeze(1).clamp(min=1e-12).rsqrt().expand_as(x)

    3) dilation的使用

    这个技术来自于DeepLab-LargeFOV,这个下采样操作是代替原来网络的pool5层,这样能速度会慢与使用这种操作的20%。
    下图为不同dilation rate的设置
    (a)是普通的 3\times3 卷积,其视野就是 3×3 ,(b)是扩张率为1,此时视野变成 7×7 ,(c)扩张率为3时,视野扩大为 15×15 ,但是视野的特征更稀疏了。Conv6采用 3×3 大小但dilation rate=6的扩展卷积。
    ditaltion conv
    该图片来自于https://www.zhihu.com/people/xiaohuzc/posts?page=1 博文

    4) 不同大小的fmaps对应的anchor_sizes设计

    SSD中conv4_3, Conv7,Conv8_2,Conv9_2,Conv10_2,Conv11_2共6个卷积层用作预测输出,它们的大小分别是38,19,19,5,3,1。针对不同大小的fmaps,使用不同数目的先验框以及不同大小比例的先验框;除去conv4_3, 其他5层的anchor_size的计算公式如下:
    sk=smin+smaxsminm1(k1),k[1,m]

    • 其中 m=5, smin=2,smax=0.9, 然后每层的anchor_size乘以对应层的锚长宽比anchor_ratio,即可得到每层的anchor数目。anchor_ratio = {1,2,3,1/2,1/3};
    • 注意一些细节,每层anchor的计算并不统一;其中ratio的数目设置为[4,6,6,6,4,4],4表示只有两种比例,而6表示使用所有的长宽比;也就是只对Conv7,Conv8_2,Conv9_2使用所有的长宽比,其他的层只使用两个比例。最终所有层的anchor_sizes={30,60,111,162,213,264,315}, 对于conv4_3, sk=smin/2,由于计算ratio=1时,需要k+1的sk,所以conv11_2的后一个sk=300×105/100=315
    • 另外,对于ratio=1的情况,对应两种anchor, {sk,sk}和{sksk+1,sksk+1}。
    • 所以SSD300一共预测
      38×38×4+19×19×6+10×10×6+5×5×6+3×3×4+1×1×4=8732

    四、训练过程中一些tricks

    1) hard example mining

    由于SSD均匀采样,所以产生的正负例极其不平衡;此外,每个groundtruth至少与一个先验框anchor匹配,注意一个GT可以与多个先验框匹配,且匹配为正例的阈值为iou=0.5。但是这样正例相对于负例可能还是很少,所以为了尽量平衡,则采用OHEM技术,对负样本抽样时,按照预测出类别的执行度误差,从大到小排列,取误差大的topN个负样本作为负例。保证正负样本比例为1:3。具体代码如下

        def hard_negative_mining(self, cls_loss, pos):
            '''
            :param cls_loss: (N*num_anc,) 经过cross_entropy_loss计算损失
            :param pos: (N,num_anc,) 只有0,1值,
            :return: neg indices, (N,num_anc)
            '''
            N,num_anc = pos.size()
    
            cls_loss[pos.view(-1)] = 0  # set pos = 0将正例损失赋为0,不考虑正例
            cls_loss = cls_loss.view(N,-1) # (N,num_anc)
    
            # 注意这个地方有个编程技巧,能用索引的方式,求出topN的位置
            # 先逆序,然后在对索引值进行正序,得到的二级索引值在小于N的位置就是topN
            _, idx = cls_loss.sort(1,descending=True)  # sort by neg
            _, rank = idx.sort(1)  # (N,num_anc)
    
            num_pos = pos.long().sum(1)  # (N,1)
            num_neg = torch.clamp(3*num_pos,max=num_anc-1)  #(N,1) 正例样本的3倍不得超过总anc数
    
            # print('neg size:',num_neg.size(),rank.size())
            neg = rank < num_neg.unsqueeze(1).expand_as(rank) # (N,num_anc_8732)
    
            return neg # 只有0,1值

    2) 数据增强

    论文中的实验表明,数据增强对预测精度有很大的提升
    主要采用水平旋转操作,随机采集块区域(获取小目标训练样本),还有随机裁剪加颜色扭曲(代码中未实现)。

    3)损失计算

    L(x,c,l,g)=1N(Lconf(x,c)+αLloc(x,l,g)
    其中N为正样本个数

    • 位置损失计算:Lloc(x,l,g)=iPosNmcx,cy,w,hxijksmoothL1(limgjm) 这是采用Fast RCNN的位置计算方法;此处的trick有,训练时对cx,cy,w,h进行缩放,添加一个scales因子,加速训练。
    • 类别损失计算:
      Lconf(x,c)=iPosNxijplog(Cip)iNeglog(Cio)whereCip=exp(cip)pexp(cip)
    • 权重系数 α 通过交叉验证设置为1.

    五、总结

    1)有些收获

    • 在进行框预测时,要将box的值映射到(0,1)之间,这样在对不同的fmaps,进行逆转时,比较方便。
    • 多尺度特征图,或者特征融合方式,更有利于识别出大小不一的物体
    • 先验框的设置有利于物体检测,可以探究一下为什么,关于四个位置信息的计算方式(Fast RCNN方式)能否有更好的通用的方式。

    2) 思想启发

    • 根据SSD中的思想,能否根据物体大小(划分为一定梯度),然后不同大小物体选取的fmaps来源不同。

    六 待补充

    1)SSD 512的设计细节
    2)SSD的一系列变形网络设计

    参考文献

    1.知乎博客: https://www.zhihu.com/people/xiaohuzc/posts?page=1
    2. github SSD源码: https://github.com/kuangliu/pytorch-ssd
    3. Wei Liu, et al. “SSD: Single Shot MultiBox Detector.” ECCV2016.


    展开全文
  • 比较老的论文,但是是one stage的代表。 主要贡献 1)提出SSD检测架构。具有比YOLO更快更准的单阶段检测器,具有和较慢的Faster RCNN一样的准确率。 2)SSD的核心思想是使用一组固定的default bounding box...

    比较老的论文,但是是one stage的代表。

    • 主要贡献

    1)提出SSD检测架构。具有比YOLO更快更准的单阶段检测器,具有和较慢的Faster RCNN一样的准确率。

    2)SSD的核心思想是使用一组固定的default bounding box通过小的卷积核作用于特征图上对类别和边框的偏移(offset)进行预测。

    3)为了获得高的检测准确率,在不同尺度特征图上进行预测。

    4)简单的端到端(end to end)训练并获得高的准确率,提升了speed和accuracy两者的折中(trade-off)。

    5)在PASCAL VOC,COCO和ILSVRC数据集上和近期的state of the art算法作出了timing和accuracy的对比。

    • SSD架构

    • Multi-scale feature maps for detection

      在截断的主干网络后添加卷积层。不同于YOLO、FasterRCNN等,这些网络仅仅使用了最后一层特征图进行预测,SSD充分利用了主干网络提取特征形成的多尺度卷积特征图,在不同特征图上分别预测。

    论文给出SSD300结构如下:

    使用VGG16的卷积层作为骨干网络提取特征并且在多尺度特征图上进行预测。

    为了细致分析其结构,首先看VGG16网络结构:

    我们使用上图D结构的VGG16的卷积层修改进行特征提取,网络结构如下:

    idx operation feature map size prediction
    0 Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) 300  
    1 ReLU(inplace=True)    
    2 Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))    
    3 ReLU(inplace=True),    
    4 MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) 150  
    5 Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))    
    6 ReLU(inplace=True)    
    7 Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))    
    8 ReLU(inplace=True)    
    9 MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) 75  
    10 Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))    
    11 ReLU(inplace=True),    
    12 Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))    
    13 ReLU(inplace=True)    
    14 Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))    
    15 ReLU(inplace=True)    
    16 MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=True) 38  
    17 Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))    
    18 ReLU(inplace=True)    
    19 Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1),padding=(1, 1))    
    20 ReLU(inplace=True)    
    21 Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))   Y
    22 ReLU(inplace=True),    
    23 MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) 19  
    24 Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))    
    25 ReLU(inplace=True),    
    26 Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))    
    27 ReLU(inplace=True),    
    28 Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))    
    29 ReLU(inplace=True),    
    30 MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False)    
    31 Conv2d(512, 1024, kernel_size=(3, 3), stride=(1, 1), padding=(6, 6), dilation=(6, 6))    
    32 ReLU(inplace=True)    
    33 Conv2d(1024, 1024, kernel_size=(1, 1), stride=(1, 1))   Y
    34 ReLU(inplace=True) 19  

    在上面的基础上,SSD增加了额外层进行特征提取和预测,增加的额外层结构如下:

    Conv8_1 Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1)) 19  
    Conv8_2 Conv2d(256, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1)) 10 Y
    Conv9_1 Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1))    
    Conv9_2 Conv2d(128, 256, kernel_size=(3, 3), stride=(2, 2),padding=(1, 1)) 5 Y
    Conv10_1 Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1))    
    Conv10_2 Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1)) 3 Y
    Conv11_1 Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1))    
    Conv11_2 Conv2d(128, 256, kernel_size=(3, 3),stride=(1, 1)) 1

    Y

    【注意】论文中的SSD添加的额外层画的和具体实现有所不同,我们看一下作者在自己的Caffe源码上的实现:

    # Add extra layers on top of a "base" network (e.g. VGGNet or Inception).
    def AddExtraLayers(net, use_batchnorm=True, lr_mult=1):
        use_relu = True
    
        # Add additional convolutional layers.
        # 19 x 19
        from_layer = net.keys()[-1]
    
        # TODO(weiliu89): Construct the name using the last layer to avoid duplication.
        # 10 x 10
        out_layer = "conv6_1"
        ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 1, 0, 1,
            lr_mult=lr_mult)
    
        from_layer = out_layer
        out_layer = "conv6_2"
        ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 512, 3, 1, 2,
            lr_mult=lr_mult)
    
        # 5 x 5
        from_layer = out_layer
        out_layer = "conv7_1"
        ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1,
          lr_mult=lr_mult)
    
        from_layer = out_layer
        out_layer = "conv7_2"
        ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 1, 2,
          lr_mult=lr_mult)
    
        # 3 x 3
        from_layer = out_layer
        out_layer = "conv8_1"
        ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1,
          lr_mult=lr_mult)
    
        from_layer = out_layer
        out_layer = "conv8_2"
        ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 0, 1,
          lr_mult=lr_mult)
    
        # 1 x 1
        from_layer = out_layer
        out_layer = "conv9_1"
        ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 128, 1, 0, 1,
          lr_mult=lr_mult)
    
        from_layer = out_layer
        out_layer = "conv9_2"
        ConvBNLayer(net, from_layer, out_layer, use_batchnorm, use_relu, 256, 3, 0, 1,
          lr_mult=lr_mult)
    
        return net

    [注意]可以看到在代码中的"conv8_2"、"conv9_2"实际上是没有做stride=2,pading=1的卷积的,这一点和论文结构图下方的文字相符:

    事实上,Conv10_2和Conv11_2的卷积操并没有进行跨步stride=2,应该都是5x5x256。猜测特征图太小可能并不利于检测,因为损失的细节可能比较多,毕竟在YOLO v1和FasterRCNN中最后都是7x7的特征图,这里虽然最后两个预测特征图都是5x5,但是通过不同scale的default box依然可以检测不同尺度的目标。真是情况可能还是以实验结果为准,这里我们还是以caffe源码为准。不过值得一提是,在SSD512中,最后的一层预测特征图是1x1x256.

    具体细节可以参看原论文。

    这里我们可以修改VGG主干网络成19年出的EfficientNet。

    EfficientNet-b4和Vgg16具有相当的参数:

    model Top-1Acc. Top-5Acc. #Params
    VGG-16 71.93% 90.67% 14.7M
    ResNet-50 76.0% 93.0% 26M
    EfficientNet-B4 83.0% 96.3% 19M

    其中VGG16我们仅仅计算卷积层参数大约:138M - [(1000×4096+1000)+ (4096×4096+4096)+(224/2^5)^2 *512 *4096]/10^6=14.7M

    借用EfficientDet论文中的图,可以看到P3相当于SSD300中Conv4_3。鉴于EfficientNet本身结构比较深,上图一直到P5都是EfficientNet主干网络。仿照SSD300结构,我们还是在最后添加类似Conv9-Conv11共6层,保持SSD300结构一致性。

    下一章节介绍SSD的Pytorch代码实现

    展开全文
  • SSD论文

    2019-10-12 15:50:47
    SSD 将输出一系列 离散化(discretization) 的 bounding boxes,这些 bounding boxes 是在 不同层次(layers) 上的 feature maps 上生成的,并且有着不同的 aspect ratio 。 在 prediction 阶段 : 要...

    Preface

    这是今年 ECCV 2016 的一篇文章,是 UNC Chapel Hill(北卡罗来纳大学教堂山分校)Wei Liu 大神的新作,论文代码:https://github.com/weiliu89/caffe/tree/ssd

    这里写图片描述

    有几点更新:
    1. 看到一篇 blog 对检测做了一个总结、收集,强烈推荐: Object Detection
    2. 还有,今天在微博上看到 VOC2012 的榜单又被刷新了,微博原地址为:这里,如下图:

    这里写图片描述

    3. 目前 voc 2012 的榜单 如下:
    这里写图片描述

    做目标检测这块的多关注哦~


    Abstract

    这篇文章在既保证速度,又要保证精度的情况下,提出了 SSD 物体检测模型,与现在流行的检测模型一样,将检测过程整个成一个 single deep neural network。便于训练与优化,同时提高检测速度。

    SSD 将输出一系列 离散化(discretization) 的 bounding boxes,这些 bounding boxes 是在 不同层次(layers) 上的 feature maps 上生成的,并且有着不同的 aspect ratio

    在 prediction 阶段

    • 要计算出每一个 default box 中的物体,其属于每个类别的可能性,即 score,得分。如对于 PASCAL VOC 数据集,总共有 20 类,那么得出每一个 bounding box 中物体属于这 20 个类别的每一种的可能性。

    • 同时,要对这些 bounding boxes 的 shape 进行微调,以使得其符合物体的 外接矩形

    • 还有就是,为了处理相同物体的不同尺寸的情况,SSD 结合了不同分辨率的 feature maps 的 predictions。

    相对于那些需要 object proposals 的检测模型,本文的 SSD 方法完全取消了 proposals generation、pixel resampling 或者 feature resampling 这些阶段。这样使得 SSD 更容易去优化训练,也更容易地将检测模型融合进系统之中。

    PASCAL VOCMS COCOILSVRC 数据集上的实验显示,SSD 在保证精度的同时,其速度要比用 region proposals 的方法要快很多。

    SSD 相比较于其他单结构模型(YOLO),SSD 取得更高的精度,即是是在输入图像较小的情况下。如输入 300×300300×300 的 mAP。

    如果输入的图像是 500×500500×500 的 mAP,比目前最 state-of-art 的 Faster R-CNN 要好很多。


    Introduction

    现金流行的 state-of-art 的检测系统大致都是如下步骤,先生成一些假设的 bounding boxes,然后在这些 bounding boxes 中提取特征,之后再经过一个分类器,来判断里面是不是物体,是什么物体。

    这类 pipeline 自从 IJCV 2013, Selective Search for Object Recognition 开始,到如今在 PASCAL VOCMS COCOILSVRC 数据集上取得领先的基于 Faster R-CNN 的 ResNet 。但这类方法对于嵌入式系统,所需要的计算时间太久了,不足以实时的进行检测。当然也有很多工作是朝着实时检测迈进,但目前为止,都是牺牲检测精度来换取时间。

    本文提出的实时检测方法,消除了中间的 bounding boxes、pixel or feature resampling 的过程。虽然本文不是第一篇这样做的文章(YOLO),但是本文做了一些提升性的工作,既保证了速度,也保证了检测精度。

    这里面有一句非常关键的话,基本概括了本文的核心思想:

    Our improvements include using a small convolutional filter to predict object categories and offsets in bounding box locations, using separate predictors (filters) for different aspect ratio detections, and applying these filters to multiple feature maps from the later stages of a network in order to perform detection at multiple scales.

    本文的主要贡献总结如下:

    • 提出了新的物体检测方法:SSD,比原先最快的 YOLO: You Only Look Once 方法,还要快,还要精确。保证速度的同时,其结果的 mAP 可与使用 region proposals 技术的方法(如 Faster R-CNN)相媲美。

    • SSD 方法的核心就是 predict object(物体),以及其 归属类别的 score(得分);同时,在 feature map 上使用小的卷积核,去 predict 一系列 bounding boxes 的 box offsets

    • 本文中为了得到高精度的检测结果,在不同层次的 feature maps 上去 predict objectbox offsets,同时,还得到不同 aspect ratio 的 predictions。

    • 本文的这些改进设计,能够在当输入分辨率较低的图像时,保证检测的精度。同时,这个整体 end-to-end 的设计,训练也变得简单。在检测速度、检测精度之间取得较好的 trade-off

    • 本文提出的模型(model)在不同的数据集上,如 PASCAL VOCMS COCOILSVRC, 都进行了测试。在检测时间(timing)、检测精度(accuracy)上,均与目前物体检测领域 state-of-art 的检测方法进行了比较。


    The Single Shot Detector(SSD)

    这部分详细讲解了 SSD 物体检测框架,以及 SSD 的训练方法。

    这里,先弄清楚下文所说的 default box 以及 feature map cell 是什么。看下图:

    • feature map cell 就是将 feature map 切分成 8×88×8 之后的一个个 格子

    • 而 default box 就是每一个格子上,一系列固定大小的 box,即图中虚线所形成的一系列 boxes。

    这里写图片描述


    Model

    SSD 是基于一个前向传播 CNN 网络,产生一系列 固定大小(fixed-size) 的 bounding boxes,以及每一个 box 中包含物体实例的可能性,即 score。之后,进行一个 非极大值抑制(Non-maximum suppression) 得到最终的 predictions。

    SSD 模型的最开始部分,本文称作 base network,是用于图像分类的标准架构。在 base network 之后,本文添加了额外辅助的网络结构:

    • Multi-scale feature maps for detection
      在基础网络结构后,添加了额外的卷积层,这些卷积层的大小是逐层递减的,可以在多尺度下进行 predictions。

    • Convolutional predictors for detection
      每一个添加的特征层(或者在基础网络结构中的特征层),可以使用一系列 convolutional filters,去产生一系列固定大小的 predictions,具体见 Fig.2。对于一个大小为 m×nm×n 个输出结果。

    这里的 default box 很类似于 Faster R-CNN 中的 Anchor boxes,关于这里的 Anchor boxes,详细的参见原论文。但是又不同于 Faster R-CNN 中的,本文中的 Anchor boxes 用在了不同分辨率的 feature maps 上。

    这里写图片描述


    Training

    在训练时,本文的 SSD 与那些用 region proposals + pooling 方法的区别是,SSD 训练图像中的 groundtruth 需要赋予到那些固定输出的 boxes 上。在前面也已经提到了,SSD 输出的是事先定义好的,一系列固定大小的 bounding boxes。

    如下图中,狗狗的 groundtruth 是红色的 bounding boxes,但进行 label 标注的时候,要将红色的 groundtruth box 赋予 图(c)中一系列固定输出的 boxes 中的一个,即 图(c)中的红色虚线框。

    这里写图片描述

    事实上,文章中指出,像这样定义的 groundtruth boxes 不止在本文中用到。在 YOLO 中,在 Faster R-CNN 中的 region proposal 阶段,以及在 MultiBox 中,都用到了。

    当这种将训练图像中的 groundtruth 与固定输出的 boxes 对应之后,就可以 end-to-end 的进行 loss function 的计算以及 back-propagation 的计算更新了。

    训练中会遇到一些问题:

    • 选择一系列 default boxes

    • 选择上文中提到的 scales 的问题

    • hard negative mining

    • 数据增广的策略

    下面会谈本文的解决这些问题的方式,分为以下下面的几个部分。

    Matching strategy

    如何将 groundtruth boxes 与 default boxes 进行配对,以组成 label 呢?

    在开始的时候,用 MultiBox 中的 best jaccard overlap 来匹配每一个 ground truth box 与 default box,这样就能保证每一个 groundtruth box 与唯一的一个 default box 对应起来。

    但是又不同于 MultiBox ,本文之后又将 default box 与任何的 groundtruth box 配对,只要两者之间的 jaccard overlap 大于一个阈值,这里本文的阈值为 0.5。

    Training objective

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

    根据上面的匹配策略,一定有 ixpij1∑ixijp≥1 个 ground truth box,有可能有多个 default box 与其相匹配。

    总的目标损失函数(objective loss function)就由 localization loss(loc)confidence loss(conf) 的加权求和:

    L(x,c,l,g)=1N(Lconf(x,c)+αLloc(x,l,g))L(x,c,l,g)=1N(Lconf(x,c)+αLloc(x,l,g))

    其中:

    • NN,设置为 1


    Choosing scales and aspect ratios for default boxes

    大部分 CNN 网络在越深的层,feature map 的尺寸(size)会越来越小。这样做不仅仅是为了减少计算与内存的需求,还有个好处就是,最后提取的 feature map 就会有某种程度上的平移与尺度不变性。

    同时为了处理不同尺度的物体,一些文章,如 ICLR 2014, Overfeat: Integrated recognition, localization and detection using convolutional networks,还有 ECCV 2014, Spatial pyramid pooling in deep convolutional networks for visual recognition,他们将图像转换成不同的尺度,将这些图像独立的通过 CNN 网络处理,再将这些不同尺度的图像结果进行综合。

    但是其实,如果使用同一个网络中的、不同层上的 feature maps,也可以达到相同的效果同时在所有物体尺度中共享参数

    之前的工作,如 CVPR 2015, Fully convolutional networks for semantic segmentation,还有 CVPR 2015, Hypercolumns for object segmentation and fine-grained localization 就用了 CNN 前面的 layers,来提高图像分割的效果,因为越底层的 layers,保留的图像细节越多。文章 ICLR 2016, ParseNet: Looking wider to see better 也证明了以上的想法是可行的。

    因此,本文同时使用 lower feature maps、upper feature maps 来 predict detections。下图展示了本文中使用的两种不同尺度的 feature map,8×88×8 的 feature map:

    这里写图片描述

    一般来说,一个 CNN 网络中不同的 layers 有着不同尺寸的 感受野(receptive fields)。这里的感受野,指的是输出的 feature map 上的一个节点,其对应输入图像上尺寸的大小。具体的感受野的计算,参见两篇 blog:

    所幸的是,SSD 结构中,default boxes 不必要与每一层 layer 的 receptive fields 对应。本文的设计中,feature map 中特定的位置,来负责图像中特定的区域,以及物体特定的尺寸。加入我们用 mm。所以最终,在每个 feature map location 上,有 6 个 default boxes。

    每一个 default box 的中心,设置为:(i+0.5|fk|,j+0.5|fk|)(i+0.5|fk|,j+0.5|fk|)

    在结合 feature maps 上,所有 不同尺度、不同 aspect ratios 的 default boxes,它们预测的 predictions 之后。可以想见,我们有许多个 predictions,包含了物体的不同尺寸、形状。如下图,狗狗的 ground truth box 与 4×44×4 feature map 中的红色 box 吻合,所以其余的 boxes 都看作负样本。

    这里写图片描述


    Hard negative mining

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

    因此,本文采取,先将每一个物体位置上对应 predictions(default boxes)是 negative 的 boxes 进行排序,按照 default boxes 的 confidence 的大小。 选择最高的几个,保证最后 negatives、positives 的比例在 3:13:1

    本文通过实验发现,这样的比例可以更快的优化,训练也更稳定。

    Data augmentation

    本文同时对训练数据做了 data augmentation,数据增广。关于数据增广,推荐一篇文章:Must Know Tips/Tricks in Deep Neural Networks,其中的 section 1 就讲了 data augmentation 技术。

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

    • 使用原始的图像
    • 采样一个 patch,与物体之间最小的 jaccard overlap 为:0.10.1
    • 随机的采样一个 patch

    采样的 patch 是原始图像大小比例是 [0.11][0.1,1] 之间。

    当 groundtruth box 的 中心(center)在采样的 patch 中时,我们保留重叠部分。

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


    Experimental Results

    Base network and hole filling algorithm

    本文的 Base network 是基于 ICLR 2015, VGG16 来做的,在 ILSVRC CLS-LOC 数据集上进行了预训练。

    ICLR 2015, DeepLab-LargeFOV 的工作类似,本文将 VGG 中的 FC6 layer、FC7 layer 转成为 卷积层,并从模型的 FC6、FC7 上的参数,进行采样得到这两个卷积层的 parameters。

    还将 Pool5 layer 的参数,从 2×2s22×2−s2,外加一个 pad(1),如下图:

    这里写图片描述

    但是这样变化后,会改变感受野(receptive field)的大小。因此,采用了 atrous algorithm 的技术,这里所谓的 atrous algorithm,我查阅了资料,就是 hole filling algorithm

    在 DeepLab 的主页上:http://liangchiehchen.com/projects/DeepLab.html,有一张如下的图:

    这里写图片描述

    博客 1:http://www.cnblogs.com/jianyingzhou/p/5386222.html

    最早用的就是 deeplab 的文章了,Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFS 这篇文章和 fcn 不同的是,在最后产生 score map 时,不是进行upsampling,而是采用了 hole algorithm,就是在 pool4 和 pool 5层,步长由 2 变成 1,必然输出的 score map 变大了,但是 receptive field 也变小了,为了不降低 receptive field,怎么做呢?利用 hole algorithm,将卷积 weights 膨胀扩大,即原来卷积核是 3x3,膨胀后,可能变成 7x7 了,这样 receptive field 变大了,而 score map 也很大,即输出变成 dense 的了。

    这么做的好处是,输出的 score map 变大了,即是 dense 的输出了,而且 receptive field 不会变小,而且可以变大。这对做分割、检测等工作非常重要。

    博客 2:http://blog.csdn.net/tangwei2014/article/details/50453334

    既想利用已经训练好的模型进行 fine-tuning,又想改变网络结构得到更加 dense 的 score map.

    这个解决办法就是采用 Hole 算法。如下图 (a) (b) 所示,在以往的卷积或者 pooling 中,一个 filter 中相邻的权重作用在 feature map 上的位置都是物理上连续的。如下图 (c) 所示,为了保证感受野不发生变化,某一层的 stride 由 2 变为 1 以后,后面的层需要采用 hole 算法,具体来讲就是将连续的连接关系是根据 hole size 大小变成 skip 连接的(图 (c) 为了显示方便直接画在本层上了)。不要被 (c) 中的 padding 为 2 吓着了,其实 2 个 padding 不会同时和一个 filter 相连。

    pool4 的 stride 由 2 变为 1,则紧接着的 conv5_1, conv5_2 和 conv5_3 中 hole size 为 2。接着 pool5 由 2 变为 1 , 则后面的 fc6 中 hole size 为 4。

    这里写图片描述

    本文还将 fully convolutional reduced (atrous) VGGNet 中的所有的 dropout layers、fc8 layer 移除掉了。

    本文在 fine-tuning 预训练的 VGG model 时,初始 learning rate 为 10310−3,learning rate decay 的策略随数据集的不同而变化。


    PASCAL VOC 2007

    在这个数据集中,与 Fast R-CNNFaster R-CNN 进行了比较,几种检测网络都用相同的训练数据集,以及预训练模型(VGG16)。

    本文训练图像是 VOC 2007 train + VOC 2007 validation + VOC 2012 train + VOC 2012 validation,共计 16551 张图像;

    测试集选取的是 VOC 2007 test,共计 4952 张图像。

    下图展示了 SSD300 model 的结构:

    这里写图片描述

    我们用 conv4_3conv7(原先的 FC7)conv8_2conv9_2conv10_2,以及 pool11,这些 layer 来 predict location、 confidence

    在 VGG16 上新加的 convolutional layers,其参数初始化都用 JMLR 2010, Understanding the difficulty of training deep feedforward neural networks 提出的 xavier 方法。

    因为 conv4_3 的尺寸比较大,size 为 38×3838×38 个 default boxes。

    文献 ICLR 2016, ParseNet: Looking wider to see better 指出,conv4_3 相比较于其他的 layers,有着不同的 feature scale,我们使用 ParseNet 中的 L2 normalization 技术将 conv4_3 feature map 中每一个位置的 feature norm scale 到 20,并且在 back-propagation 中学习这个 scale。

    在最开始的 40K 次迭代中,本文使用的 learning rate 是 10310−3,再接着迭代 20K 次。

    下面 Table 1 显示了,我们的 SSD300 model 的精度已经超过了 Fast R-CNN,当我们用 SSD 在更大的图像尺寸上,500×500500×500 的 mAP。

    这里写图片描述

    为了更细节的了解本文的两个 SSD model,我们使用了 ECCV 2012, Diagnosing error in object detectors 的检测分析工具。下图 Figure 3 显示了 SSD 可以高质量的检测不同种类的物体。

    这里写图片描述

    下图 Figure 4 展示了 SSD 模型对 bounding box 的 size 非常的敏感。也就是说,SSD 对小物体目标较为敏感,在检测小物体目标上表现较差。其实这也算情理之中,因为对于小目标而言,经过多层卷积之后,就没剩多少信息了。虽然提高输入图像的 size 可以提高对小目标的检测效果,但是对于小目标检测问题,还是有很多提升空间的。

    同时,积极的看,SSD 对大目标检测效果非常好。同时,因为本文使用了不同 aspect ratios 的 default boxes,SSD 对于不同 aspect ratios 的物体检测效果也很好。

    这里写图片描述


    Model analysis

    为了更好的理解 SSD,本文还使用控制变量法来验证 SSD 中的每一部分对最终结果性能的影响。测试如下表 Table 2 所示:

    这里写图片描述

    从上表可以看出一下几点:

    • 数据增广(Data augmentation)对于结果的提升非常明显
      Fast R-CNN 与 Faster R-CNN 使用原始图像,以及 0.5 的概率对原始图像进行水平翻转(horizontal flip),进行训练。如上面写的,本文还使用了额外的 sampling 策略,YOLO 中还使用了 亮度扭曲(photometric distortions),但是本文中没有使用。
      做了数据增广,将 mAP 从 65.4%65.4%


    PASCAL VOC 2012

    本文又在 VOC 2012 test 上进行的实验,比较结果如下:

    这里写图片描述


    MS COCO

    为了进一步的验证本文的 SSD 模型,我们将 SSD300、SSD500 在 MS COCO 数据集上进行训练检测。

    因为 COCO 数据集中的检测目标更小,我们在所有的 layers 上,使用更小的 default boxes。

    这里,还跟 ION 检测方法 进行了比较。

    总的结果如下:

    这里写图片描述


    Inference time

    本文的方法一开始会生成大量的 bounding boxes,所以有必要用 Non-maximum suppression(NMS)来去除大量重复的 boxes。

    通过设置 confidence 的阈值为 0.010.01,我们可以过滤掉大多数的 boxes。

    之后,我们再用 Thrust CUDA library 进行排序,用 GPU 版本的实现来计算剩下的 boxes 两两之间的 overlap。然后,进行 NMS,每一张图像保留 top 200 detections。这一步 SSD300 在 VOC 20 类的每张图像上,需要耗时 2.2 msec2.2 msec

    下面是在 PASCAL VOC 2007 test 上的速度统计:

    这里写图片描述


    这篇文章居然把相关工作总结放在最后面,我还是第一次见到。

    具体的看原文吧。

    最后放几张结果图:

    这里写图片描述

    这里写图片描述

    展开全文
  • SSD论文解读

    千次阅读 2019-01-04 09:59:36
    1 论文简述 题目 《SSD: Single Shot MultiBox Detector》 作者 Wei Liu, Dragomir Anguelov, Dumitru Erhan , Christian Szegedy,Scott Reed , Cheng-Yang Fu , ...
  • 深度解析SSD论文

    千次阅读 2019-04-18 18:21:17
    前言:以前对SSD算法只有一个比较粗浅的理解,这周为了在组会上讲清楚SSD算法,自己又仔细看了好几遍论文,算是抠得比较细的一篇论文了,总结如下。 一、背景 当前基于深度学习的通用目标检测框架主要分为两大类...
  • ssd论文详解

    2018-11-22 21:19:53
    转载于: ... 这篇博客主要介绍SSD算法,该算法是最近一年比较优秀的object detection算法,主要特点在于采用了特征融合。 论文SSD singl...
  • 目标检测算法“one stage ”算法的一个主要的系列算法SSD是比较有代表性,比较有研究价值,效果相对较好,在SSD算法出现...SSD系列算法的主要文章(仅整理自己读过的几篇论文):SSD:Single Shot MultiBox Detecto...
  • SSD 论文详解

    千次阅读 多人点赞 2020-03-12 21:52:37
    SSD: Single Shot MultiBox Detector (ECCV 2016) 声明:笔者翻译论文仅为学习研究,如有侵权请...源论文代码:https://github.com/weiliu89/caffe/tree/ssd 笔者践行代码:【tensorflow版本正在整理中~】 注:文...
  • SSD论文笔记

    千次阅读 2019-01-03 12:00:19
    论文地址:https://arxiv.org/pdf/1611.10012.pdf code地址:https://github.com/weiliu89/caffe/tree/ssd 文章的主要贡献: We summarize our contributions as follows:  – We introduce SSD, a single-shot...
  • SSD论文策略理解

    千次阅读 2017-10-04 19:07:57
    SSD论文策略理解
  • ssd系列算法总结

    2019-06-23 16:59:44
    目标检测算法“one stage ”算法的一个主要的系列算法SSD是比较有代表性,比较有研究价值,效果相对较好,在SSD算法出现...SSD系列算法的主要文章(仅整理自己读过的几篇论文):SSD:Single Shot MultiBox Detecto...
  • SSD论文阅读笔记

    2021-01-24 17:02:11
    SSD网络主体设计的思想是特征分层提取,并依次进行边框回归和分类。因为不同层次的特征图能代表不同层次的语义信息,低层次的特征图能代表低层语义信息(含有更多的细节),能提高语义分割质量,适合小尺度目标的学习...
  • SSD论文学习

    2021-03-22 19:46:12
    SSD:Single Shot MultiBox Detector》 单点多尺度目标检测器 作者:Wei Liu,DragomirAnguelov,Dumitru Erhan 发表会议及时间:ECCV 2016 目标检测 object detection 随着人工智能技术的发展,目标检测被广泛...
  • 3 SSD与YOLOv1 / YOLOv2的对比      R-CNN系列算法、YOLO系列算法以及SSD算法的问世顺序是R-CNN——Fast R-CNN——Faster R-CNN——YOLOv1——SSD——YOLOv2——YOLOv3——YOLOv4,在当时学习YOLO系列算法时一...
  • 上一篇介绍了ssd算法的网络结构及一些令人迷惑的细节问题,...这一篇接着上一篇,主要介绍几种改进算法的主要思想参考论文:DSSD: Deconvolutional Single Shot DetectorFSSD:Feature Fusion Single Shot Multib...
  • 本章介绍SSD的Pytorch代码实现。 具体原理参考上一章节:https://blog.csdn.net/IEEE_FELLOW/article/details/104241995 代码我已经上传我的github,欢迎star:https://github.com/midasklr/SSD.Pytorch 主要参考...
  • ssd属于前馈卷积神经网络,通过该网络能够产生一系列边界框以及置信分数,通过极大值抑制获得最终的检测结果,ssd前端采用标准的图像分类网络构成基础网络,后端增加些特征层来进行检测,特征层具有以下几个关键特征...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,194
精华内容 2,077
关键字:

ssd系列论文