SSD:single shot multibox detector

总体:

      之前的主流的目标检测和识别都是深度学习模型结合区域和高性能分类器共同完成,虽然这种方法有较好的识别精度,但是整个模型需要很高的硬件资源且实时性不好。weiliu的SSD类似于YOLO基于回归的方法,但与之不同的是在其基础上加入了类似于faster rcnn的anchor机制,这相当于在回归的基础上结合一部分区域建议的功能。SSD 将输出一系列离散化的 bounding boxes作为default box,这些 bounding boxes 是在不同层次layers上的 feature maps 上生成的,并且有着不同的aspect ratio和scale。在预测的时候网络会在每个default box 出现的类别(category)打分,并调整box更好的match物体的shape。另外,网络会结合不同不同分辨率的feature map的预测值来更好的处理各种size的物体。SSD相较于需要proposal的方法更简单,因为它完全消除了proposal generation和subsequent pixel或者特征重采样feature resampling阶段,将整个放入单一网络,所有的检测和识别都可用一个网络搞定。基于区域建议的方法由于存在候选区域的提取,使得算法的时间花费很大,实时性比较差,而基于回归的目标检测识别没有候选区域提取的这一步骤,且识别和检测在同一网络里,很容易做到实时

特点:

快且精度较高;

使用小的卷积滤波器预测物体类别和boundingbox的位置offset,在不同的aspect ratio的检测时用不同预测器,并将他们都应用于multiple feature maps从而使检测器能具备多尺度检测。这样的话就可以使用不同layers来预测不同尺度从而使检测器对于低像素的检测精度提高很多,检测速度也很快

算法细节:

如上图,a中SSD训练需要输入图片及每一个物体的ground truth ,b,c两种不同的feature map中不同aspect ratio的一系列default box,我们预测每一个类别conf:c1,c2..Cp的offset:△(cx,cy,w,h),训练的时候我们首先将defau box match到gt boxes,比如我们将default box match到上图的猫和狗,这个就当成positive其余的default box就看成negatives。模型的loss=localization loss(e.g.Smooth L1)+confidence loss(e.g.Softmax).

模型:

  

SSD的方法基于对当前物体boxes的类别实例产生和收集收集一系列固定尺寸的boundingbox 和score,接着通过非最大抑制NMS来产生最终的检测。前端的网络层是基于高性能的图片分类器标准架构(在分类层classification layer前截断),后面再加:

多尺度特征图:

在前段网路层后面加入几层卷积特征层,这些层的size依次减小,允许多尺度的检测器预测,,这些用来预测检测的卷积模型对于不同的特征层是不同的。

卷积预测器

每一个增加的feature layer 或者base network存在的的feature map,会生成一系列固定的大小的predictions,对于一个大小为m×n,具有p通道的特征层,使用的 convolutional filters 就是3×3×p的 kernels。产生的 predictions,那么就是归属类别的一个得分,或者就是相对于 default box coordinate 的 shape offset

Default boxes 和 aspect ratios

每一个 box 相对于与其对应的 feature map cell 的位置是固定的。 在每一个 feature map cell 中,我们要 predict得到的 box与default box之间的offsets,以及每一个 box 中包含物体的 score(每一个类别概率都要计算出)。

如上图,Feature map cell 是小格子 虚线是default box。使用小的卷积滤波器预测物体类别和boundingbox的位置offset,在不同的aspect ratio的检测时用不同预测器,并将他们都应用于multiple feature maps从而使检测器能具备多尺度检测。这样的话就可以使用不同layers来预测不同尺度从而使检测器这样对于低像素的检测精度提高很多,检测速度也很快

需要注意的:

ground truth只是出现在底层,高层没有ground truth,所以小物体检测的语义信息,相对信息差一些。

faster rcnn,yolo,ssd对小目标检测结果都不好,原因在于卷积网络结构的最后一层feature map太小,例如32*32的目标经过vgg后变成2*2,导致之后的检测和回归无法满足要求。SSD使用的VGG16作为特征抽取,SSD中最小尺度的检测是conv4_3的feature map再经过一层卷积输出的,位于整个网络非常靠前的位置。在conv4_3feature map的分辨率已经缩小了8倍,在conv5_3缩小了16倍.比如一个32*32大小的物体,在vgg16 的 conv5_3的feature map 对应仅为2*2. 位置信息有较大的损失.

SSD里负责检测小目标的层为conv4_3(38*38)对应的尺度为0.2(可人为设置)。这就对应了SSD所能检测的尺度大概为0.2上下。在这种情况下,如果物体过于小的话,甚至在训练阶段,GT都没法找到相应的的default box与它匹配,效果怎么可能会好。如果不介意整体检测效果的话,可以把尺度调低,看看对于小目标的检测效果是否有提升。另外,利用多尺度进行检测也能提高小物体的检测效果

目前大概有两种方法可能决绝这个问题:

1. 使用不同层的特征: 比如hyperNet, MultiPath.

2. 保证感受也不缩小的情况下feature map的分辨率不至于缩小太多.这种思路可以考虑采用DeepLab中采用的Hole algorithm.在保证感受野的同时分辨变化较小.

 3.SSD对于高分辨率的底层特征没有再利用,而这些层对于检测小目标很重要。 Feature Pyramid Networks for Object Detection,就很好的解决这个问题。

This is not surprising because those small objects may not even have any information at the very top layers.



你可能感兴趣的:(SSD:single shot multibox detector)