论文:https://arxiv.org/abs/1512.02325
中心思想:
- 直接通过一个神经网络实现目标检测。关键:不对特征进行重采样
- 在不同的尺度&比例的default box下(其实就是Anchor),将BBox的输出空间离散化成每个Feature Map中的点
- 使用了Multi-scale输出,预测时输出的是分数 + 偏移量(adjustment)
- 减少了Two-stage中的Proposal -> ROIPooling -> RCNN这种结构(SSD并非第一个这么做的,前面有YOLO,但是做了一系列的改进)
- 使得模型易于训练,并且能够达到Two-stage近似的效果同时,提升了速度
- (这种通过Feature Map中的某一个点,根据Anchor来encode gt bbox的one-stage检测方法,由RPN产生,也奠定了之后one-stage检测的基础)
Model
- 在骨干网络上加上如下特性形成检测模型:
- Multi-scale feature map:在骨干网络的背后接上一个检测头部,并融合了多尺度的信息
- 每个尺度下通过一个 p ∗ c ∗ ( 3 ∗ 3 ) p * c * (3 * 3) p∗c∗(3∗3)的卷积层,输出p维的feature map(这个feature map是多尺度的)
- Default Map(anchor):实际上就是给每个输出Feature Map K个先验值,一个输出Feature Map有 ( m , n , k ∗ ( 4 + c l s ) (m, n, k * (4+cls) (m,n,k∗(4+cls) 的维度。这里跟Faster RCNN不同的是,将Anchor应用到了多个scale中
- GT匹配准则
- 对于一个GT,首先找到和他IOU最大的anchor,并将该具体匹配到这个anchor上
- 此外,anchor & IOU > 0.5就认为是该类别的positive,所以一个anchor box可以被分到多个类别。这样做使得训练更容易,均衡了正负样本,并且一个样本可以有很多个类别,学习变得更简单
Loss
- 注意:单个图片中,总的Loss的归一化系数是正样本的个数!如果没有正样本,Loss = 0,意味着这张图不参与训练,换句话说 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) = 1/N (L_{conf}(x,c) + \alpha L_{loc}(x,l,g)) L(x,c,l,g)=1/N(Lconf(x,c)+αLloc(x,l,g))
- L l o c ( x , l , g ) ) L_{loc}(x,l,g)) Lloc(x,l,g))只针对正样本,具体通过对数的形式回归bbox的宽高,通过线性的方式回归bbox的中心点,通过smooth L1作为Loss
- L c o n f ( x , c ) L_{conf}(x,c) Lconf(x,c)针对正样本&负样本,用的是softmax Loss
Anchor的选取
- 首先,SSD的multi-scale包括6个scale的输出
- 每个scale下给定正方形anchor(aspect ratio = 1)的最小边长 s m i n s_{min} smin,最大边长 s m a x s m i n \sqrt{s_{max}s_{min}} smaxsmin
- 每个scale下给定若干个aspect ratio a r a_r ar。(正方形)是一个aspect ratio的特例。一个 a r a_r ar对应2个defatult,长宽分别为 ( a r ⋅ s m i n , 1 / a r ⋅ s m i n ) (\sqrt{a_r} \cdot s_{min}, 1/\sqrt{a_r} \cdot s_{min}) (ar⋅smin,1/ar⋅smin), ( 1 / a r ⋅ s m i n , a r ⋅ s m i n ) (1/\sqrt{a_r} \cdot s_{min}, \sqrt{a_r} \cdot s_{min}) (1/ar⋅smin,ar⋅smin)。 a r a_r ar的取值,除1以外: ( 2 , 3 ) (2,3) (2,3)。总之,一个非1的 a r a_r ar能够生成2个长方形,如果有取了3个aspect ratio(1,2,3),能够得到6个default box
- 每个scale下对应的 s m i n s_{min} smin与 s m a x s_{max} smax具体数值如下表:
layer name | s m i n s_{min} smin | s m a x s_{max} smax |
---|---|---|
conv4_3 | 30 | 60 |
fc7 | 60 | 111 |
conv6_2 | 111 | 162 |
conv7_2 | 162 | 213 |
conv8_2 | 213 | 264 |
conv9_2 | 264 | 315 |
数据增广
-
可参考:https://blog.youkuaiyun.com/mzpmzk/article/details/100161187
-
整体来说包括3部:
- 执行亮度,对比度等像素内容变换
- 图像扩展:将原图“镶嵌”在一个更大的画布中(画布的大小可能是原图的1-4倍),画布中镶嵌的位置是随机的
- 从大画布中裁出一块ROI,并调整相应的GT BBox
- 将ROI resize 到(300, 300)
-
上述ROI的选取:
- 可以是原图(也就是不做图像扩展)
- 随机裁剪一个ROI(宽和高的大小至少是原图的0.3倍,宽高比在0.5~2之间)
- 随机裁剪一个ROI(宽和高的大小至少是原图的0.3倍,宽高比在0.5~2之间,这个ROI和任意BBox的IOU分别在0.1或0.3或0.5或0.7或0.9)
- 综上,总共有7种等可能性结果
- 将7种等可能性结果取其中的一种:
- 如果是原图的话,就返回图像扩展前的结果
- 如果是随机ROI,需要保证任一bbox的中心在ROI中,尝试N次,如果N次都得到结果,则返回原图
- 如果是带IoU的ROI,则需要保证IoU大于特定的阈值,尝试N次,如果N次都得到结果,则返回原图