使用 Fast/Faster-RCNN 和 Caffe 在 C++ 上制作对象检测器的最简单方法是什么?
众所周知,我们可以在 Caffe 中使用 follow RCNN(基于区域的卷积神经网络):
scores, boxes = im_detect(net, im, obj_proposals)
这要求def im_detect(net, im, boxes):
为此使用rbgirshick/caffe-fast-rcnn, ROIPooling-layers 和输出bbox_pred
scores, boxes = im_detect(net, im)
这要求def im_detect(net, im, boxes=None):
为此使用rbgirshick/caffe-fast-rcnn, ROIPooling-layers 和输出bbox_pred
所有这些都使用 Python 和 Caffe,但是如何在 C++ 和 Caffe 上实现呢?
只有 C++ 示例用于分类(说明图像上的内容),但没有用于检测(说明图像上的内容和位置):https ://github.com/BVLC/caffe/tree/master/examples/cpp_classification
使用
rbgirshick/caffe-fast-rcnn简单地克隆rbgirshick/py-faster-rcnn存储库是否足够,下载预先保存的模型,使用这个coco/VGG16/faster_rcnn_end2end/test.prototxt并在CaffeNet C++ 分类中做了一个小改动例子?./data/scripts/fetch_faster_rcnn_models.sh
以及如何从bbox_pred和cls_score两层获取输出数据?
我会将所有 (bbox_pred & cls_score) 放在一个数组中吗:
const vector<Blob<float>*>& output_blobs = net_->ForwardPrefilled();
Blob<float>* output_layer = output_blobs[0];
const float* begin = output_layer->cpu_data();
const float* end = begin + output_layer->channels();
std::vector<float> bbox_and_score_array(begin, end);
还是在两个数组中?
const vector<Blob<float>*>& output_blobs = net_->ForwardPrefilled();
Blob<float>* bbox_output_layer = output_blobs[0];
const float* begin_b = bbox_output_layer ->cpu_data();
const float* end_b = begin_b + bbox_output_layer ->channels();
std::vector<float> bbox_array(begin_b, end_b);
Blob<float>* score_output_layer = output_blobs[1];
const float* begin_c = score_output_layer ->cpu_data();
const float* end_c = begin_c + score_output_layer ->channels();
std::vector<float> score_array(begin_c, end_c);