SSD

参考:

关键设计

  1. 多尺度特征图预测(Mult-scale Feature Map For Detection)

在图像Base Network基础上,将Fc6,Fc7变为了Conv6,Conv7两个卷积层,在其之后也添加了一些卷积层(Conv8,Conv9,Conv10,Conv11),这些层的大小逐渐减小,可以进行多尺度预测。

  1. 采用卷积进行检测(Convolutional Predictors For Detection)
  • ==在 feature map 上使用小的卷积核(不同层的feature map的感受野不同),去predict 一系列 bounding boxes 的 box offsets;==
  1. Default Boxes
  • 本文中为了得到高精度的检测结果,在不同大小的 feature maps上去predict不同 aspect ratio的object、box offsets;

网络结构

image

  • 将VGG16的全连接层fc6和fc7转换成 3×3 卷积层 conv6和 1×1 卷积层conv7
  • ==将池化层pool5由原来的stride=2的 2×2 变成stride=1的 3×3 (猜想是不想reduce特征图大小),为了配合这种变化,采用了一种Atrous Algorithm,其实就是conv6采用扩展/空洞卷积(间隔为6),其在不增加参数与模型复杂度的条件下指数级扩大卷积的视野==

anchor box

anchot box与ground truth间的offset值依次为中心点的x, y, width, height的offset

==SSD的Caffe源码中的anchor box计算方式:
其中 m 指的特征图个数,但却是 5 ,因为第一层(Conv4_3层)是单独设置的
每个单元的先验框的中心点分布在各个单元的中心==

一共预测了8732个anchor box,因此SSD本质上是密集采样

anchor的大小是线性插值计算的,大小在原图的0.2-0.95倍之间。各层大小分别为0.2, 0.35, 0.5, 0.65, 0.80, 0.90,即像素大小为60, 105, 150, 195, 240, 285

image

==习惯上,我们称上面这个过程为边界框的编码(encode),预测时,你需要反向这个过程,即进行解码(decode),从预测值 l 中得到边界框的真实位置 b :==

image

image

训练

对于包含Default Box(在Faster R-CNN中叫做Anchor)的网络模型(如:YOLO,Faster R-CNN, MultiBox),关键点就是如何把标注信息(Ground True Box,Ground True Category)映射到(Default Box上)。

先验框匹配

通常称与ground truth匹配的先验框为正样本,反之则为负样本

SSD的先验框与ground truth的匹配原则主要有两点:

  • 首先,对于图片中每个ground truth,找到与其IOU最大的先验框,该先验框与该ground truth匹配;
  • 其次,对于剩余的未匹配先验框,若某个ground truth的IOU大于某个阈值(一般是0.5),那么该先验框也与这个ground truth进行匹配。

这意味着某个ground truth可能与多个先验框匹配,这是可以的。但是反过来却不可以,因为一个先验框只能匹配一个ground truth,如果多个ground truth与某个先验框的IOU大于阈值,那么先验框只与IOU最大的那个先验框进行匹配。

第二个原则一定在第一个原则之后进行,仔细考虑一下这种情况,如果某个ground truth所对应最大IOU小于阈值,并且所匹配的先验框却与另外一个ground truth的IOU 大于阈值,那么该先验框应该匹配谁,答案应该是前者,首先要确保某个ground truth一定有一个先验框与之匹配。但是,这种情况我觉得基本上是不存在的。由于先验框很多,某个ground truth的最大 IOU 肯定大于阈值,所以可能只实施第二个原则既可以了,这里的TensorFlow版本就是只实施了第二个原则,但是这里的Pytorch两个原则都实施了。

hard negative mining

尽管一个ground truth可以与多个先验框匹配,但是ground truth相对先验框还是太少了,所以负样本相对正样本会很多。为了保证正负样本尽量平衡,SSD采用了hard negative mining,就是对负样本进行抽样。

Hard Negative Mining 的策略(根据Confidence Loss对所有的Box进行排序,使正负例的比例保持在1:3) 来平衡正负样本的比率

loss函数

位置loss只有正样本有,分类loss根据交叉熵函数来分别求出正样本和负样本的分类loss然后再加起来;

image

image

其中,L1损失函数为

image

数据增广

  • 使用原始的图像
  • 采样一个 patch,与物体之间最小的 jaccard overlap 为:0.1,0.3,0.5,0.7 与 0.9
  • 随机的采样一个patch。
    采样的 patch 是原始图像大小比例是 [0.1,1],aspect ratio 在 12 与 2 之间。
    当 groundtruth box 的 中心(center)在采样的 patch 中时,我们保留重叠部分。
  • 在这些采样步骤之后,每一个采样的 patch 被 resize 到固定的大小,并且以 0.5 的概率随机的 水平翻转(horizontally flipped)

Fast R-CNN 与 Faster R-CNN 使用原始图像,以及 0.5 的概率对原始图像进行水平翻转(horizontal flip),进行训练。如上面写的,本文还使用了额外的 sampling 策略,YOLO 中还使用了 亮度扭曲(photometric distortions),但是本文中没有使用。

Inference

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

不同模型实验结论

  • 数据扩增技术很重要,对于mAP的提升很大;
  • 使用不同长宽比的先验框可以得到更好的结果;

问题

  1. 最后一层1×1大小的feature map用于预测,其后也是接3×3的卷积层么?
  2. 为何检测时图像大小需要resize?不是全卷积网络么?