将FPN中的一些层改成C++

因为需要用C++的代码跑测试,因而需要将prototxt中一些原来用python写的层改成c++格式。

之前跑faster rcnn的时候,将rpn层参考博客修改过,但是因为对源码不了解,这次改三个层无从下手,下面记录一下过程。需要修改的三个层分别为rpn-data,roi-data和proposal层。

rpn-data:

layer {

name: 'rpn-data'

type: 'Module'

bottom: 'rpn_cls_score/p2'

bottom: 'rpn_cls_score/p3'

bottom: 'rpn_cls_score/p4'

bottom: 'rpn_cls_score/p5'

bottom: 'rpn_cls_score/p6'

bottom: 'gt_boxes'

bottom: 'im_info'

top: 'rpn_labels'

top: 'rpn_bbox_targets'

top: 'rpn_bbox_inside_weights'

top: 'rpn_bbox_outside_weights'

module_param {

module: "modules"

type: "FPNAnchorTarget"

param_str: "{ 'feat_strides': [4,8,16,32,64] }"

}

propagate_down: 0

propagate_down: 0

propagate_down: 0

propagate_down: 0

propagate_down: 0

propagate_down: 0

propagate_down: 0

}

roi-data:

layer {

name: 'roi-data'

type: 'Module'

bottom: 'rpn_rois'

bottom: 'gt_boxes'

top: 'rois/h2'

top: 'rois/h3'

top: 'rois/h4'

top: 'rois/h5'

# top: 'rois/h6'

top: 'labels'

top: 'bbox_targets'

top: 'bbox_inside_weights'

top: 'bbox_outside_weights'

propagate_down: 0

propagate_down: 0

module_param {

module: 'modules'

type: 'FPNProposalTarget'

}

}

proposal:

layer {

name: 'proposal'

type: 'Module'

bottom: 'fpn_out_reshape/p2'

bottom: 'rpn_bbox_pred/p2'

bottom: 'fpn_out_reshape/p3'

bottom: 'rpn_bbox_pred/p3'

bottom: 'fpn_out_reshape/p4'

bottom: 'rpn_bbox_pred/p4'

bottom: 'fpn_out_reshape/p5'

bottom: 'rpn_bbox_pred/p5'

bottom: 'fpn_out_reshape/p6'

bottom: 'rpn_bbox_pred/p6'

bottom: 'im_info'

top: 'rpn_rois'

module_param {

module: 'modules'

type: 'FPNProposal'

param_str: "{'feat_strides': [4,8,16,32,64]}"

}

propagate_down: 0

propagate_down: 0

propagate_down: 0

propagate_down: 0

propagate_down: 0

propagate_down: 0

propagate_down: 0

propagate_down: 0

propagate_down: 0

propagate_down: 0

propagate_down: 0

include { phase: TRAIN }

}

注意到其中的module_param和model的'modules'都是需要根据实际情况改掉的。在调用module_param的地方,调用方法为this->layer_param_.module_param(),而直接编译caffe的时候是无法通过编译的,会报找不到module_param()的error。分析了源码,发现代码中使用YAML解析结构(在faster rcnn中为用LayerParameter直接定义解析参数,之后也可以尝试用这种方法),因此需要在caffe.proto里添加Moduleparameter。

(虽然yaml-cpp安装成功了,但是还是报错undefined yaml,所以打算尝试上面的方法:

(备份后)将train和test的pt里的module_param更改成fpn_param

在caffe.proto里添加parameter,FPNParameter fpn_param;然后发现,根据caffe.proto中,参数的类型不同,会在caafe.pb.h和.cc中自动生成不同的参数。对于optional变量,会生成has_xx,对于repeated变量,会生成xx.size(),可以对比dummy_data_layer.cpp和pooling_layer.cpp两个文件,而生成参数的主要作用是用来在.cpp中取值的时候做判断

事实上尝试失败了,因为没有搞清楚层与层之间的关系

该prototxt在roi_pooling层只写了一个feat_strides,而实际上在Faster Rcnn中,还需要anchor_scales和anchor_ratios。因此查看了fpn_proposal_layer.cpp,发现其中的结构是,如果pt中为空,则自动设置。(可以在后期加在prototxt中修改试一试)

另外可以看到,在roi-data层中,c++版本是没有另外传入参数的,而python版本是添加了num_class参数。然后发现该n_class参数是在frcnn_param里传入的,而里面的参数是从脚本中parse出来的,因此不需要在这里设置了。

另外,在fpn_proposal_layer.cu里,有cub/cub.cuh,找不到文件,所以先注释掉了。

将FPN中的一些层改成C++

相关推荐