web-dev-qa-db-ja.com

Fast / Faster-RCNNを使用してC ++でオブジェクト検出器を作成する最も簡単な方法は何ですか?

Fast/Faster-RCNNとCaffeを使用してC++でオブジェクト検出器を作成する最も簡単な方法は何ですか?

知られているように、Caffeでfollow RCNN(Region-based Convolutional Neural Networks)を使用できます。

scores, boxes = im_detect(net, im, obj_proposals) を呼び出すdef im_detect(net, im, boxes):

これに使用される rbgirshick/caffe-fast-rcnn 、ROIPooling-layersおよびoutput bbox_pred

scores, boxes = im_detect(net, im) を呼び出すdef im_detect(net, im, boxes=None):

これに使用される rbgirshick/caffe-fast-rcnn 、ROIPooling-layersおよびoutput bbox_pred

これらはすべてPythonとCaffeを使用しますが、C++とCaffeでそれを行う方法は?

分類(画像の何を言うか)のC++の例だけがありますが、detecton(画像の何をどこで言うか)の例はありません: 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++分類例

そして、どうすれば2つのレイヤーから出力データを取得できますか bbox_predcls_score

すべて(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);
16
Alex

まだそれを探している人のために、これにはカフェ付きのより高速なRCNNのC++バージョンがあります プロジェクト 。プロジェクトに含めるためのc ++ apiを見つけることもできます。私はそれを首尾よくテストしました。

1
dambromain