关于深度学习:SSDSingle-Shot-MultiBox-Detector笔记

38次阅读

共计 7233 个字符,预计需要花费 19 分钟才能阅读完成。

前言

本文用于记录学习 SSD 指标检测的过程,并且总结一些精髓知识点。

为什么要学习 SSD,是因为 SSD 和 YOLO 一样,都是 one-stage 的经典构架,咱们必须对其了解十分粗浅能力触类旁通设计出更加优良的框架。SSD 这个指标检测网络全称为 Single Shot MultiBox Detector,重点在MultBox 上,这个思维很好地利用了多尺度的劣势,全面晋升了检测精度,之后的 YOLOv2 就借鉴了 SSD 这方面的思路才缓缓倒退起来。

强烈建议浏览官网的论文去好好了解一下 SSD 的原理以及设计思路。这里也提供了相干的 pdf:http://www.cs.unc.edu/~wliu/p…

当然也有很多好的博客对其进行了介绍,在本文的最下方会有相干链接。本篇文章次要为本人的笔记,其中加了一些本人的思考。

网络构架

SSD 的原始网络构架倡议还是以论文为准,毕竟平时咱们接触到的都是各种 魔改版(也就是所谓的换了 backbone,例如最常见的 SSD-mobilenetv2),尽管与原版大同小异,不过对于了解来说,会增大咱们了解的难度,因而,齐全有必要看一遍原始的论文形容。

SSD 在论文中是采取的 VGG 网络作为骨干构造,然而去除了 VGG 中的最初几层(也就是咱们常常说的分类层),随后增加了一些新的内容(在原文中叫做 auxiliary structure),这些层别离是:

  • 额定的特征提取层 (Extra Feature Layers),作用就是和本来backbone 的层相结合独特提取出不同尺寸的特色信息,相当于增强了之前的 backbone,使其网络更深,提取能力更加弱小。
  • 分类层(classification headers),对之前网络中的不同地位网络层输入的特色层(不同尺度),进行卷积得出每个特色图中每个坐标对应的分类信息(每个坐标对应着许多 default boxes)。
  • 坐标地位回归层 (regression hearders),构造与分类层相仿,只是输入的通道略有不同,通过对不同尺度的特色图进行卷积,输入的是每个特色图中每个坐标对应的default boxes 的偏移坐标(文章中称为 shape offset)。

总体来说,SSD 网络结构其实有四局部组成,backbone 局部、额定增加的特征提取层、分类层以及坐标地位回归层。留神当初这篇 SSD 是出于 Yolo 一代之后二代之前,Yolo 二代三代中不同尺度的特色图思维是有借鉴于 SSD 的。

用于检测的多尺度特色图

多尺度特色图具体示意就是 SSD 在整个网络的不同地位,取出相应的特色层进行预测,每个特色层因为尺度不一样能够检测的视线以及指标物体的大小也不同。每个特色图能够预测出分类信息和地位信息,如下图中能够看到整个网络应用从前到后应用了 6 个不同的特色图,从 38x38x5121x1x256一共六个不同尺度的特色图。

也就是 应用低层 feature map 检测小指标,应用高层 feature map 检测大指标,是 SSD 的突出贡献。

那么 default box 是如何产生?

default box

论文中的原话是这样的:

We associate a set of default bounding boxes with each feature map cell, for multiple feature maps at the top of the network. The default boxes tile the feature map in a convolutional manner, so that the position of each box relative to its corresponding cell is fixed. At each feature map cell, we predict the offsets relative to the default box shapes in the cell, as well as the per-class scores that indicate the presence of a class instance in each of those boxes.

就是对于上述每一个不同尺度的特色图 (38×38、19×19、10×10、5×5、3×3、1×1),每一个特色图中的坐标中(cell) 产生多个 default box。对于每个 default box,SSD 预测出与实在标定框的偏移(offsets,一共是 4 个数值,代表地位信息) 以及对应于每个类的概率 confidence($c_1 ,c_2, …, c_p$)。如果一共有 c 类,每一个坐标产生 k 个 box,那么咱们在进行训练的时候,每个 cell 就会产生(c+4)k 个数据,如果特色图大小为 mxn,那么总共就是(c+4)kmn,例如 3 ×3 的特色图,mxn 就是 3 ×3。

