Caffe框架下SSD算法源码综述

版权声明:本文为博主原创文章,转载请注明出处:https://blog.csdn.net/qq_31261509 https://blog.csdn.net/qq_31261509/article/details/83376668

ssd源码相比于caffe架构主要添加了flatten,normal,prior,detection,multibox等层,其中最重要的难点是multibox层和multibox,通过学习ssd源码可以更加深刻的了解ssd的使用原理.而源码链接为:ssd算法源码



ssd算法架构综述

本文讲解ssd源码,所以不介绍ssd的理论知识


  • ssd算法的损失函数由两部分组成:一个类别预测,一个位置的线性回归。它们对应的前向传播层能够在网络结构文件中找到norm_mbox_conf层和norm_mbox_loc层,这些层也实现了反向传播用于计算预测类别损失以及位置回归损失。

  • 通过网络结构能够发现还有一个前向传播的分支为mbox_priorbox层,奇怪的是此层没有反向传播,其实这层仅仅是计算norm_mbox_loc对应于原图的大小,有了mbox_priorbox层来获取原图的比例,norm_mbox_loc就能够通过比例来计算出所处于原图具体的什么位置了。

  • ssd中的难点理解主要是detection_output_layer和multibox_loss_layer,但是理解了multibox_loss_layer后detection_output_layer就容易理解了,因为前者比后者多出来反向传播用来计算损失函数来更新参数。

  • 其实caffe的卷积层的实现远远比multibox_loss_layer复杂,所以不要太担心学习ssd算法源码将会十分困难。

具体将在下文叙述detection_output_layer和multibox_loss_layer。


detection_output_layer层和multibox_loss_layer层的输入

找到对应的train.prototxt和deploy.prototxt文件,并且索引MultiBoxLoss和DetectionOutput,可以发现前者比后者多了一个label层的输入,可以知道两者网络结构大概相同,并且前者需要通过label层来计算损失函数更新参数


两者的公共输入为 :

  • bottom: “mbox_loc”
  • bottom: “mbox_priorbox”

区别为:

  • train: bottom: “mbox_conf”
  • deploy: bottom: “mbox_conf_flatten”

而mbox_conf_flatten是将mbox_conf进行了softmax操作后的结果。可以在train.prototxt和deploy.prototxt进行比对。

mbox_loc解析

其中mbox_loc对应为:

layer {
  name: "mbox_loc"
  type: "Concat"
  bottom: "conv4_3_norm_mbox_loc_flat"
  bottom: "fc7_mbox_loc_flat"
  bottom: "conv6_2_mbox_loc_flat"
  bottom: "conv7_2_mbox_loc_flat"
  bottom: "conv8_2_mbox_loc_flat"
  bottom: "conv9_2_mbox_loc_flat"
  top: "mbox_loc"
  concat_param {
    axis: 1
  }
}
  • 可以得知,而mbox_loc中的conv4_3_norm_mbox_loc_flat的维度为: n x (38 x 38 x 4 x 4) x 1 x 1
  • 存储的分别代表blob中的样本数(n) x 通道数© x h x w ,因为n, c, h, w默认为1,而38 x 38表示的是经过卷积后的图片大小,紧跟着的是候选框的数量为4,最后的一个4表示的是一个候选框的长宽以及中心点的x,y坐标。其他的输入层同理。
  • 而mbox_loc实现的是将第二个通道(c)合并在一起,合并后的通道含义不变(这里需发挥自己的想象理解一下)
  • 我的废话:为了更好的理解,我一般只考虑conv4_3_norm_mbox_loc_flat,然后通过类比的方法最终应用到整个mbox_loc上去(依旧需要发挥自己想象)。

mbox_conf解析

mbox_conf 对应为:

layer {
  name: "mbox_conf"
  type: "Concat"
  bottom: "conv4_3_norm_mbox_conf_flat"
  bottom: "fc7_mbox_conf_flat"
  bottom: "conv6_2_mbox_conf_flat"
  bottom: "conv7_2_mbox_conf_flat"
  bottom: "conv8_2_mbox_conf_flat"
  bottom: "conv9_2_mbox_conf_flat"
  top: "mbox_conf"
  concat_param {
    axis: 1
  }
}

同理可以知道:

  • conv4_3_norm_mbox_conf_flat为:n x (38x 38 x 4 x 2) x 1 x 1
  • 其中n为样本数,38 x 38 为卷积后图像大小,4为候选框大学,2为类别

mbox_priorbox解析

mbox_priorbox对应为:

layer {
  name: "mbox_priorbox"
  type: "Concat"
  bottom: "conv4_3_norm_mbox_priorbox"
  bottom: "fc7_mbox_priorbox"
  bottom: "conv6_2_mbox_priorbox"
  bottom: "conv7_2_mbox_priorbox"
  bottom: "conv8_2_mbox_priorbox"
  bottom: "conv9_2_mbox_priorbox"
  top: "mbox_priorbox"
  concat_param {
    axis: 2
  }
}

同理,

  • conv4_3_norm_mbox_priorbox对应为: n x 2 x (38 x 38 x 4 x 4) x 1
  • mbox_priorbox合并的是第三个通道(h),其中第二个通道©是0时是原图坐标轴,为1为相应坐标轴下的variance值,variance是为了使得位置回归训练的速度更快。

接下来,可以查看detection_output_layer层源码解析

detection_output_layer解析

猜你喜欢

转载自blog.csdn.net/qq_31261509/article/details/83376668
今日推荐