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


TAG:程序員小新人學習 |