SSD:虽然我适应多尺度,可是数据扩增对我可太重要了/(ㄒoㄒ)/~~

SSD:Single Shor MultiBox Detector 2016

Abstract

  • SSD 出来的时候,正值 two-stage 发展到经典巅峰 Faster R-CNN,而 one-stage 方面是 Yolov1 刚刚开头,所以 SSD 借鉴了很多 Faster R-CNN 和 Yolov1/OverFeat 的优势
  • SSD 在 stage 上是 one-stage,它的主要目的仍然是嵌入式/移动端或者说是 Real-time,更进一步地说就是目标检测简单快速且有效即可。(截止目前 2021.06 TensorFlow 给的移动端部署目标检测 demo 都是用的 MobileNet SSD,从这一点来说 SSD 还是比较成功的。)
  • 强调可以获得提升的原因是:SSD完全消除了区域推荐和大量的像素或者特征的重采样,且计算都在 a single network 中。
  • 整体来讲 SSD 在模型结构设计方面,很注重尺度适应的问题,有好几个尺度,然后最终表现在 large 物体上表现非常好,在 small 物体上表现欠佳,但是可以通过 data augmentation 来弥补一部分。这些特点跟我使用过程中的实际表现也是非常相符的。
  • 这里我再反复再所说一点吧,data augmentation 对 SSD 是极其关键/致命的,data 在尺度上分布一定要好,SSD 的结果才会好。

Introduction

总的来说, accuracy 差不多和 Faster R-CNN 一个级别,速度比 Yolov1 还要更快。

  • 是第一个不对候选框对应像素或者特征进行重采样、但能达到一样好的效果的物体检测网络。
  • 使用的卷积核都比较小,都是 3 × 3 和 1 × 1,意味着运算资源占用得更少、计算更快,也更不容易过拟合。
  • 不同的 aspect ratio 使用不同的预测,同时兼顾了尺度问题。

最后这点明显是借鉴的 Faster R-CNN 的 anchor,只不过 SSD 叫自己这个东西叫 default boxes,后文也就跟着叫 default box 了。区别是 Faster R-CNN 里面 RPN 部分每个 anchor 也都出了 objectness score (是否存在物体,即前景背景二分)和 coordinates ,SSD 这里关于类别和存在是直接出类别数量的 Softmax,比如训练集一共有 20 个类别,这里每个 default box 会出 20 个概率。Yolo 里面用的是条件概率,就是先出前景/背景二分,在此条件下,再出各个类别的概率,然后这个框是某个类别的概率就是两个概率相乘。

The Single Shot Detector(SSD)

训练过程中,输入为全图和 gt 框 label。在不同尺度的特征图上的每个位置,给定 1 组(比如 4 个或 6 个)不同纵横比的 default box。对于每个 default box 的预测 shape offsets 和总类别数的 confidences。

训练的时候,(对于是否存在物体),首先需要给 default box 分配标签,分配方法就是把这些 boxes 和 gt 之间做 match,比如下图中,给猫 match 到了 2 个 boxes,给狗 match 到了 1 个box,这 3 个就是 positive,其他的都是 negative。

训练过程整体的 loss 可以分为两部分,分别是 localization loss (Smooth L1)和 confidence loss(Softmax)。这个是对标签中物体类别总数做的吧,Faster R-CNN anchor 那里 Softmax 只是当前 BoundingBox 的 objectness 二分类而已,这里是多分类。

在这里插入图片描述

Model

SSD 是 feed-forward 的卷积网络,输出是固定尺寸的,包括 Bounding Box 以及这个 Box 中存在各个类别的概率,后面跟 NMS。网络中靠前的层主要是提取特征,SSD 用的 VGG-16,去掉分类相关的层,然后再加 SSD 自己独有的层。

Multi-scale feature maps for detection

SSD 拿到前面 VGG-16 的最后卷积层之后,逐步地减小 feature map 的尺寸,然后几乎把过程中不同尺度的特征图全用上了,这也是我前面说的 SSD 模型搭建上很注重多尺度适应。

下图中是 SSD 和 Yolo 的对比,现在我们可以先专注看 SSD 尺度方面的细节。可以看到从 VGG-16 的 Conv5_3 开始及之后,从 38 × 38, 19 × 19, 10 × 10, 5 × 5, 3 × 3,1 × 1,每个减小了尺寸的 feature map 都会参与输出,最后单个类别对应输出 8732 个预测( 38 × 38 × 4 + 19 × 19 × 6 + 10 × 10 × 6 + 5 × 5 × 6 + 3 × 3 × 4 + 1 × 1 × 4),然后做 NMS 即可得到最后预测。

