SSD详解(一)

原文链接:http://www.360doc.com/content/18/0117/15/52120682_722711493.shtml

SSD github : https://github.com/weiliu89/caffe/tree/ssd

SSD paper : https://arxiv.org/abs/1512.02325



图1

缩进SSD,全称Single Shot MultiBox Detector,是Wei Liu在ECCV 2016上提出的一种目标检测算法,截至目前是主要的检测框架之一,相比Faster RCNN有明显的速度优势,相比YOLO又有明显的mAP优势(不过已经被CVPR 2017的YOLO9000超越)。SSD具有如下主要特点:

  1. 从YOLO中继承了将detection转化为regression的思路,同时一次即可完成网络训练
  2. 基于Faster RCNN中的anchor,提出了相似的prior box;
  3. 加入基于特征金字塔(Pyramidal Feature Hierarchy)的检测方式,相当于半个FPN思路

本文接下来都以SSD 300为例进行分析。


1 SSD网络结构

图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,在多个featuremaps上同时进行softmax分类和位置回归,如图3。

图3 单层feature map预测和特征金字塔预测对比


2 Prior Box

缩进在SSD中引入了Prior Box,实际上与anchor非常类似,就是一些目标的预选框,后续通过softmax分类+bounding box regression获得真实目标的位置。SSD按照如下规则生成prior box:

  • 以feature map上每个点的中点为中心(offset=0.5),生成一些列同心的prior box(然后中心点的坐标会乘以step,相当于从feature map位置映射回原图位置)
  • 正方形prior box最小边长为,最大边长为:
  • 每在prototxt设置一个aspect ratio,会生成2个长方形,长宽为: 和 

图4 prior box

  • 而每个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,但是在SSD300中prior box设置并不能和paper中上述公式对应:

 min_sizemax_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定义如下:

  1. layer {  
  2.   name: "conv4_3_norm_mbox_priorbox"  
  3.   type: "PriorBox"  
  4.   bottom: "conv4_3_norm"  
  5.   bottom: "data"  
  6.   top: "conv4_3_norm_mbox_priorbox"  
  7.   prior_box_param {  
  8.     min_size: 30.0  
  9.     max_size: 60.0  
  10.     aspect_ratio: 2  
  11.     flip: true  
  12.     clip: false  
  13.     variance: 0.1  
  14.     variance: 0.1  
  15.     variance: 0.2  
  16.     variance: 0.2  
  17.     step: 8  
  18.     offset: 0.5  
  19.   }  
  20. }  

知道了priorbox如何产生,接下来分析prior box如何使用。这里以conv4_3为例进行分析。

图5

从图5可以看到,在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],参考FasterRCNN 2.5节)
  • 生成了[1, 2, 4*num_priorbox]大小的prior box blob,其中2个channel分别存储prior box的4个点坐标和对应的4个variance

缩进后续通过softmax分类+bounding box regression即可从priox box中预测到目标,熟悉Faster RCNN的读者应该对上述过程应该并不陌生。其实pribox box的与Faster RCNN中的anchor非常类似,都是目标的预设框,没有本质的差异。区别是每个位置的prior box一般是4~6个,少于Faster RCNN默认的9个anchor;同时prior box是设置在不同尺度的featuremaps上的,而且大小不同。

缩进还有一个细节就是上面prototxt中的4个variance,这实际上是一种bounding regression中的权重。在图4线路(2)中,网络输出[dxmin,dymin,dxmax,dymax],即对应下面代码中bbox;然后利用如下方法进行针对prior box的位置回归:

  1. decode_bbox->set_xmin(  
  2.     prior_bbox.xmin() + prior_variance[0] * bbox.xmin() * prior_width);  
  3. decode_bbox->set_ymin(  
  4.     prior_bbox.ymin() + prior_variance[1] * bbox.ymin() * prior_height);  
  5. decode_bbox->set_xmax(  
  6.     prior_bbox.xmax() + prior_variance[2] * bbox.xmax() * prior_width);  
  7. decode_bbox->set_ymax(  
  8.     prior_bbox.ymax() + prior_variance[3] * bbox.ymax() * prior_height);  

