原文链接:点击打开链接
SSD使用VGG-16-Atrous作为基础网络,其中黄色部分为在VGG-16基础网络上填加的特征提取层。SSD与yolo不同之处是除了在最终特征图上做目标检测之外,还在之前选取的5个特特征图上进行预测。
SSD图1为SSD网络进行一次预测的示意图,可以看出,检测过程不仅在填加特征图(conv8_2, conv9_2, conv_10_2, pool_11)上进行,为了保证网络对小目标有很好检测效果,检测过程也在基础网络特征图(conv4_3, conv_7)上进行。
注意:图中fc6, fc7名为fc,其实是卷积层。
SSD图2为整个SSD训练网络的结构,由于图像所含层数太多,网络中不能看到每层细节,我重画其中部分层为绿色,作为代表。可以看出,GT标签在分特征图上生成priorbox,即再将所有priobox组合为mbox_priorbox作为所有默认框的真实值。再看预测过程,会在所选取的特征图进行两个 3x3卷积,其中一个输出每个默认框的位置(x, y, w, h)四个值,另一个卷积层输出每个默认框检测到不同类别物体的概率,输出个数为预测类别个数。再将所有的默认框位置整合为mbox_loc,将所有默认框预测类别的向量组合为mbox_conf。mbox_loc、mbox_conf为所有预测默认框,将它与所有默认框的真实值mbox_priorbox进行计算损失,得到mbox_loss。
图中data下方每个priorbox都对应了min_size与max_size,表示不同特征图上的默认框在原图上的最小与最大感受野。关于不同特征图上的min_size与max_size,论文中给出的计算公式,可惜与实现的prototxt中的参数并不对应。
SSD的损失函数如图3所示,由每个默认框的定位损失与分类损失构成。
SSD训练过程中使用的数据增强对网络性能影响很大,大约有6.7%的mAP提升。
(1) 随机剪裁:采样一个片段,使剪裁部分与目标重叠分别为0.1, 0.3, 0.5, 0.7, 0.9,剪裁完resize到固定尺寸。
(2) 以0.5的概率随机水平翻转。
基础网络部分特征图分辨率高,原图中信息更完整,感受野较小,可以用来检测图像中的小目标,这也是SSD相对于YOLO检测小目标的优势所在。增加对基础网络conv4_3的特征图的检测可以使mAP提升4%。
数据集中目标的开关往往各式各样,因此挑选合适形状的默认框能够提高检测效果。作者实验得出使用瘦高与宽扁默认框相对于只使用正方形默认框有2.9%mAP提升。
通常卷积过程中为了使特征图尺寸特征图尺寸保持不变,通过会在边缘打padding,但人为加入的padding值会引入噪声,因此,使用atrous卷积能够在保持感受野不变的条件下,减少padding噪声,关于atrous参考。本文SSD训练过程中并且没有使用atrous卷积,但预训练过程使用的模型为VGG-16-atrous,意味着作者给的预训练模型是使用atrous卷积训练出来的。使用atrous版本VGG-16作为预训模型比较普通VGG-16要提高0.7%mAP。
作者发现SSD对小目标检测效果不好(但也比YOLO要好,因此多特征图检测),这是因为小物体在高层特征图上保留很少的信息,通过增加输入图像的尺寸能够解决对小物体检测效果。
ssd详解
关于atrous
原文链接:点击打开链接
SSD,全称Single Shot MultiBox Detector,是Wei Liu在ECCV 2016上提出的一种目标检测算法,截至目前是主要的检测框架之一,相比Faster RCNN有明显的速度优势,相比YOLO又有明显的mAP优势(不过已经被CVPR 2017的YOLO9000超越)。SSD具有如下主要特点:
本文接下来都以SSD 300为例进行分析。
图2 SSD网络结构(和代码貌似有点差别)
缩进上图2是原论文中的SSD 300网络结构图。可以看到YOLO在卷积层后接全连接层,即检测时只利用了最高层feature maps(包括Faster RCNN也是如此);而SSD采用了特征金字塔结构进行检测,即检测时利用了conv4-3,conv-7(FC7),conv6-2,conv7-2,conv8_2,conv9_2这些大小不同的feature maps,在多个feature maps上同时进行softmax分类和位置回归,如图3。
图3 单层feature map预测和特征金字塔预测对比
缩进在SSD中引入了Prior Box,实际上与anchor非常类似,就是一些目标的预选框,后续通过softmax分类+bounding box regression获得真实目标的位置。SSD按照如下规则生成prior box:
图4 prior box
第一层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检测大目标,这也应该是SSD的突出贡献了。其中SSD 300在conv4_3生成prior box的conv4_3_norm_priorbox层prototxt定义如下:
知道了priorbox如何产生,接下来分析prior box如何使用。这里以conv4_3为例进行分析。
图5
从图5可以看到,在conv4_3 feature map网络pipeline分为了3条线路:
缩进后续通过softmax分类+bounding box regression即可从priox box中预测到目标,熟悉Faster RCNN的读者应该对上述过程应该并不陌生。其实pribox box的与Faster RCNN中的anchor非常类似,都是目标的预设框,没有本质的差异。区别是每个位置的prior box一般是4~6个,少于Faster RCNN默认的9个anchor;同时prior box是设置在不同尺度的feature maps上的,而且大小不同。
缩进还有一个细节就是上面prototxt中的4个variance,这实际上是一种bounding regression中的权重。在图4线路(2)中,网络输出[dxmin,dymin,dxmax,dymax],即对应下面代码中bbox;然后利用如下方法进行针对prior box的位置回归:
上述代码可以在SSD box_utils.cpp的void DecodeBBox()函数见到。
图6
缩进上一节以conv4_3 feature map分析了如何检测到目标的真实位置,但是SSD 300是使用包括conv4_3在内的共计6个feature maps一同检测出最终目标的。在网络运行的时候显然不能像图6一样:一个feature map单独计算一次softmax socre+box regression(虽然原理如此,但是不能如此实现)。那么多个feature maps如何协同工作?这时候就要用到Permute,Flatten和Concat这3种层了。其中conv4_3_norm_conf_perm的prototxt定义如下:
Permute是SSD中自带的层,上面conv4_3_norm_mbox_conf_perm的的定义。Permute相当于交换caffe blob中的数据维度。在正常情况下caffe blob的顺序为:
bottom blob = [batch_num, channel, height, width]
经过conv4_3_norm_mbox_conf_perm后的caffe blob为:
top blob = [batch_num, height, width, channel]
而Flattlen和Concat层都是caffe自带层,请参照caffe official documentation理解。
图7 SSD中部分层caffe blob shape变化
缩进那么接下来以conv4_3和fc7为例分析SSD是如何将不同size的feature map组合在一起进行prediction。图7展示了conv4_3和fc7合并在一起的过程中caffe blob shape变化(其他层类似,考虑到图片大小没有画出来,请脑补)。
缩进SSD算法的优点应该很明显:运行速度可以和YOLO媲美,检测精度可以和Faster RCNN媲美。除此之外,还有一些鸡毛蒜皮的优点,不解释了。这里谈谈缺点:
缩进对于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:
其中代表第i个prior box匹配到了第j个class为p类别的GT box;而location loss是典型的smooth L1 loss:
Matching strategy:
缩进在训练时,groundtruth boxes 与 default boxes(就是prior boxes) 按照如下方式进行配对:
Data augmentation:
缩进数据增广,即每一张训练图像,随机的进行如下几种选择:
其实Matching strategy,Hard negative mining,Data augmentation,都是为了加快网络收敛而设计的。尤其是Data augmentation,翻来覆去的randomly crop,保证每一个prior box都获得充分训练而已。不过当数据达到一定量的时候,不建议再进行Data augmentation,毕竟“真”的数据比“假”数据还是要好很多。