當前位置:
首頁 > 知識 > 將FPN中的一些層改成C++

將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++

打開今日頭條,查看更多精彩圖片
喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

軟體人員的溝通技巧
kubernetes_Pod介紹

TAG:程序員小新人學習 |