了解更快的RCNN处理

时间:2017-12-15 06:05:05

标签: deep-learning caffe

我浏览了更快的RCNN的code,以便更好地理解实现。

我使用gdb来调试python接口后面的C ++代码,我可以逐行查看C ++代码。

This paper(第4页,第一段)提到将卷积地图划分为2k得分和4k坐标。

使用this prototxt作为

实现
   layer {
      name: "rpn_conv/3x3"
      type: "Convolution"
      bottom: "conv5_3"
      top: "rpn/output"
      param { lr_mult: 1.0 }
      param { lr_mult: 2.0 }
      convolution_param {
      num_output: 512
      kernel_size: 3 pad: 1 stride: 1
      weight_filler { type: "gaussian" std: 0.01 }
      bias_filler { type: "constant" value: 0 }
     }
   }

    layer {
      name: "rpn_cls_score"
      type: "Convolution"
      bottom: "rpn/output"
      top: "rpn_cls_score"
      param { lr_mult: 1.0 }
      param { lr_mult: 2.0 }
      convolution_param {
        num_output: 18   # 2(bg/fg) * 9(anchors)
        kernel_size: 1 pad: 0 stride: 1
        weight_filler { type: "gaussian" std: 0.01 }
        bias_filler { type: "constant" value: 0 }
      }
    }
    layer {
      name: "rpn_bbox_pred"
      type: "Convolution"
      bottom: "rpn/output"
      top: "rpn_bbox_pred"
      param { lr_mult: 1.0 }
      param { lr_mult: 2.0 }
      convolution_param {
        num_output: 36   # 4 * 9(anchors)
        kernel_size: 1 pad: 0 stride: 1
        weight_filler { type: "gaussian" std: 0.01 }
        bias_filler { type: "constant" value: 0 }
      }
    }

但我查看了代码,实际上是在cudnn_conv_layer.cpp and cudnn_conv_layer.cu下实现的。

通过这些rpn_cls_score and rpn_bbox_pred图层后,​​我可以看到输出blob形状 容量4 = {1,18,36,49} 容量4 = {1,36,36,49},所以它分成了分数和方框。

(1)我如何理解它经历的过程,以便256或512维分为{1,18,36,49}和{1,36,36,49}。有lr_mult,但我甚至找不到如何使用lr_mult

(2)然后讨论了关于Loss实现的第一列,我找不到源代码中如何实现SGD损失最小化的来源?

1 个答案:

答案 0 :(得分:0)

最好首先在CNN和Caffe上尝试一些基本教程。在不了解背景理论的情况下直接跳入Caffe实施可能会导致更多的混淆。

你所展示的原型文本区域只有3层卷积。

  1. 512平面输入要素图与18个滤波器进行卷积,以获得层“rpn_cls_score”中的18平面输出要素图。相同的512平面输入要素图与36个滤波器进行卷积,以获得层“rpn_bbox_pred”中的36平面输出要素贴图。
  2. 这两层都是卷积层。

    请参阅CPU实施:https://github.com/BVLC/caffe/blob/master/src/caffe/layers/conv_layer.cpp

    lr_mult是学习率倍增因子。在你的solver.prototxt中,会有一个base_lr。它与每层的lr_mult相乘,以获得该层的有效学习率。它是参数更新的一部分,对用户隐藏。 (这是机器学习框架之美)

    1. 再一次,整个向后传递和参数更新由Caffe在后台完成。用户无需担心。由于您正在寻找实施,请参阅此处的SGD:https://github.com/BVLC/caffe/blob/master/src/caffe/solvers/sgd_solver.cpp