将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,找不到文件,所以先注释掉了。