Каков самый простой способ сделать детектор объектов на С++ с Fast/Faster-RCNN?

Каков самый простой способ сделать детектор объекта на С++ с Fast/Faster-RCNN и Caffe?

Как известно, мы можем использовать следующие RCNN (Свертонные нейронные сети на основе региона) с Caffe:

scores, boxes = im_detect(net, im, obj_proposals), который вызывает def im_detect(net, im, boxes):

для этого используемого rbgirshick/caffe-fast-rcnn, слоев ROIPooling и вывода bbox_pred

scores, boxes = im_detect(net, im), который вызывает def im_detect(net, im, boxes=None):

для этого используемого rbgirshick/caffe-fast-rcnn, слоев ROIPooling и вывода bbox_pred

Все они используют Python и Caffe, но как это сделать на С++ и Caffe?

Существует только пример С++ для классификации (чтобы сказать, что на изображении), но нет для 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 С++?

И как я могу получить выходные данные из двух слоев 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);

Ответы