而 Yolov1 是单尺度的,v2 里面加了尺度。
在这里插入图片描述

Convolutional predictors for detection

前面刚刚说的多个尺度的 feature map 都参与预测。如果 feature map 尺寸是 m × n × p 的,kernel 3 × 3 × p, 每个 kernel 的参数都是学习预测一个类别 score 或者一个相对 default box 的 shape offset。一共 m × n 个位置,每个位置和 kernel 操作后都会输出,每个位置输出的 Bounding Box 是相对 default box 的变换。Yolov1 在这步是用全连接做的,而不是卷积层,参数会比较多。

Default boxes and aspect ratios

这部分就是很像 Faster R-CNN 的 anchor 机制了,多尺度 feature map 就不再在这里强调了,这里主要说一下单独某个尺度的 feature map 情况。每个 cell (就是 grid 就是 feature map 上的一个位置),会预测相对 default box 的 offset 以及每个类别的概率。每个 cell 会给 k 个 default box(这里的 k 取值 SSD 是有的层取 k = 4 有的是 k = 6,后面还会再说,对应的就是 Faster R-CNN 的 anchor 的数量),这就需要 ( c + 4 ) ∗ k (c + 4) * k (c+4)k 个 filters (也就是说 offset 的 4 个xywh 相关信息、不同类别之间、不同 ratio 之间都是独立的 kernel 来学习),整张 m × n × p 的 feature map,经过此会输出 ( c + 4 ) ∗ k ∗ m ∗ n (c + 4) * k * m * n (c+4)kmn 的输出。

Faster R-CNN 里面的 anchor 是有 area 和 ratio 信息的 一共 9 个,这里 SSD 的 default box 就没说 area 的事儿,因为它直接用了这么多尺度的 feature map,所以 SSD 这里仅强调 aspect ratios 就可以了,因为本身的模型结构就适应了尺度。

Training

训练 SSD 和之前别的模型最大的区别在于,gt 框需要被 assigned to 特定的输出。一旦这个 assignment 被确定,loss 的计算和 bp 都可以端到端训练。训练之前还要确定 default box 、scale、negative mining 以及 data augmentation。

Matching strategy

需要先确定 default box 与 gt 框之间的对应关系。

对于每个 gt 框,我们都在不同 scale、不同 location、不同 default box 中挑选。开始的时候会选择与 gt 框匹配度最高的(jaccard overlap)(就像 MultiBox 一样)。

但是随后,我们会 站在 default box 角度上,只要这个 default box 能够与任何一个 gt 框 jaccard overlap 高于 0.5,就算匹配。

这样模型就可以给多个 default box 都预测比较高的 score,然后再跟 NMS 就好了,而不需要必须就选一个 default box。

我觉得这里的最大效果,相当于是 提高了召回率 recall,也就是说先找到都还算不错的框,然后我再挑或者处理,总比啥也找不到要强。

Training objective

SSD 的 loss 是借鉴了 MultiBox,只不过增加了对多类别的处理。对于类别 p 把第 i 个 default box match 给第 j 个 gt 框的 indicator 叫作 x i j p = { 1 , 0 } x^p_{ij} = \{1, 0\} xijp={1,0},那也就是两种选择,0 或 1。那么对于特定类别 p 且 特定第 j 个 gt 框, 可能会匹配到多个 default box ,所以有 Σ i x i j p ≥ 1 \Sigma_{i}x^p_{ij} \ge 1 Σixijp1

整体的 loss 肯定也是两部分加权,即 localization loss 和 confidence loss 两者加权:

L ( x , c , l , g ) = 1 N ( L c o n f ( x , c ) + α L l o c ( x , l , g ) ) L(x, c, l, g) = \frac{1}{N} (L_{conf(x, c)} + \alpha L_{loc}(x, l, g)) L(x,c,l,g)=N1(Lconf(x,c)+αLloc(x,l,g))

  • 等号左边,总 loss,函数的变量有 ( x , c , l , g ) (x, c, l, g) (x,c,l,g) 四个。
    x 是前面说的 indicator,只能取 0 或 1,可以看到 x 出现在后面 conf 和 loc 两项中,也就是你得取 1 了才会计算 conf 或者 loc;
    c 是所有类别的 confidence 的 softmax 结果;
    l l l 是预测框 predicted box(我很讨厌单独一个字母 l 做变量啊);
    g 是 gt 框。
  • 等号右边两部分,先说最外面系数 1 N \frac{1}{N} N1,N 是被成功 match 到的 default box 的数量,物体检测肯定负样本超级多。如果所有的 default box 全军覆没,一个都没匹配上,总 loss 就变 0。
  • 等号右边里面第一项,是 confidence 项,也就是预测多类别的 confidence 的 softmax 结果。
  • 等号右边里面第二项,是 loc 项,也就是衡量 BoundingBox 和 gt 框之间的差异。

关于具体 conf 项 loss,如下:

L c o n f ( x , c ) = − Σ i ∈ P o s N x i j p log ⁡ ( c ^ i p ) − Σ i ∈ N e g log ⁡ ( c ^ i 0 ) L_{conf}(x, c) = -\Sigma^N_{i\in Pos} x^p_{ij}\log(\hat c^p_{i}) - \Sigma_{i\in Neg}\log(\hat c^0_i) Lconf(x,c)=ΣiPosNxijplog(c^ip)ΣiNeglog(c^i0)

  • 等号右边,先不谈负号,一共两项。
  • 第一项是 default box 被 match 到被标记为 positive 的情况,总数是 N 个 前面也说了。而这一项也只是在给定属于类别 p 的、第 j 个 gt 框时,它所对应的、match 到的 default boxes 的情况。 x i j p x^p_{ij} xijp 也只能取 0 或者 1 ,当取 1 的时候,才会贡献 loss 进来,且会贡献类别为 p 、第 j 个 gt 的 confidence softmax 之后取 log。
  • 第二项是负样本情况,这项中就是刚刚所有在第一项不做贡献的负样本 default boxes,此时也不与任何 gt 框有关系(因为你没 match 到呀,就是背景而已呀),贡献的是 类别0(背景) 的 confidence softmax 之后取 log。

关于具体 loc 项的 loss,就是照搬现成的:

L l o c ( x , l , g ) = Σ i ∈ P o s N Σ m ∈ { c x , c y , w , h } x i j k ∗ s m o o t h L 1 ( l i m − g ^ j m ) L_{loc}(x, l, g) = \Sigma^N_{i\in Pos}\quad\Sigma_{m \in \{cx, cy, w, h\}} x^k_{ij} * smooth_{L1}(l^m_i - \hat g ^m_j) Lloc(x,l,g)=ΣiPosNΣm{cx,cy,w,h}xijksmoothL1(limg^jm)

这里 l l l g ^ \hat g g^ 都是变换,分别是(1)预测框与 default box 之间的变换和(2) gt 框与 default box 之间的变换。这符号用的好别扭啊……是为了与 Faster R-CNN 避嫌吗,我觉得 Faster R-CNN 那些变量和公式就很清晰。

Choosing scales and aspect ratios for default boxes

SSD 使用了很多尺度的 feature map,不同尺度 feature map 的 某个 location 会对应不同大小的 receptive field。但是 SSD 中 default box 并不和实际的感受野做对应,default box 是 平铺的(tiling)。平铺的意思是说,原本有特征关联的位置,比如 38 × 38 feature map 的中心和 19 × 19 feature map 的中心,这两处的特征本来应该是有关联的,但是 SSD 并没有用“关联”的方式来使用这两处的特征,或者再换一种说法,作者 说“平铺”的意思像“并联”,而原本这些相关位置上,虽然 scale 确实不同,但也确实是有“串联”关系的。

“平铺”设计之后, 某个特定尺度的 feature map 就学习特定尺度的物体。假设一共有 m 个不同 scale 的 feature map,用来学习这 m 个不同 scale 上的特征,那么 每个 scale 上的 default box 大小都是不一样的。scale 计算方式有点像 0 ~ 10 米内种 6 棵树,求每棵树的坐标。论文给的计算第 k 个 scale (第 k 棵树的位置)公式如下:

s k = s m i n + s m a x − s m i n m − 1 ∗ ( k − 1 ) , k ∈ [ 1 , m ] s_k = s_{min} + \frac{s_{max} - s_{min}} {m - 1} * (k - 1), k\in [1, m] sk=smin+m1smaxsmin(k1),k[1,m]

  • s m i n s_{min} smin s m a x s_{max} smax 就是种树的起点终点坐标 0 和 10,论文里面给定的是 0.2 和 0.9;
  • m 就是一共要种的 6 棵树;
  • 6 棵树的坐标就依次是 0,2, 4, 6, 8, 10,scale 也就是这么来的,也就是均匀被间隔的。

