Fast/Faster-RCNN と Caffe を使用して C++ でオブジェクト検出器を作成する最も簡単な方法は何ですか?
知られているように、RCNN (領域ベースの畳み込みニューラル ネットワーク) を Caffe で使用できます。
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で複製し、pre-tained model をダウンロードし、./data/scripts/fetch_faster_rcnn_models.sh
このcoco/VGG16/faster_rcnn_end2end/test.prototxtを使用し、 CaffeNet C++ 分類を少し変更するだけで十分ですか?例?
bbox_predとcls_scoreの 2 つのレイヤーから出力データを取得するにはどうすればよいですか?
すべて (bbox_pred & cls_score) を 1 つの配列に入れますか?
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);
それとも2つの配列で?
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);