论文地址:Single Shot MultiBox Detector
github :代码
SSD300 网络结构:
目标检测两大类:
two-stage: 产生稀疏的候选框,然后对候选框进行分类和回归。优点在于精准,但是速度欠缺。
one-stage:均匀在图片不同位置上进行密集抽样,抽样可以采用不同的尺度和宽高,然后提取特征进行分类和回归。优点是速度快,但是均匀密集采样的缺点是训练难,主要是因为正负样本分布不均衡(使用FocalLoss)。
多尺度 + 先验框(anchor)预测
MultiBox预测,提取不同尺度的特征图,大尺度的特征图(浅层特征)检测小物体,小尺度的特征图(深层特征)检测大物体。
不同尺度上先验框的分布是不一样的。如上图,大尺度的先验框负责预测小物体(猫),而小尺度的先验框负责预测大物体(狗)。
相对于yolo,SSD对每一个先验框输出一套独立的检测值。对于一个bounding box 输出两个部分:
1 、类别预测:c+1 个类别的置信度,多了一个背景类。第一置信度指是否含有目标或者说是背景的概率。当第一个置信度值最高时,表示是背景,表示bbox 并不包含目标。
2、bbox 回归:类似faster rcnn,
预测值:gA=(dx,dy,dw,dh)
预测编码:
dx=(xc−axc)/aw
dy=(yc−ayc)/ah
dw=log(w/aw)
dh=log(h/ah)
希望网络学习到的参数能让预测值尽可能符合预测编码的过程,这样通过预测后解码得到预测值。那么就要在网络学习的过程中让预测编码尽可能接近真值编码。
先验框生成规则
1、以feature map上每个点的中点为中心,生成一些列同心的prior box
2、正方形prior box最小边长为和最大边长为:
min_size, sqrt(min_size * max_size)
3、设置 aspect ratio, 生成2个 anchor, 长宽为:
sqrt(aspect_ratio) * min_size
1/sqrt(aspect_ratio) * min_size
min_size 和 max_size 选取:
每个feature map对应prior box的min_size和max_size由以下公式决定:
m 为 feature map 的个数。如原文为 6 。s_min , s_max 为超参数。原文设定 s_min = 0.2, s_max = 0.9。例如 k = 2 时:
这个公式给出了每一层的预测的s_k。同时确保了下一层的min_size等于上一层的max_size。
SSD 缺点:
虽然采用了pyramdial feature hierarchy的思路,但是对小目标的recall依然一般,并没有达到碾压Faster RCNN的级别。作者认为,这是由于SSD使用conv4_3低级feature去检测小目标,而低级特征卷积层数少,存在特征提取不充分的问题。
SSD训练过程
1、loss
N 是匹配到GT的prior box 数量。SSD 中 confidence loss 是典型的softmax loss。
代表第i个prior box匹配到了第j个class为p类别的GT box;而location loss是典型的smooth L1 。
2、负责预测匹配策略:
groundtruth boxes 与 prior boxes 按照如下方式进行配对:
1、找到每一个gt box 有最大IOU的prior box。保证每一个gt box 与唯一一个prior box 对应。一定要有prior box 负责预测gt box,不能落下。
2、对于与任意一个gt box IOU都不是最大的prior box, 通过阈值决定是否匹配。对于IOU > 0.5 认为是positive,小于 0.5 的为negtive,这里没有ignore类。
3、Hard negative mining
一般情况下negative default boxes数量>>positive default boxes数量,直接训练会导致网络过于重视负样本,从而loss不稳定。所以需要采取
所以SSD在训练时会依据confidience score排序default box,挑选其中confidence高的box进行训练,使得: