5.9 SSD算法原理

5.9 SSD算法原理

学习目标

  • 目标

    • 知道SSD的结构

    • 说明Detector & classifier的作用

    • 说明SSD的优点

  • 应用

5.9.1 SSD

5.9.1.1 简介

SSD算法源于2016年发表的算法论文,论文网址:https://arxiv.org/abs/1512.02325

SSD的特点在于:

  • SSD结合了YOLO中的回归思想和Faster-RCNN中的Anchor机制,使用全图各个位置的多尺度区域进行回归,既保持了YOLO速度快的特性,也保证了窗口预测的跟Faster-RCNN一样比较精准。

  • SSD的核心是在不同尺度的特征特征图上采用卷积核来预测一系列Default Bounding Boxes的类别、坐标偏移。

5.9.1.2 结构

以VGG-16为基础,使用VGG的前五个卷积,后面增加从CONV6开始的5个卷积结构,输入图片要求300*300。

5.9.1.3 流程

SSD中引入了Defalut Box,实际上与Faster R-CNN的anchor box机制类似,就是预设一些目标预选框,不同的是在不同尺度feature map所有特征点上使用PriorBox层

5.9.1.4 Detector & classifier

Detector & classifier的三个部分:

  • 1.PriorBox层:生成default boxes,默认先验框

  • SSD借鉴了Faster R-CNN中anchor的理念,每个单元设置尺度或者长宽比不同的先验框,预测时候的边界框(bounding boxes)是以这些先验框为基准的,在一定程度上减少训练难度。

  • 2.Conv3 x 3:生成localization, 4个位置偏移

  • 3.Conv3 x 3:confidence,21个类别置信度(要区分出背景)

5.9.1.5 PriorBox层-default boxes

default boxes(priorobx/先验框)类似于RPN当中的滑动窗口生成的候选框,SSD中也是对特征图中的每一个像素生成若干个框。

先验框特点分析:

  • priorbox:相当于faster rcnn里的anchors,预设一些box,网络根据box,通过分类和回归给出被检测到物体的类别和位置。每个window都会被分类,并回归到一个更准的位置和尺寸上

根据输入的不同aspect ratio 和 scale 以及 num_prior来返回特定的default box,以feature map上每个点的中点为中心,生成一些列同心的prior box

1、SSD网络prior_box:打印出来的形状为:

Tensor("concat_2:0", shape=(?, 7308, 8), dtype=float32)

 

# 其中某一层的结构输出

