SSD 网络结构
- SSD使用VGG16作为基础网络,上图的黄色部分为在VGG16基础网络上填加的特征提取层。SSD与yolo不同之处是除了在最终特征图上做目标检测之外(conv7),还增加了5个特特征图,对这6个特征图进行预测。也就是说上图的(conv4_3, conv_7)是VGG16的原有结构,(conv8_2, conv9_2, conv_10_2, pool_11)是SSD网络增加的网络增加的网络,最后进入预测环节的是(conv4_3, conv_7) +(conv8_2, conv9_2, conv_10_2, pool_11)。
- 对于一张图片,SSD网络使用(conv8_2, conv9_2, conv_10_2, pool_11)+(conv4_3, conv_7)的特征图进行检测,可以增加小目标被检测的概率。
- 在网络的最后需要对所有的feature map 进行分类和box坐标的预测。这里一共有8732个框如下。
不同层的feature map上面的box数量不一样,怎么计算不同特征图上box的数量,稍后讲解。(下面我会借鉴其他大神的说法prior box =box)
- 对于特征图,特征图的每个点上面会有预测k个box坐标和k个分类值。对于一张m x n的特征图,同一层特征图上每个点的box数量设为为k个(同一层的box数量一样,不在同一层的特征图上每个点的box数量不一样,例如38x38每个点是4个box,19x19每个点是6个box),一共有c个物体类别。则这里一张特征图的网络的输出是:
m * n * k * (c+4)。
SSD的default box开场
按照Faster R-CNN的方法,SSD在feature map上的每个点生成k个default box 。这里可以把点看成是格子。
在每个格子上会有形状大小不同的default box。上图中的8x8的feature map每个格子有4个default box。4x4的feature map每个格子也有4个default box。这里8x8的feature map和4x4的feature map是不同层的特征图。可以看到8x8的特征图匹配到猫,而4x4的feature map匹配到狗,我想是因为8x8特征图的视野较小,狗在图中的占比较大,而4x4特征图的视野较大可以较好的匹配较大的物体。这里也与不同特征层的匹配分工有关。下面会介绍不同特征层的box的大小,就会明白SSD网络为什么把每层网络进行分工,大box会检测大物体,小box会检测小物体。
SSD的default box设置
SSD的default box是我见过最复杂最精巧的box设置。看了论文还是没看懂,就翻翻blog,具体总结以下几点:
- box的数量设置
- box的宽比设置
- box的大小设置
- box的数量设置
38x38 的特征图每个点有4 个prior box
19x19 的特征图每个点有6 个prior box
10x10 的特征图每个点有6 个prior box
5x5 的特征图每个点有6 个prior box
3x3 的特征图每个点有4 个prior box
1x1 的特征图每个点有4 个prior box
box数量共有:
- box的宽比设置
这里截取这位博客的内容,讲解的比较详细。
特征图上的box的特征图大小按如下公式:
sk是box大小的与原图的比例比例,m=6是SSD使用的特征图的数量。
怎么计算特征图的尺寸:
在实现时,Conv4_3,Conv10_2和Conv11_2层仅使用4个先验框,它们不使用长宽比为{3,1/3}的box。
对于输出的坐标还需要进行变化坐标中心(x,y),使每个单元的先验框的中心点分布在各个单元的中心。
- 计算特征图的大小
第一层feature map对应的min_size=S1,max_size=S2;第二层min_size=S2,max_size=S3;其他类推。Smin=0.2,Smax=0.9。
坐标变换
与Faster R-CNN类似,SSD的预测值是经过坐标变换的值,原图片的值需要经过变换。这里说明一下,每个default box时网络在进行预测时在每个feature map上固定的一个窗口,box的坐标与最后的预测值是不一样的,网络最后的预测是相对于box更加精确的一个位置,网络的预测值与box的值其实有变换关系,。更加详细的内容点这里.
SSD的预测在图片上的值:
feature map的box的值:
SSD网络输出值,在标签进行变换用的到:
变换:
超参数variance设置:
训练
由于在进行box提取时,SSD网络提出太多的box(8732个),这么多的box需要进行筛选。才能输出进行最后的输出。
关于8732个box怎么保留,训练和测试的筛选方法不一样。
- 训练时
1.首先,寻找与每一个ground truth box有最大的IOU的default box,这样就能保证每一个groundtruth box与唯一的一个default box对应起来。
2.将剩余还没有配对的default box与任意一个groundtruth box尝试配对,只要两者之间的IOU大于阈值,就认为匹配(阈值为0.5)。
4.采用hard negative mining,就是对负样本进行抽样,抽样时按照置信度误差(预测背景的置信度越小,误差越大)进行降序排列,选取误差的较大的top-k作为训练的负样本,以保证正负样本比例接近1:3。
3.显然配对到groundtruth box的default box就是positive,没有配对到groundtruth box的default box就是negative。
测试
每个预测框,首先根据类别置信度确定其类别(置信度最大者)与置信度值,并过滤掉属于背景的预测框。然后根据置信度阈值(如0.5)过滤掉阈值较低的预测框。
留下的预测框进行解码,根据先验框得到其真实的位置参数(解码后一般还需要做clip,防止预测框位置超出图片)。解码之后,一般需要根据置信度进行降序排列,然后仅保留top-k(如400)个预测框。最后就是进行NMS算法,过滤掉那些重叠度较大的预测框。最后剩余的预测框就是检测结果了。
Loss 计算图:
网络在最后一层汇集了所有的box的预测值,shape=8372 *(4+C),对box进行筛选之后可以进行训练,总的损失由每个默认框的定位损失与分类损失构成。
需要对标签的坐标进行变换。
若设置variance_encoded_in_target=True,编码时要加上variance: