使用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/py-faster-rcnn存储库就足够了
rbgirshick/caffe-fast-rcnn,下载预先存在的模型
./data/scripts/fetch_faster_rcnn_models.sh
,使用此coco/VGG16/faster_rcnn_end2end/test.prototxt并在CaffeNet C++ Classification example中做些小改动?以及如何从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);
最佳答案
对于仍在寻找它的那些人,此project中有一个带有caffe的fast-RCNN的C++版本。您甚至可以找到将其包含在项目中的c++ api。我已经成功测试了。
关于python - 使用Fast/Faster-RCNN在C++上进行对象检测器的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36678375/