然后 default box 宽高比是设定好的, a r ∈ { 1 , 2 , 3 , 1 2 , 1 3 } a_r \in \{ 1, 2, 3, \frac{1}{2},\frac{1}{3}\} ar{1,2,3,21,31},而这里和 Faster R-CNN 里面设定 anchor 面积和宽高比是非常相似的,SSD 这里设定 default box 在各个 scale 上的面积就是 s k 2 s_k^2 sk2

所以宽高乘积和宽高比都确定了,就能计算得到宽高了,分别是 w k a = s k ⋅ a r w_k^a = s_k \cdot\sqrt{a_r} wka=skar h k a = s k / a r h_k^a = s_k /\sqrt{a_r} hka=sk/ar

另外对于宽高比为 1 的情况,还增加了一个 default box 对应的 scale 为 s k ′ = s k ⋅ s k + 1 s_k' = \sqrt{s_k \cdot s_{k + 1}} sk=sksk+1 ,有点在两个尺度之间过渡的意思。

这样每个 scale 的 feature map 上的每个 location 都对应有 6 个 default box 了。而每个 default box 的 center 设定为 ( i + 0.5 ∣ f k ∣ , j + 0.5 ∣ f k ∣ ) (\frac{i + 0.5} {|f_k|}, \frac{j + 0.5} {|f_k|}) (fki+0.5,fkj+0.5),其中 ∣ f k ∣ |f_k| fk 是第 k 个特征图的大小(其实就是把特征图每个 location 当做一个 cell,取 cell 的正中心啦,加了个 0.5 )。

这里作者提到了,可以设定 default box 整体服从某个分布,以最好地和数据契合,但具体怎么做还在摸索。这点到 Yolov2 就直接 k-means 生成了。

好了,至此我们就知道了,SSD 上面输出上千个预测结果怎么来的了,每个 scale 的 feature map 的每个 location 都有 6 个(某些设定的 4 个) default box。

Hard negative mining

这里为了解决正负样本数量严重失衡的问题,采用了负样本挖掘。对于负样本,为每个 default box 选择 confidence loss 最大的那部分框,最后可以让正负样本比例接近 1:3。

Data augmentation

写到这里我就不那么高兴了,哎。

通过前面的介绍其实也了解了,SSD 所谓适应多尺度的方式,我觉得它没有很好地适应多尺度,或者说,它适应多尺度主要靠数据的多尺度。也就是你的数据中某个类在多尺度方面的分布不均匀,模型最后的效果也不均匀。

所以,SSD 这么 强调 data augmentation,别的论文即使谈到 data augmentation,也是很简单地介绍下就带过了,而 SSD 全文提到了 data augmentation 一共有 13 次之多,甚至后面实验部分也会单独拿 data augmentation 来说事儿。

Experimental Results

PASCAL VOC 2007

ratio 上表现不错的,但 SSD 对物体尺度很敏感,大物体结果比小物体效果更好。一个原因是小物体在 top layer 时已经没什么特征能留下了,还有个原因就是,SSD 在处理多个 scale 特征图时“平铺”处理。所以, 数据很重要,数据里有了就有了……或者把待检测的图放大再识别。

这里也说了 8732 是怎么得到的,conv4_3, conv10_2, conv11_2 是 4 个 default box,去掉了 1/3 和 3 的;其他的层是 6 个 default box。

Model analysis

前面也说过了,SSD 非常 强调数据扩增,可以从这个表里面看一下,和其他手段相比,数据扩增给模型性能带来的影响几乎是颠覆性的。
在这里插入图片描述

Data augmentation is curcial

再来一遍, 有没有数据扩增对 SSD 来讲是极其关键的,这里作者自己也把这一条写在模型分析的第一条了。

More default box shapes is better
Atrous is faster
Multiple output layers at different resolutions is better

PASCAK VOC 2012

COCO

Preliminary ILSVRC results

Data Augmentation for Small Object Accuracy

这里又 强调了一遍数据扩增,主要针对小物体检测的,这个我也都试过了,就是这样的……数据尺度分布要很均匀才可以得到不错的结果。

Inference time

Related Work

Conclusions

Acknowledgment

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值