标题:SSD: Single Shot MultiBox Detector
作者:Liu Wei等
链接:https://arxiv.org/abs/1512.02325
摘要:
本文的核心内容:
- 在推断过程中,SSD减少了重采样的操作。相比于YOLOv1,SSD更快更精确;相比于Faster RCNN,SSD精确度相同,速度明显更快。
- 在feature map上使用小卷积核,生成bounding box和类别打分。
- 在不同放大尺度下的feature map上生成预测,从而提高精度。
- 端到端训练,对低分辨率的图片效果也很好。
模型
根据 https://github.com/pytorch/vision/blob/master/torchvision/models/vgg.py ,vgg16有13个卷积层,以
224
×
224
224\times224
224×224的图片作为输入,每个卷积层的输出feature map的shape如下:
将输入换做本文中的
300
×
300
300\times300
300×300,则上图中最后一个卷积层中
14
×
14
14\times14
14×14的feature map相应变成
19
×
19
19\times19
19×19,增加一些卷积层(extra feature layer),直到降采样为
1
×
1
1\times1
1×1,这也就解释了论文中的模型图:
然而这个图和作者给出的代码之间有两个个区别:一是这里用conv6和conv7代替vgg的全连接层,然而代码中采用了和后面相似的两层结构conv6_1、conv6_2和conv7_1、conv7_2。二是文中添加层的通道数和代码也不一样。这两个问题还需要明确一下。
在分析检测机制之前,需要明确几个概念:
feature map cell/location:不同于yolo中的grid cell,文中会提到 m × n m\times n m×n,这里指的是各feature map的size,所以论文图中会提到每个类有8732( = 38 × 38 × 4 + 19 × 19 × 6 + 10 × 10 × 6 + 5 × 5 × 6 + 3 × 3 × 4 + 1 × 1 × 4 =38\times 38\times 4+19\times 19\times 6+10\times 10\times 6+5\times 5\times 6+3\times 3\times 4+1\times 1\times 4 =38×38×4+19×19×6+10×10×6+5×5×6+3×3×4+1×1×4)个defaul box
default box:在每个cell处选取的候选框,类比于anchor
feature layer:卷积层
jaccard overlap:交并比,IoU
这样我们就能明白这段话了:
得到的default box通过阈值筛选后,使用非极大抑制得到一个最优的bounding box。
训练过程
- 匹配机制
首先,作者尝试了用IoU(jaccard overlap)最大的default box匹配ground truth;后来简化为设置threshold,对于每个default box,如果和某个gt的IoU达到threshold,则保留该gb,从而实现重叠预测。 - loss
SSD的loss由定位loss和置信loss两部分组成。
定位loss中,对于每个匹配到gt的db,用相应的 c x , c y , w , h cx, cy, w, h cx,cy,w,h分别计算 s m o o t h L 1 smooth_{L1} smoothL1。
置信loss是个多分类下的softmax:
- 类别不平衡的解决
由于db中只有很小一部分会和gt进行匹配,所以positive和negtive会出现大量的不平衡。所以在训练过程中选取negtive的db中置信loss最高的一些,从而保证 p o s : n e g pos:neg pos:neg在 1 : 3 1:3 1:3。 - 跨层提取和数据增强比较常见,这里不再展开。