SSD: The Single Shot Detector
- 比YOLO: You Only Look Once 还要快,还要精确。保证速度的同时,其结果的 mAP 可与使用 region proposals 技术的方法(如 Faster R-CNN)相媲美。
- 为了得到高精度的检测结果,在不同层次的 feature maps 上去 predict object、box offsets,同时,还得到不同 aspect ratio 的 predictions。
- 能够在当输入分辨率较低的图像时,保证检测的精度。同时,这个整体 end-to-end 的设计,训练也变得简单。在检测速度、检测精度之间取得较好的 trade-off。
基本网络-VGG-16
Layer name |
"图像"规格 |
input |
3x300x300 |
conv1_1 (3*3 s1 p1) |
64x300x300 |
conv1_2(3*3 s1 p1) |
64x300x300 |
pool_1 (3*3 s1 p1) |
64x150x150 |
conv2_1 (3*3 s1 p1) |
128x150x150 |
conv2_2(3*3 s1 p1) |
128x150x150 |
pool_2(3*3 s1 p1) |
128x75x75 |
conv3_1(3*3 s1 p1) |
256x75x75 |
conv3_2(3*3 s1 p1) |
256x75x75 |
conv3_3(3*3 s1 p1) |
256x75x75 |
pool_3(3*3 s1 p1) |
256x38x38 |
conv4_1(3*3 s1 p1) |
512x38x38 |
conv4_2(3*3 s1 p1) |
512x38x38 |
conv4_3(3*3 s1 p1) |
512x38x38 |
pool_4(3*3 s1 p1) |
512x19x19 |
conv5_1(3*3 s1 p1) |
512x19x19 |
conv5_2(3*3 s1 p1) |
512x19x19 |
conv5_3(3*3 s1 p1) |
512x19x19 |
----------- |
VGG昏割线 |
fc6(convolution kernel dilation) (3*3, p6, s1, dilation=6) |
1024x19x19 |
fc7 (1*1 s1 p0) |
1024x19x19 |
conv8_1 (1*1 s1 p0) |
256x19x19 |
conv8_2 (3*3 s2 p1) |
512x10x10 |
conv9_1 (1*1 s1 p0) |
128x10x10 |
conv9_2 (3*3 s2 p1) |
256x5x5 |
conv10_1 (1*1 s1 p0) |
128x5x5 |
conv10_2 (3*3 s2 p1) |
256x3x3 |
conv11_1 (1*1 s1 p0) |
128x3x3 |
conv11_2 (3*3 s2 p1) |
256x1x1 |
YOLO在卷积层后接全连接层,即检测时只利用了最高层feature maps(包括Faster RCNN也是如此);
而SSD采用了特征金字塔结构进行检测,即检测时利用了conv4-3,conv-7(FC7),conv8-2,conv9-2,conv10_2,conv11_2这些大小不同的feature maps,在多个feature maps上同时进行softmax分类和位置回归。
Prior Box
与anchor非常类似,就是一些目标的预选框,后续通过softmax分类+bounding box regression获得真实目标的位置。SSD按照如下规则生成prior box:
- 以feature map上每个点的中点为中心(offset=0.5),生成一些列同心的prior box(然后中心点的坐标会乘以step,相当于从feature map位置映射回原图位置).
-
正方形prior box
最小边长为min_size,
最大边长为sqrt(max_size * min_size).
每在prototxt设置一个aspect ratio,会生成2个长方形:
min_size*sqrt(aspect ratio)
min_size/sqrt(aspect ratio)
每个feature map对应prior box的min_size和max_size由以下公式决定,公式中m是使用feature map的数量(SSD 300中m=6):
第一层feature map对应的min_size=S1,max_size=S2;第二层min_size=S2,max_size=S3;其他类推。在原文中,Smin=0.2,Smax=0.9,但是在SSD 300中prior box设置并不能和paper中上述公式对应
|
min_size |
max_size |
conv4_3 |
30 |
60 |
fc7 |
60 |
111 |
conv6_2 |
111 |
162 |
conv7_2 |
162 |
213 |
conv8_2 |
213 |
264 |
conv9_2 |
264 |
315 |
不过依然可以看出,SSD使用低层feature map检测小目标,使用高层feature map检测大目标
分类和回归网络:
在conv4_3 feature map网络pipeline分为了3条线路:
- 经过一次batch norm+一次卷积后,生成了[1, num_class*num_priorbox, layer_height, layer_width]大小的feature用于softmax分类目标和非目标(其中num_class是目标类别,SSD 300中num_class = 21)
- 经过一次batch norm+一次卷积后,生成了[1, 4*num_priorbox, layer_height, layer_width]大小的feature用于bounding box regression(即每个点一组[dxmin,dymin,dxmax,dymax],参考Faster RCNN 2.5节)
- 生成了[1, 2, 4*num_priorbox]大小的prior box blob,其中2个channel分别存储prior box的4个点坐标和对应的4个variance
prior box的生成基准是在原图上,即min_size和max_size都是相对于原图的。
第3步的第1个输出为prior box的4个点坐标,一般归一化到[0,1],具体操作为原图上生成的xmin,xmax,ymin,ymax分别除以原图的长宽
|
图像规格 |
备注 |
conv4_3 |
N, 512, 38, 38 |
|
conv4_3_norm |
N, 512, 38, 38 |
Scale=20,cross_channel=false |
conv4_3_norm_mbox_loc |
N, 16, 38, 38 |
3*3 s1 p1 |
conv4_3_norm_mbox_loc_perm |
N, 38, 38, 16 |
NCHW->NHWC |
conv4_3_norm_mbox_loc_flat |
N, 38*38*16 |
4个boxid*4个坐标 |
|
图像规格 |
备注 |
conv4_3 |
N, 512, 38, 38 |
|
conv4_3_norm |
N, 512, 38, 38 |
Scale=20,cross_channel=false |
conv4_3_norm_mbox_conf |
N, 84, 38, 38 |
3*3 s1 p1 |
conv4_3_norm_mbox_conf_perm |
N, 38, 38, 84 |
NCHW->NHWC |
conv4_3_norm_mbox_conf_flat |
N, 38*38*84 |
4个boxid*21类(含背景) |
|
图像规格 |
备注 |
conv4_3 |
N, 512, 38, 38 |
|
conv4_3_norm |
N, 512, 38, 38 |
Scale=20,cross_channel=false |
conv4_3_norm_mbox_priorbox |
|
Min_size=30, max_size=60, aspect_rato=2 |
SSD网络结构优劣分析
SSD算法的优点应该很明显:运行速度可以和YOLO媲美,检测精度可以和Faster RCNN媲美。
缺点:
SSD训练过程
对于SSD,虽然paper中指出采用了所谓的“multibox loss”,但是依然可以清晰看到SSD loss分为了confidence loss和location loss两部分,其中N是match到GT(Ground Truth)的prior box数量;而α参数用于调整confidence loss和location loss之间的比例,默认α=1。SSD中的confidence loss是典型的softmax loss:
xijp代表第i个prior box匹配到了第j个class为p类别的GT box;
Hard negative mining:
值得注意的是,一般情况下negative default boxes数量>>positive default boxes数量,直接训练会导致网络过于重视负样本,从而loss不稳定。所以需要采取:
Data augmentation:
数据增广,即每一张训练图像,随机的进行如下几种选择:
采样的 patch 是原始图像大小比例是[0.1,1],aspect ratio在1/2与2之间。当 groundtruth box 的 中心(center)在采样的patch中时,保留重叠部分。在这些采样步骤之后,每一个采样的patch被resize到固定的大小,并且以0.5的概率随机的 水平翻转(horizontally flipped)。
翻来覆去的randomly crop,保证每一个prior box都获得充分训练而已。