留神下,上述的那个 offset 不仅是绝对于 default box,换个角度来说,也是绝对于实在标定框的偏移,艰深了说就是default box 加上 offsets 就是实在标定框的地位。这个 offsets 是咱们在训练学习过程中能够计算出来用于损失函数来进行优化的。

在理论预测中,咱们要预测出每个 default box 的 category 以及对应的 offset。

这部分我看到更好的介绍,所以这里不进行赘述,能够间接看这里:解读 SSD 中的 Default box(Prior Box)。

训练过程

不光要从论文中了解一个网络的细节局部,还须要具体理解一下训练的具体过程:

因为咱们要在特色图上生成 default box,那么在训练阶段咱们就须要将 GT(Ground Truth) 与 default box 绝对应能力进行训练,怎么个对应法,SSD 中应用了一个 IOU 阈值来管制理论参加计算的 default box 的数量,这一步骤产生在数据筹备中

首先要保障每个 GT 与和它度量间隔最近的(就是 iou 最大)default box 对应,这个很重要,能够保障咱们训练的正确性。另外,因为咱们有很多狠多的 default box,所以不只是 iou 最大的 default box 要保留,iou 满足肯定阈值大小的也要保留下来。

也就是说,训练的过程中就是要判断哪个 default boxes 和具体每一张图中的实在标定框对应,但理论中咱们在每个特色图的每个 cell 中曾经产生了很多 default boxes,SSD 是将所有和实在标定框的 IOU(也就是 jaccard overlap) 大于肯定阈值 (论文中设定为 0.5) 的 default boxes 都保留下来,而不是只保留那个最大 IOU 值的default box(为什么要这么做,原论文中说这样有利于神经网络的学习,也就是学习难度会升高一些)。

这样咱们就在之前生成的 default boxes 中,精挑细选出用于训练的 default boxes(为了不便,理论训练中 default boxes 的数量是不变的,只不过咱们间接将那些 iou 低于肯定阈值的default boxes 的 label 间接置为 0 也就是背景)。

损失函数

损失函数也是很简略,一共有俩,别离是地位损失以及分类损失:

$$
L(x, c, l, g)=\frac{1}{N}\left(L_{c o n f}(x, c)+\alpha L_{l o c}(x, l, g)\right)
$$

其中 $N$ 为 matched default boxes 的数量,这个 $N$ 就是训练过程一开始中精挑细选进去的default boxes。当 $N$ 为 0 的时候,此时总体的损失值也为 0。而 $\alpha$ 是通过穿插验证最终失去的权重系数,论文中的值为 1。

地位损失

其中 $x_{i j}^{p}=\{1,0\}$ 示意以后 defalut box 是否与实在的标定框匹配 (第 $i$ 个defalut box 与第 $j$ 个实在的标定框,其中类别是 $p$),通过后面的 match 步骤后,有 $\sum_{i}x^{p}_{ij}$ 大于等于 1。

$$
L_{l o c}(x, l, g)=\sum_{i \in P \text { os} m \in\{c x, c y, w, h\}}^{N} \sum_{(c x, c y, w, h\}} x_{i j}^{k} \operatorname{smooth}_{\mathrm{L1}}\left(l_{i}^{m}-\hat{g}_{j}^{m}\right)
$$

留神,上式中的 $\hat{g}_{j}^{m}$ 是进行变动后的 GroundTruth,变动过程与default box 无关,也就是咱们训练过程中应用的 GroundTruth 值是首先通过 default box 做转换,转化后的值,别离为 $\hat{g}_{j}^{c x},\hat{g}_{j}^{c y},\hat{g}_{j}^{w}, \hat{g}_{j}^{h}$,这四个值,别离是实在的标定框 对应 default box 的核心坐标 $x,y$ 以及宽度 $w$ 和高度 $h$ 的偏移量。

也就是上面四个转换关系,略微花一点心理就可以看明确,在训练的时候理论带入损失函数的就是上面这四个转化后的值:

$$
\hat{g}_{j}^{c x}=\left(g_{j}^{c x}-d_{i}^{c x}\right) / d_{i}^{w} \quad \hat{g}_{j}^{c y}=\left(g_{j}^{c y}-d_{i}^{c y}\right) / d_{i}^{h}
$$

$$
\hat{g}_{j}^{w}=\log \left(\frac{g_{j}^{w}}{d_{i}^{w}}\right) \quad \hat{g}_{j}^{h}=\log \left(\frac{g_{j}^{h}}{d_{i}^{h}}\right)
$$

同理,既然咱们在训练过程中学习到的是 default box -> GroundTruth Box 的偏移量,那么咱们在揣测的时候天然也要有一个相同的公式给计算回来,将下面的四个公式反转一下即可。

分类损失

分类损失应用穿插熵损失,

$$
L_{c o n f}(x, c)=-\sum_{i \in P o s}^{N} x_{i j}^{p} \log \left(\hat{c}_{i}^{p}\right)-\sum_{i \in N e g} \log \left(\hat{c}_{i}^{0}\right) \quad \text {where} \quad \hat{c}_{i}^{p}=\frac{\exp \left(c_{i}^{p}\right)}{\sum_{p} \exp \left(c_{i}^{p}\right)}
$$

须要留神一点就是 $x_{i j}^{p}$ 代表此时的预测 box 是否与实在标定框匹配,匹配则为 1,也就是说分类损失前半部分只思考与 label 匹配的,也就是 positive boxes。而后半局部 $\hat{c}_{i}^{0}$ 则示意背景分类的损失,即 negative boxes 的损失,想要让 $\hat{c}_{i}^{0}$ 越大(背景正确被分为背景),就必须让后半局部的损失越小。

Hard negative mining

这个过程产生在理论训练过程中 ,因为图像中预测进去的 box 有很多,而且大部分时 negative boxes,所以这里将打消大部分的 negative boxes 从而使 positive 与 negative 的比例达到 1:3。首先对之前通过 match 步骤,精挑细选之后的 default boxes 计数。这些default boxes 算是 positive default boxes,算出此时 positive 的数量,而后乘以 3 则是 negative boxes 的数量。

那么如何去筛选适合数量的 negative boxes?SSD 中的筛选规定是:筛选 loss 最大的 boxes,也就是最难学的 boxes,依据预测进去的 confidence 来判断 (这段局部的实现可能与论文中会有所不同),那么什么算最难学的,因为咱们首先曾经依据 label(这个 label 是之前 matching 过程后的 label,label 得数量与整张特色图中的 boxes 数量雷同,只不过其中的 label 曾经依据 matching 步骤进行了调整) 失去了 positive boxes,这些 positive boxes 与理论指标都满足肯定的条件,而且其中很大概率都有物体。那么最难学的 boxes 该如何筛选呢?

咱们在其余的 boxes 中,因为其余的这些 boxes 曾经不可能蕴含指标 (因为有指标的在 matching 中都曾经被筛选了,这些是剩下的),所以这些 boxes 的 label 理当被预测为background 也就是背景,所以这些 boxes 对于背景的损失值应该是比拟小的,也就是模型较为正确预测了背景。那么咱们要选最难辨认的 boxes,也就是最难辨认为背景的 boxes,这些叫做 negative boxes,首先咱们将其余的这些 boxes 对于背景的 loss 排序,而后选取后面肯定数量 (与 positive boxes 的比值是 3:1) 的 boxes 作为 negative boxes 即可。

这段形容可能有些形象,配上代码可能更好看一些:

