这就是神经网络 8:深度学习-目标检测-SSD和DSSD

前言

最近有一篇综述目标检测的论文《Deep Learning for Generic Object Detection: A Survey》,来自首尔国立大学的 Lee hoseong 在近期开源了「deep learning object detection」GitHub 项目,正是参考该论文开发的。该项目集合了从 2013 年 11 月提出的 R-CNN 至在近期发表的 M2Det 等几十篇关于目标检测的论文,相当全面。

github项目上有张图片,里面用红色标注出了经典的必读论文。

在这里插入图片描述

SSD

2016年12月北卡大学教堂山分校的Wei Liu等提出SSD算法。将YOLO的回归思想和Faster R-CNN的anchor box机制结合。

网络的主要结构如下:

在这里插入图片描述
SSD借用预训练的VGG16作为主干网络,在网络后面去掉了全连接层,新加了几层定制的卷积层,然后在多尺度的特征图上用卷积核做分类和bbox回归。输入图片有300x300和512x512两种大小。本文主要讲述SSD300。

主要特点如下:

  1. 采用多尺度特征图用于检测

SSD网络最后参与分类和定位回归的不止一层特征图,而是好几层。比较大的特征图来用来检测相对较小的目标,而小的特征图负责检测大目标。

  1. 采用卷积进行检测

对特征图进行分类和定位回归的时候,没有采用全连接,而是采用3x3的卷积核。对于形状为 m x n x p 的特征图,假设有c个分类, 每个位置有k个先验框,则共需要3 x 3 x p这样较小的卷积核,共需要(c+4) x k个。输出的特征大小为m x n x ((c+4) x k)。

其实采用卷积进行检测除了省时间还有一个附带的好处,那就是能利用卷积的技巧进行更进一步的改进,后面很多基于SSD的改进项目都用到了特征融合等技巧,这都是卷积带来的便利。

  1. 使用不同大小和宽高比的先验框

SSD借鉴了Faster R-CNN中anchor的理念,每个单元设置尺度或者长宽比不同的先验框,预测的边界框(bounding boxes)是以这些先验框为基准的偏移系数,在一定程度上减少训练难度。偏移系数的计算方式和Faster R-CNN中一样,就不多讲了。

SSD设置先验框的规律就是前面大的特征图(包含底层信息多)用小的先验框检测小物体,后面特征图越小(抽象层次越高)先验框越大用于检测大物体.

在这里插入图片描述

损失函数

损失函数定义为位置误差(locatization loss, loc)与置信度误差(confidence loss, conf)的加权和:

在这里插入图片描述

位置误差与Faster R-CNN一样采用smooth_l1 loss, 分类置信度误差采用交叉熵。α设为1。

预测过程

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

性能评估

一句话概括:又快又好。

在这里插入图片描述

Figure 4 展示了 SSD 模型对 bounding box 的 size 非常的敏感。也就是说,SSD 对小物体目标较为敏感,在检测小物体目标上表现较差。提高输入图像的 size 可以提高对小目标的检测效果。要知道论文里已经针对小目标做了数据增强了。

在这里插入图片描述
整体效果还是很惊艳的:

在这里插入图片描述

模型分析

对SSD的各个trick做了更为细致的分析:

在这里插入图片描述
从上表可以看出一下几点:

  • 数据增广(Data augmentation)对于结果的提升非常明显
  • 使用更多的 feature maps 对结果提升更大
  • 使用更多的 default boxes,结果也越好
  • Atrous 使得 SSD 又好又快. Atrous其实就是空洞卷积,主要为了利用已有的VGG模型做finetunning。我个人理解完全重新训练SSD的话Atrous是没必要的,暂时没数据来支持自己的看法。

检测代码

下面代码来自:balancap/SSD-Tensorflow

最上面的整体框图,用于检测的特征图传给一个ssd_multibox_layer函数,代码见下方。

  • 分类和回归使用两个不同的3x3卷积核来完成
  • 两个卷积核都没有激活函数,这里模拟的全连接的操作,但是计算量更小
def ssd_multibox_layer(inputs,
                       num_classes,
                       sizes,
                       ratios=[1],
                       normalization=-1,
                       bn_normalization=False):
    """Construct a multibox layer, return a class and localization predictions.
    """
    net = inputs
    if normalization > 0:
        net = custom_layers.l2_normalization(net, scaling=True)
    # Number of anchors.
    num_anchors = len(sizes) + len(ratios)

    # Location.
    num_loc_pred = num_anchors * 4
    loc_pred = slim.conv2d(net, num_loc_pred, [3, 3], activation_fn=None,
                           scope='conv_loc')
    loc_pred = custom_layers.channel_to_last(loc_pred)
    loc_pred = tf.reshape(loc_pred,
                          tensor_shape(loc_pred, 4)[:-1]+[num_anchors, 4])
    # Class prediction.
    num_cls_pred = num_anchors * num_classes
    cls_pred = slim.conv2d(net, num_cls_pred, [3, 3], activation_fn=None,
                           scope='conv_cls')
    cls_pred = custom_layers.channel_to_last(cls_pred)
    cls_pred = tf.reshape(cls_pred,
                          tensor_shape(cls_pred, 4)[:-1]+[num_anchors, num_classes])
    return cls_pred, loc_pred

DSSD

SSD的第一作者Wei Liu也是DSSD的第一作者,所以DSSD就是为了改进SSD。

SSD的缺点作者在论文里说了,对于小目标检测较差,其次bachbone选的比较老的VGG16,这个还有进一步的改进空间。所以DSSD做出了以下改进:

  • 使用具有更好表征能力的resnet101代替VGG16
  • 用反卷积层(deconvolution layer )上采样, 利用Top-Down的网络结构进行高低层特征的融合,使得每个特征图预测都能充分利用上下文信息
  • 改进特征融合的方法:采用点积
  • 提出由残差单元组成的预测模块,进一步提取深度特征,最后输入给框回归任务和分类任务
  • 提出了一种通用的Top-Down的融合方法,使用vgg和resnet网络,以及不同大小的训练图片尺寸来验证算法的通用型

总体结构

DSSD的总体结构和SSD对比如下:

在这里插入图片描述
上图的上面是SSD的结构,下面是DSSD的结构。

可以看到,除了最小的那个特征图,其他用于预测的特征图都是来自两部分:原始特征图和前一级小一号的融合特征图。同时每个融合后的特征图除了用于预测,还要提供给更大的特征图进行上采样融合。

这么说可能不是很直观,看下《Deep Learning for Generic Object Detection: A Survey》里的图就比较清楚了:

在这里插入图片描述
在这里插入图片描述
注意两个分支融合的时候采用的是点积的方式。也就是说小特征图先2倍上采样到与大特征图相同的尺寸,然后做点积。

预测模块

作者提出了残差单元组成的预测模块:

在这里插入图片描述
上图a是原始的SSD的预测模块。后面3个是改进方案。

在这里插入图片描述
经过对比测试,C方案的预测模块最好。然后在C预测模块基础上对比了融合的方法:相加和点乘。发现点乘好一点。最后一行是在整个网络在backbone的基础上 fine-tune之后再单独 fine-tune DM模块,但是结果回退了。

综上,最好的结果就是c方案的预测模块加点乘的融合模块。

测试结果

无论是整体效果还是小目标的检测效果,都优于SSD:

在这里插入图片描述
但是,速度也没优势了:

在这里插入图片描述
测试效果图:

在这里插入图片描述

在这里插入图片描述

结论

与SSD相比,DSSD模型在两种情况下都有所改进。第一种情况是在包含小物体或稠密物体的场景中,由于输入的体积较小,SSD不适用于小对象,但DSSD明显改善。第二种情况是可以改进具有特定关系的物体的检测:领带和穿西装的男人,棒球棒和棒球运动员,足球和足球运动员,网球拍和网球运动员,以及滑板和跳跃的人。

参考资料

综合

英文论文:Deep Learning for Generic Object Detection: A Survey

翻译:Deep Learning for Generic Object Detection: A Survey – 目标检测综述总结

github: hoya012/deep_learning_object_detection

SSD资料

arxiv 论文 SSD:Single Shot MultiBox Detector

目标检测|SSD原理与实现

目标检测(十)——SSD

基本上算是对论文的翻译:论文阅读:SSD: Single Shot MultiBox Detector

ssd tensorflow 源码: balancap/SSD-Tensorflow

DSSD资料

论文: DSSD : Deconvolutional Single Shot Detector

目标检测(十一)——DSSD

DSSD:Deconvolutional Single Shot Detector 解析与实践

精读深度学习论文(32) DSSD & DSOD

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值