Ответ 1
для тех из вас, кто все еще ищет его, в этом проекте есть версия С++ с более быстрым RCNN. Вы даже можете найти С++ api, чтобы включить его в свой проект. Я успешно протестировал его.
Каков самый простой способ сделать детектор объекта на С++ с 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);
для тех из вас, кто все еще ищет его, в этом проекте есть версия С++ с более быстрым RCNN. Вы даже можете найти С++ api, чтобы включить его в свой проект. Я успешно протестировал его.