2016-04-17 8 views
15

फास्ट/फास्टर-आरसीएनएन और कैफे के साथ सी ++ पर ऑब्जेक्ट डिटेक्टर बनाने का सबसे आसान तरीका क्या है?फास्ट/फास्टर-आरसीएनएन के साथ सी ++ पर ऑब्जेक्ट डिटेक्टर बनाने का सबसे आसान तरीका क्या है?

में जाना जाता है के रूप में, हम का उपयोग RCNN पालन कर सकते हैं (क्षेत्र आधारित Convolutional तंत्रिका नेटवर्क) 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-layers और आउटपुट bbox_pred

इनमें से सभी पाइथन और कैफे का उपयोग करते हैं, लेकिन सी ++ और कैफे पर इसे कैसे करें?

वहाँ वर्गीकरण के लिए केवल सी ++ उदाहरण है (छवि पर क्या कहना है), लेकिन वहाँ 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++ Classification example में एक छोटा सा परिवर्तन किया है?

और मैं दो परतों 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); 
+0

मेरे पास एक ही प्रश्न है। दिलचस्प है यदि आपके पास उत्तर और अतिरिक्त अंतर्दृष्टि है? अंतिम लक्ष्य के रूप में, मैं सीपीयू पर चल रहे रीस्टफुल एपीआई के साथ एक सेवा के रूप में तेज़ आर-सीएनएन रखना चाहता हूं। धन्यवाद। –

+0

@ डेविड खोसिद अभी तक नहीं। मेरा लक्ष्य अधिकतम सटीकता है, और मैं फास्टनेट एमएसआरए के साथ फास्टर आरसीएनएन का उपयोग करना चाहता हूं जो इमेजनेट पर जीता। डीएनएन के लिए सीपीयू का उपयोग करना अच्छा विचार नहीं है, लेकिन अधिकतम गति के लिए आप darknet.conv.weights पर आधारित डार्कनेट योलो छोटे मॉडल को देख सकते हैं। या एसएसडी 300 हो सकता है: https://github.com/weiliu89/caffe/tree/ssd – Alex

+0

अरे @ एलेक्स क्या आपको जवाब मिल गए?मुझे आपके विषय में भी रूचि है :) धन्यवाद! – lilouch

उत्तर

1
आप में से जो लोग अभी भी इसे देख रहे के लिए

, वहाँ एक सी ++ इस project में Caffe के साथ तेजी से-RCNN का संस्करण है। आप इसे अपने प्रोजेक्ट में शामिल करने के लिए सी ++ एपीआई भी पा सकते हैं। मैंने सफलतापूर्वक इसका परीक्षण किया है।

संबंधित मुद्दे