上述代码可以在SSD box_utils.cpp的void DecodeBBox()函数见到。


3 Permute,Flatten And Concat Layers

图6

缩进上一节以conv4_3 feature map分析了如何检测到目标的真实位置,但是SSD 300是使用包括conv4_3在内的共计6个feature maps一同检测出最终目标的。在网络运行的时候显然不能像图6一样:一个feature map单独计算一次softmax socre+box regression,否则训练时如何匹配ground truth都是问题。那么多个feature maps如何协同工作?这时候就要用到Permute,Flatten和Concat这3种层了。其中conv4_3_norm_conf_perm的prototxt定义如下:

  1. layer {  
  2.   name: "conv4_3_norm_mbox_conf_perm"  
  3.   type: "Permute"  
  4.   bottom: "conv4_3_norm_mbox_conf"  
  5.   top: "conv4_3_norm_mbox_conf_perm"  
  6.   permute_param {  
  7.     order: 0  
  8.     order: 2  
  9.     order: 3  
  10.     order: 1  
  11.   }  
  12. }  

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变化(其他层类似,考虑到图片大小没有画出来,请脑补)。

  • 对于conv4_3 feature map,conv4_3_norm_priorbox(priorbox层)设置了每个点共有4个prior box。由于SSD 300共有21个分类,所以conv4_3_norm_mbox_conf的channel值为num_priorbox * num_class = 4 * 21 = 84;而每个prior box都要回归出4个位置变换量,所以conv4_3_norm_mbox_loc的caffe blob channel值为4 * 4 = 16。
  • fc7每个点有6个prior box,其他feature map同理。
  • 经过一系列图7展示的caffe blob shape变化后,最后拼接成mbox_conf和mbox_loc。而mbox_conf后接reshape,再进行softmax(为何在softmax前进行reshape,Faster RCNN有提及)。
  • 最后这些值输出detection_out_layer,获得检测结果

4 SSD网络结构优劣分析

缩进SSD算法的优点应该很明显:运行速度可以和YOLO媲美,检测精度可以和Faster RCNN媲美。除此之外,还有一些鸡毛蒜皮的优点,不解释了。这里谈谈缺点:

  1. 需要人工设置prior box的min_size,max_size和aspect_ratio值。网络中prior box的基础大小和形状不能直接通过学习获得,而是需要手工设置。而网络中每一层feature使用的prior box大小和形状恰好都不一样,导致调试过程非常依赖经验。
  2. 虽然采用了pyramdial feature hierarchy的思路,但是对小目标的recall依然一般,并没有达到碾压Faster RCNN的级别。作者认为,这是由于SSD使用conv4_3低级feature去检测小目标,而低级特征卷积层数少,存在特征提取不充分的问题。


5 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是典型的softmaxloss:


其中代表第i个prior box匹配到了第j个class为p类别的GT box;而location loss是典型的smooth L1 loss:

Matching strategy:

缩进在训练时,groundtruth boxes 与 default boxes(就是prior boxes) 按照如下方式进行配对:

  • 首先,寻找与每一个ground truth box有最大的jaccard overlap的default box,这样就能保证每一个groundtruth box与唯一的一个default box对应起来。
  • SSD之后又将剩余还没有配对的default box与任意一个groundtruth box尝试配对,只要两者之间的jaccard overlap大于阈值,就认为match(SSD 300 阈值为0.5,另外所谓的jaccard overlap就是IoU,如图8)。
  • 显然配对到GT的default box就是positive,没有配对到GT的default box就是negative。

图8 jaccard overlap

Hard negative mining:
缩进值得注意的是,一般情况下negative default boxes数量>>positive default boxes数量,直接训练会导致网络过于重视负样本,从而loss不稳定。所以需要采取:
  • 所以SSD在训练时会依据confidience score排序default box,挑选其中confidience高的box进行训练,控制positive:negative=1:3