layer {

name: "conv6_2_mbox_priorbox"

type: "PriorBox"

bottom: "conv6_2"

bottom: "data"

top: "conv6_2_mbox_priorbox"

prior_box_param {

min_size: 111.0

max_size: 162.0

aspect_ratio: 2.0

aspect_ratio: 3.0

flip: true

clip: false

variance: 0.10000000149

variance: 0.10000000149

variance: 0.20000000298

variance: 0.20000000298

step: 32.0

offset: 0.5

}

5.9.1.5 prior box使用过程

localization与confidence这两者的意义如下,主要作用用来过滤,训练

1、边界框的location预测边界框位置解码

2、SSD 预测边界框trick

3、代码展示过程

代码中的位置输出也会经过这样的计算:

def decode(default_boxes, locs, variance=[0.1, 0.2]):

    """ 对default_boxes进行解码到坐标coordinates

    Args:

        default_boxes: tensor (num_default, 4)

                       of format (cx, cy, w, h)

        locs: tensor (batch_size, num_default, 4)

              of format (cx, cy, w, h)

        variance: variance for center point and size

    Returns:

        boxes: tensor (num_default, 4)

               of format (xmin, ymin, xmax, ymax)

    """

    # 解码过程

    locs = tf.concat([

        locs[..., :2] * variance[0] *

        default_boxes[:, 2:] + default_boxes[:, :2],

        tf.math.exp(locs[..., 2:] * variance[1]) * default_boxes[:, 2:]], axis=-1)





    # (cx, cy, w, h)->(xmin, ymin, xmax, ymax)

    boxes = transform_center_to_corner(locs)





    return boxes





def encode(default_boxes, boxes, variance=[0.1, 0.2]):

    """ Compute regression values

    Args:

        default_boxes: tensor (num_default, 4)

                       of format (cx, cy, w, h)

        boxes: tensor (num_default, 4)

               of format (xmin, ymin, xmax, ymax)

        variance: variance for center point and size

    Returns:

        locs: regression values, tensor (num_default, 4)

    """

    # (xmin, ymin, xmax, ymax)->(cx, cy, w, h)

    transformed_boxes = transform_corner_to_center(boxes)





    # 编码过程

    locs = tf.concat([

        (transformed_boxes[..., :2] - default_boxes[:, :2]

         ) / (default_boxes[:, 2:] * variance[0]),

        tf.math.log(transformed_boxes[..., 2:] / default_boxes[:, 2:]) / variance[1]],

        axis=-1)





    return locs

问题:SSD中的多个Detector & classifier有什么作用?

SSD的核心是在不同尺度的特征图上来进行Detector & classifier 容易使得SSD观察到更小的物体

5.9.2 训练与测试流程

5.9.2.1 train流程

  • 输入->输出->结果与ground truth标记样本回归损失计算->反向传播, 更新权值

1. 样本标记:

先将prior box与ground truth box做匹配进行标记正负样本,每次并不训练8732张计算好的default boxes, 先进行置信度筛选,并且训练指定的正样本和负样本, 如下规则

  • 正样本

    • 1.与GT重合最高的boxes, 其输出对应label设为对应物体.

    • 2.物体GT与anchor iou满足大于0.5

  • 负样本:其它的样本标记为负样本

在训练时, default boxes按照正负样本控制positive:negative=1:3

2. 损失

网络输出预测的predict box与ground truth回归变换之间的损失计算

  • 置信度是采用 Softmax Loss(Faster R-CNN是log loss)

  • 位置回归则是采用 Smooth L1 loss (与Faster R-CNN一样)

    • 所以位置误差仅针对正样本进行计算。要先对ground truth的g进行编码得到(预测框解码的反向过程)

其中

3、数据增强

采用数据扩增(Data Augmentation)可以提升SSD的性能,主要采用的技术有水平翻转(horizontal flip),随机裁剪加颜色扭曲(random crop & color distortion),随机采集块域(Randomly sample a patch)(获取小目标训练样本)。SSD上数据增强的效果增加明显

5.9.2.2 test流程

  • 预测过程比较简单,对于每个预测框,首先根据类别置信度确定其类别(置信度最大者)与置信度值,并过滤掉属于背景的预测框。然后根据置信度阈值(如0.5)过滤掉阈值较低的预测框。对于留下的预测框进行解码,根据先验框得到其真实的位置参数。

5.9.3 SSD实验与总结

5.9.2.1 实验

  • 1、SSD在VOC2007,VOC2012及COCO数据集上的性能,如下面所示。相比之下,SSD512的性能会更好

  • 2、多尺度特征图对SSD的影响

  • 3、SSD与其它检测算法的对比结果(在VOC2007数据集)如表2所示,基本可以看到,SSD与Faster R-CNN有同样的准确度,并且与Yolo具有同样较快地检测速度。

5.9.3.3 总结

从图中看出SSD算法有较高的准确率和性能,兼顾了**速度和精度。SSD算法的优点应该很明显:运行速度可以和YOLO媲美,检测精度可以和Faster RCNN媲美。当然也有一些缺点:

  • 1、需要人工设置prior box的min_size,max_size和aspect_ratio值。网络中prior box的基础大小和形状不能直接通过学习获得,而是需要手工设置。

  • 2、虽然采用了pyramdial feature hierarchy的思路,但是对小目标的recall依然一般,并没有达到超越Faster RCNN太多。主要可能是这是由于SSD使用conv4_3低级feature去检测小目标,而低级特征卷积层数少,存在特征提取不充分的问题。

下面两个为github实现的版本:有兴趣可以阅读使用

https://github.com/ChunML/ssd-tf2:易于阅读和理解模型构建和计算过程

https://github.com/mattroos/ssd_tensorflow2:搭建多种结构模型

5.9.4 总结

  • SSD的结构

  • Detector & classifier的组成部分以及作用

  • SSD的训练样本标记

  • GT与default boxes的格式转换过程

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值