【目标检测】SSD: Single Shot MultiBox Detector
论文
SSD
SSD是在YOLO之后出的一个single stage的检测模型,精度与Faster R-CNN相当,但速度可以达到59FPS。
SSD的模型架构
特征提取
采用VGG-16提取特征,将两个全连接层换成了两个卷积层,并在后面额外增加了4组共计8个卷积层(每一组都是1×1卷积接3×3卷积),这样得到了多个尺度不同的特征图。
anchors生成
anchor在原文中称为default box
特征图上每一个格子称为cell,在特征图每一个cell中设置大小形状不同的anchor。假设特征图大小是 m×n×c,每个cell中设置anchor的个数是k,那么这个特征图产生的anchor的总个数是 m⋅n⋅k。
例如这个8×8的特征图,每个cell设置3个anchor,那么总的anchor个数是8×8×3=192
不同尺寸的特征图上anchor的感受野不一样,为了充分利用提取出来的特征,保证大物体和小物体都能得到好的检测效果,再不同的feature maps上生成anchor。
层 | 特征图大小 | cell中anchor个数 | anchor总个数 |
---|---|---|---|
conv4_3 | 38*38 | 4 | 5776 |
conv7 | 19*19 | 6 | 2166 |
conv8_2 | 10*10 | 6 | 600 |
conv9_2 | 5*5 | 6 | 150 |
conv10_2 | 3*3 | 4 | 36 |
conv11_2 | 1*1 | 4 | 4 |
总计共生成8732个anchors。相比于YOLO 7×7×2=49,多出了很多,所以能解决YOLO召回率低的问题。
预测
对每一个anchor,要预测4个位置变换参数(anchor相对于gt box应该进行的变换参数)和C个类别概率。总共(C+4)个参数。二者都是通过一个 3∗3的卷积来完成,如下图所示。
假设特征图大小5×5,anchor数为3。因此总共anchor数为75;在预测位置变换参数的分支上,每个cell需要预测4×3(3指anchor个数)个参数;在预测类别概率上,每个cell需要预测21×3的参数(21为类别,3为anchor数)
对类别参数取softmax函数,就能得到每个anchor哪个类别概率最大以及概率具体的值。
非极大值抑制
根据生成的预测结果,执行非极大值抑制算法,就能得到预测结果。
训练
匹配策略
训练的时候要为生成的anchor指定gt,由于生成的anchor很多,但真正和gt有大部分重叠的只是一小部分。对于和gt有较大重叠部分的,训练的时候更容易回归到gt的位置。在为anchor指定gt的时候,流程如下
- 首先,对每一个gt,找到与之IoU最大的anchor,设定该anchor的gt;
由于生成的anchor很多,gt很少,这样正样本数目仍然很少,因此执行第二个原则。
- 其次,对于剩下每一个anchor,找到与其IoU最大的gt,若IoU大于0.5,则将该anchor的目标定为该gt。注意!一个anchor只能对应一个gt,而一个gt可以对应多个anchor。标记该anchor为正样本
- 最后,由于这样正样本的数目还是远少于负样本数目,因此在计算损失时要限制负样本的数目。选取背景置信度较小(置信度误差较大)的负样本,使得正负样本数目在1:3左右。
损失函数
损失函数包含置信度损失和位置损失:
L(x,c,l,g)=N1(Lconf(x,c)+αLloc(x,l,g))
- c 置信度
- l预测框体
- g实际框体
- N正样本数目
先看位置损失:
Lloc(x,l,g)=i∈Pos∑Nm∈{cx,cy,w,h}∑xijksmoothL1(lim−g^jm)
计算所有正样本和它对应gt的损失,损失共有四项,框体的中心坐标(x,y)和宽高。这里并不是预测他们实际的值,而是预测相对于anchor的变换参数。变换方法如下:
g^jcx=(gjcx−dicx)/diwg^jcy=(gjcy−dicy)/dihg^jw=log(diwgjw)g^jh=log(dihgjh)
再看置信度损失:
Lconf(x,c)=−i∈Pos∑Nxijplog(c^ip)−i∈Neg∑log(c^i0) where c^ip=∑pexp(cip)exp(cip)
置信度损失正样本和负样本都要计算。式中的 p指正样本对应的类别,0指的是背景类。
anchor尺寸和形状的选取
先看大小:
在不同的features maps上设置的anchor大小不一样。越浅层的feature maps,anchor越小。设置方式如下:
sk=smin+m−1smax−smin(k−1),k∈[1,m]
smin=0.2,smax=0.9。s指相对于feature maps的缩放系数。
再看形状:宽高的比例有5种: ar∈1,2,3,21,31。因此就能计算出宽和高的值: wka=skar,hka=sk/ar。
最后计算anchor中心坐标: x=∣fk∣i+0.5,y=∣fk∣j+0.5, 其中 fk是特征图的大小, i,j是anchor所在cell对应在特征图上的位置, 0.5是为了将中心设置在cell中心。
数据增强的方法
- 直接输入原图
- 在原图上采样patch(与原图的比例为[0.1,0.9],aspect ratio为[0.5,2]),patch与目标的最小IoU为[0.1,0.3,0.5,0.7,0.9]。
实验结论
- 数据增强很重要
- anchor形状越多越好
- 使用空洞卷积更快
- 使用不同尺度的特征图,能提高精度