python - ¿Cuál es la forma más sencilla de hacer un detector de objetos en C++ con Fast/Faster-RCNN?
deep-learning caffe (1)
Para aquellos de ustedes que todavía lo están buscando, hay una versión en C ++ de rapid-RCNN con caffe en este project . Incluso puedes encontrar una api de c ++ para incluirla en tu proyecto. Lo he probado con éxito.
¿Cuál es la forma más sencilla de hacer que el detector de objetos en C ++ con Fast / Faster-RCNN y Caffe?
Como se sabe, podemos usar RCNN (Redes neuronales convolucionales basadas en la región) con Caffe:
scores, boxes = im_detect(net, im, obj_proposals)
que llama a def im_detect(net, im, boxes):
para esto se utiliza rbgirshick/caffe-fast-rcnn , ROIPooling-layers y salida bbox_pred
scores, boxes = im_detect(net, im)
que llama a def im_detect(net, im, boxes=None):
para esto se utiliza rbgirshick/caffe-fast-rcnn , ROIPooling-layers y salida bbox_pred
Todos estos utilizan Python y Caffe, pero ¿cómo hacerlo en C ++ y Caffe?
Solo hay un ejemplo de C ++ para la clasificación (para decir qué en la imagen), pero no hay para detecton (para decir qué y dónde en la imagen): https://github.com/BVLC/caffe/tree/master/examples/cpp_classification
¿Es suficiente simplemente clonar el rbgirshick/py-faster-rcnn con rbgirshick/caffe-fast-rcnn Descargue el modelo ./data/scripts/fetch_faster_rcnn_models.sh
coco/VGG16/faster_rcnn_end2end/test.prototxt y hecho un pequeño cambio en el ejemplo de Clasificación CaffeNet C ++ ?
¿Y cómo puedo obtener datos de salida de dos capas bbox_pred y cls_score ?
¿Tendré todos (bbox_pred y cls_score) en una matriz:
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);
¿O en dos matrices?
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);