借鉴YOLO:直接回归bbox和分类概率;
借鉴Faster R-CNN:使用anchor提升识别准确度;
借鉴FPN:加入金字塔的检测方式;
结合两者优点,提高速度上超过YOLO,精度上与Faster R-CNN媲美;
采用VGG19提取卷积特征,在后面添加一系列卷积层,进行多尺度检测,低层特征保留图像的细节信息,用于检测较小的目标,高层特征用于检测较大的目标。如下图所示:
在base network基础上添加辅助结构:
1. 多尺度预测:在base network后,添加一些卷积层,这些层的大小逐渐减小,可以进行多尺度预测
2. 在特征图上预测: 在特征图的每个位置预测K个box。对于每个box,预测C个类别得分,以及相对于default bounding box的4个偏移值,这样需要(C+4)*k个预测器,在m*n的特征图上将产生(C+4)*k*m*n个预测值。这里,default bounding box类似于FasterRCNN中anchors。
而SSD采用了特征金字塔结构进行检测,即检测时利用了conv4-3,conv-7(FC7),conv6-2,conv7-2,conv8_2,conv9_2这些大小不同的feature maps,在多个feature maps上同时进行softmax分类和位置回归。
SSD在不同的特征层中考虑不同的尺度,RPN在一个特征层考虑不同的尺度。
作为一些目标的候选框,后续通过softmax分类+bounding box regression获得真实目标的位置。
生成规则:以feature map上每个点的中点为中心(offset=0.5),生成一些列同心的prior box(然后中心点的坐标会乘以step,相当于从feature map位置映射回原图位置)
正方形:最小正方形:min_size,最大正方形边长:
长方形:对于每个aspect ratio,生成2个长方形,长宽分别为 和
其中:m是使用feature map的数量;
第一层feature map对应的min_size=S1,max_size=S2;第二层min_size=S2,max_size=S3;其他类推。在原文中,Smin=0.2,Smax=0.9。
采用不同的aspect ratios:{1,2,3,1/2,1/3}
在conv4_3 feature map网络pipeline分为了3条线路:
1. 经过一次batch norm+一次卷积后,生成了[1, num_class*num_priorbox, layer_height, layer_width]大小的feature用于softmax分类目标和非目标(其中num_class是目标类别,SSD 300中num_class = 21)。
2. 经过一次batch norm+一次卷积后,生成了[1, 4*num_priorbox, layer_height, layer_width]大小的feature用于bounding box regression(即每个点一组[dxmin,dymin,dxmax,dymax]。
3. 生成了[1, 2, 4*num_priorbox]大小的prior box blob,其中2个channel分别存储prior box的4个点坐标和对应的4个variance
还有一个细节就是上面prototxt中的4个variance,这实际上是一种bounding regression中的权重。在图4线路(2)中,网络输出[dxmin,dymin,dxmax,dymax],即对应下面代码中bbox;
decode_bbox->set_xmin(
prior_bbox.xmin() + prior_variance[0] * bbox.xmin() * prior_width);
decode_bbox->set_ymin(
prior_bbox.ymin() + prior_variance[1] * bbox.ymin() * prior_height);
decode_bbox->set_xmax(
prior_bbox.xmax() + prior_variance[2] * bbox.xmax() * prior_width);
decode_bbox->set_ymax(
prior_bbox.ymax() + prior_variance[3] * bbox.ymax() * prior_height);
综合6个featuremap的结果:使用Permute,Flatten和Concat层进行计算,计算方式如下:交换维度->展开->连接
作用:交换数据维度
bottom blob = [batch_num, channel, height, width]
top blob = [batch_num, height, width, channel]
作用:将四维展开成两维;
bottom blob = [batch_num, height, width, channel]
top blob = [batch_num, height*width*channel]
优点:运行速度可以和YOLO媲美,检测精度可以和Faster RCNN媲美。
缺点:
1. 需要人工设置prior box的参数(min_size,max_size和aspect_ratio)。网络中prior
box的基础大小和形状不能直接通过学习获得,而是需要手工设置。而网络中每一层feature使用的prior
box大小和形状恰好都不一样,导致调试过程非常依赖经验。
2. 对小目标的recall一般。虽然采用了pyramdial feature hierarchy的思路,但是对小目标的recall依然一般,并没有达到碾压Faster RCNN的级别。作者认为,这是由于SSD使用conv4_3低级feature去检测小目标,而低级特征卷积层数少,存在特征提取不充分的问题。
CNN目标检测(三):SSD详解