此SSD非彼SSD~

一、SSD算法介绍

Single Shot MultiBox Detector(One-Stage方法)

  • Wei Liu在ECCV 2016提出
  • 直接回归目标类别和位置
  • 在不同尺度的特征图上进行预测
  • 端到端的训练
  • 即使图片的分辨率比较低,也能保证检测的精度
    在这里插入图片描述

二、SSD算法原理讲解

1.主干网络介绍

在这里插入图片描述
可以使用VGG、ResNet或者MobileNets等各种优秀的、符合工程要求的卷积神经网络,来进行特征提取。
在论文中他使用的是VGG-16网络,并且将最后的两个FC层改成了卷积层,并且又增加了4个卷积层,来获得不同尺度的feature map。

2.多尺度预测

在这里插入图片描述
对于SSD来说,最后的几个卷积层将输入的图片变成了38×38、19×19、10×10、5×5、3×3、1×1,这六个不同大小的尺度,然后在这些尺度上同时对图片内容进行预测。

3.Prior Box Layer

对于不同的尺度特征图m×n,共有m×n个cell,对于每个cell都生成固定尺寸scale和不同长宽比例aspect ratio的bbox。

  • 假设一个feature map有m×n个cell,每个cell对应k个default box,每个default box预测c各类别score和4个offset
  • 则输出的尺寸则为(c+4)×k×m×n

不同尺度下固定尺寸scale和对应特征图的长宽比例aspect ratio的计算方法:
在这里插入图片描述
在这里插入图片描述
对于SSD中最后不同的尺寸,每种尺寸下的cell对应着不同个数的pbox,从这六个不同的尺度中一共提取出8732个pbox。
在这里插入图片描述

4.样本构造

在这里插入图片描述
在这里插入图片描述

5.数据增强

在这里插入图片描述

6.LOSS损失函数

在这里插入图片描述
在这里插入图片描述

7.使用细节

在这里插入图片描述

  • Crop采样的大小会在配置文件中进行配置。
  • 多任务网络的权重,对于分类和回归这两种任务loss的权重分配
  • 正负样本的比例我们这里采取1:3

8.性能比较

在这里插入图片描述
SSD和YOLO相比准确度高但FPS较低,我觉得主要的原因之一就是多尺度下引起的预测框数量巨大的原因,相比之下YOLO只有7×7×2个bbox,计算量远远小于SSD。
在这里插入图片描述
(注:空洞卷积Atrous)
空洞卷积,直白的说就是不通过upsampling(pooling操作)或者增大卷积核尺寸的方式,增大卷积核在原始图片上的感受野大小。根据空洞卷积的特性来看,它更加适用在目标检测中的语义分割和实例分割任务中,具体原因看下面的解释。
缩小数据尺寸=DownSampling(下采样)=SubSampling(子采样),方法有:Max Pooling、Average Pooling、Sum Pooling等。
增大数据尺寸=UpSampling(上采样)=SuperSampling(超采样),方法有:UnPooling、Deconvolution、Bilinear等。
普通卷积:
在这里插入图片描述
空洞卷积:
在这里插入图片描述
空洞卷积,直白地说,让每个像素被卷积的次数变薄到一层,这样可以有效关注局部像素块的语义信息,而不会让每个像素都跟周边的像素块揉合在一起,影响分割的细致度。
仔细的讲,前面也放了卷积和空洞卷积的动画图,仔细看,如果是传统的3*3卷积,每一个上一层的feature map的点,都会被卷积3次:第一次,作为最右边的像素(feature map)被卷积,第二次,作为中间的像素被卷积,第三次,被当成最左边的像素被卷积。经过多次累积卷积,那么,如果这个像素点正好是分割的边界点,则它会跟周边的像素揉合在一起,如果揉合了更多A物品的像素,则会判断为A的像素块;如果揉合了更多的B物品,则判断成了B物品。
推而广之,会导致整个语义分割的边界不清晰:CNN做语义分割本来是有缺陷的,因为CNN卷积得到的都是方块,物品的语义信息在棱角位置肯定不会是方块的。而空洞卷积虽然不能解决语义分割的方块缺陷,但是,让卷积次数变薄,降低了语义信息的复杂性。

三、SSD代码tensorflow 2实现

1.SSD算法的训练过程

  • 首先SSD算法会先对原始的gt数据进行编码,将gt数据中的真实框的位置与大小描述信息修改成与其有最大iou的先验框的位置 +
    此先验框经过怎样的平移变化就可以得到真实框。
  • 真实数据的编码张量[1, 8732, 33] => 具体的每一张原始图片都是单独进行处理的,所以batchsize的位置上为1, 8732 代表所有先验框的个数, 33 = 4(先验框的中心和大小需要进行的gt变换比例值)+ 21(20个目标的分类 + 1个背景类,置为1的代表真实分类)+ 1(此先验框是否是有效的先验框,因为对于一个gt目标我们只会选择一个最优的先验框来对其进行预测)+ 7(无意义,只是为了对其网络的输出吗?那这是不是可以删掉?)
  • 网络输出的张量的维度[b, 8732, 33] => b代表batchsize,8732 代表所有先验框的个数, 33 = 4(预测出来的需要对先验框进行位置和大小变化的比例值) + 21(20个目标的分类 + 1个背景类) + 8(8732个先验框的原始位置与对应的用于放缩数量级的variances变量)
  • 网络的loss计算就是:
    1.使用smooth_L1 loss函数计算先验框真实的偏移与缩放值与网络输出的值之间的loss;
    2.使用softmax_loss loss函数计算目标分类的loss,其中包括了正样本和负样本的loss

四、SSD系列算法应用场景

  • 人脸检测与识别
  • ADAS场景目标检测与识别(车、行人、非机动车)
  • 通用物体检测与识别
  • 自然场景下文本检测与识别

五、SSD系列算法的优化及扩展

主要强调对主干网络的改进和后面预测网络的改进。
在这里插入图片描述

1.DSSD

在这里插入图片描述
特点:

  • 2017年的CVPR,WeiLiu
  • 主要改进SSD算法对小目标不够鲁棒的缺点,其最主要原因是浅层feature map的表征能力不够强
  • 加入上下文信息
  • 使用更好的主干网络和反卷积层,skip连接来给浅层的feature map更好的表征能力

对小尺寸的卷积结果feature map进行反卷积(upsampling)增大尺寸,然后与上一个尺寸的卷积结果相联系,作为下一个feature map进行prior box的预测。这样我们就可以提取出更多的上下文的信息,有利于后续目标的分类和位置回归工作。

2.DSOD

在这里插入图片描述

在这里插入图片描述
特点:

  • 2017年的ICCV2017
  • DSOD可以从0开始训练数据,不需要预训练模型,而且效果可以和fine-tune的模型媲美。就是指其他的目标检测算法所使用的backbone主干网络,都是预先在其他大型数据集上预先训练好了的,而DSOD算法则是可以不适用预训练好的主干网络而是从零开始训练,效果也和使用预训练了的网络相同。
  • SSD+DenseNet=DSOD
  • 可以从零开始训练得到一个好的目标检测网络吗?
  • 如果可以,设计这样的网路有没有什么原则可以遵守?

使用backbone主干网络使用预训练模型的优点:

  • 开源模型多,可以拿来直接使用
  • 可以快速得到最终的模型,需要的训练数据也相对较少

预训练模型的缺点:
在这里插入图片描述
在这里插入图片描述

3.FSSD

普通SSD网络结构:
在这里插入图片描述
FSSD网络结构:
在这里插入图片描述
在这里插入图片描述
(说实话有点黔驴技穷的感觉)

4.RSSD

在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值