Data augmentation:

缩进数据增广,即每一张训练图像,随机的进行如下几种选择:

  • 使用原始的图像
  • 采样一个 patch,与物体之间最小的 jaccard overlap 为:0.1,0.3,0.5,0.7 或 0.9
  • 随机的采样一个 patch
采样的 patch 是原始图像大小比例是[0.1,1],aspect ratio在1/2与2之间。当 groundtruth box 的 中心(center)在采样的patch中时,保留重叠部分。在这些采样步骤之后,每一个采样的patch被resize到固定的大小,并且以0.5的概率随机的 水平翻转(horizontally flipped)。


其实Matching strategy,Hard negative mining,Data augmentation,都是为了加快网络收敛而设计的。尤其是Data augmentation,翻来覆去的randomly crop,保证每一个prior box都获得充分训练而已。

### 回答1: MobileNet-SSD是一种轻量级的目标检测模型,结合了MobileNet和SSD两种技术。MobileNet是一种基于深度卷积神经网络的轻量级模型,它通过使用深度可分离卷积代替传统的卷积操作,减少了模型的参数量和计算量,从而实现了在计算资源有限情况下高效地进行目标检测。 MobileNet-SSD中的SSD(Single Shot MultiBox Detector)是一种单阶段的目标检测算法,它通过在不同尺度的特征图上进行预测,实现多尺度目标检测。SSD可以通过多个卷积层提取不同尺度的特征,并在每个尺度上进行目标预测,这样既可以检测出小尺寸目标又可以检测出大尺寸目标,提高了检测的准确性。 MobileNet-SSD的整体架构由MobileNet作为特征提取网络,然后通过一系列卷积层及其对应的预测层来获取不同尺度的目标检测结果。它可以检测出多个目标类别,并对每个目标框进行位置和类别的预测。 MobileNet-SSD的设计使得它适用于资源有限的设备,如移动设备和嵌入式系统。相比于其他目标检测模型,MobileNet-SSD在保持较高检测准确度的同时,参数量和计算量大幅减少。这使得它在实际应用中能够更快速地进行目标检测,满足实时性要求。 总之,MobileNet-SSD是一种结合了MobileNet和SSD的轻量级目标检测模型,通过使用深度可分离卷积和多尺度预测的方法,实现在计算资源有限情况下高效准确地进行目标检测。它在移动设备和嵌入式系统上具有广泛的应用前景。 ### 回答2: MobileNet-SSD是一种轻量级的目标检测算法,其中MobileNet是一个针对移动设备优化的深度卷积神经网络,而SSD是单发多框架检测器(Single Shot MultiBox Detector)的简称。 MobileNet是由Google提出的,它使用了深度可分离卷积来减少参数数量和计算量,从而在保持准确性的同时大大降低了模型的大小和运行时间。MobileNet具有两个重要的特点:1)深度可分离卷积将标准卷积分为深度卷积和逐点卷积,从而降低了计算量和参数数量;2)可通过调整网络的宽度乘数和分辨率乘数来实现不同大小和精度的模型。 而SSD是一种基于卷积神经网络的目标检测算法,它将目标检测任务转化为一个多尺度特征图上的回归和分类问题。SSD采用了一系列卷积层和特征融合来获取不同尺度的特征图,并通过预定义的锚框来进行目标检测和定位。 MobileNet-SSD是将MobileNet作为特征提取器,与SSD结合起来进行目标检测的方法。它继承了MobileNet的轻量级特点,在保持较高的检测准确性的同时,显著减少了计算量和模型大小。MobileNet-SSD不仅适用于移动设备,还可以应用于嵌入式系统和其他资源有限的环境中。 总结来说,MobileNet-SSD是一种轻量级的目标检测算法,它通过结合MobileNet和SSD来实现高效准确的目标检测,适用于移动设备和资源有限的环境。该算法在多个目标检测数据集上都取得了较好的检测性能,对于实际应用中对模型大小和计算时间有限制的场景,具有重要的实用价值。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值