def hard_negative_mining(loss, labels, neg_pos_ratio):
    """
    It used to suppress the presence of a large number of negative prediction.
    It works on image level not batch level.
    For any example/image, it keeps all the positive predictions and
     cut the number of negative predictions to make sure the ratio
     between the negative examples and positive examples is no more
     the given ratio for an image.

    Args:
        loss (N, num_priors): the loss for each example.
        labels (N, num_priors): the labels.
        neg_pos_ratio:  the ratio between the negative examples and positive examples.
    """
    pos_mask = labels > 0                                    
    num_pos = pos_mask.long().sum(dim=1, keepdim=True)
    num_neg = num_pos * neg_pos_ratio

    loss[pos_mask] = -math.inf                               # put all positive loss to -max
    _, indexes = loss.sort(dim=1, descending=True)           # sort loss in reverse order (bigger loss ahead)
    _, orders = indexes.sort(dim=1)
    neg_mask = orders < num_neg
    return pos_mask | neg_mask

图像增强

SSD 中曾经采取了一些比拟好的图像增强办法来晋升 SSD 检测 不同大小不同形态 的物体,那就是 randomly sample,也就是随机在图像片进行 crop,提前设定一些比例,而后依据这个比例来对图像进行 crop, 然而有一点须要留神那就是这个 randomly sample 中须要思考到 IOU,也就是咱们 crop 进去的图像必须和原始图像中的 GT box 满足肯定的 IOU 关系,另外 crop 进去的图像也必须满足肯定的比例。

通过 randomly sample 后的图像其中必然蕴含原始的 GT boxes(不肯定全蕴含),而且 crop 后的 boxes 也是正确的。

这部分说起来比拟形象,能够看看这篇文章,我本人懒得进行演示了:

  • 指标检测:SSD 的数据加强算法

学习率设置

  • 官网:优化器应用 SGD,初始的学习率为 0.001momentum0.9weight-decay0.0005batch-size32
  • 我集体和官网应用的优化器雷同,只不过在学习率上通过 multi-step 的形式(具体能够看 Pytorch 相干实现局部),在 80 和 150 个 epoch 阶段将学习率衰减至之前的1/10。一共训练 300 个 epoch。

训练局部的系数设置仅供参考,不同数据的训练系数略有不同。

预训练权重

集体应用 mobilenetv2-SSD 的构架对本人的数据进行了训练,在所有超参数和训练系数不变的状况下,如果采纳预训练好的 mobilenetv2 的权重(在 ImageNet 上),那么训练速度和最终的训练精度都会高出一截(雷同 epoch 下),所以采纳预训练好的权重信息很重要。

总结

SSD 是一个优雅的指标检测构造,到当初仍然为比拟风行的指标检测框架之一,值得咱们学习,然而 SSD 对小指标的检测成果有点差,召回率不是很高,这与 SSD 的特色图以及 semantic 语义信息无关,另外 SSD 中也提到了一些对于晋升 mAP 的起因,其中很大部分是因为图像增强局部,之前提到的 random patch 能够变相地了解为对图像进行 ”zoom in” 或者 ”zoom out”,也就是办法或者放大,这样加强了网络监测大指标和小指标的能力(但监测小指标的能力还是略微差一点)。

对于 SSD 的更多探讨,我这里也收集了一些其余优良的文章,这里就不赘述了:

  • SSD 到底如何实现性能以及如何优化 – 集体探讨
  • 为什么 SSD(Single Shot MultiBox Detector)对小指标的检测成果不好?

参考链接

https://arleyzhang.github.io/…
https://www.cnblogs.com/sddai…

撩我吧

  • 如果你与我气味相投于此,老潘很违心与你交换;
  • 如果你喜爱老潘的内容,欢送关注和反对。
  • 如果你喜爱我的文章,心愿点赞???? 珍藏 ???? 评论 ???? 三连一下~

想晓得老潘是如何学习踩坑的,想与我交换问题~ 请关注公众号「oldpan 博客」。
老潘也会整顿一些本人的私藏,心愿能帮忙到大家,点击神秘传送门获取。

正文完
 0