mirror of
https://github.com/opencv/opencv.git
synced 2026-07-30 07:43:03 +04:00
Merge pull request #10356 from dkurt:dnn_rfcn
This commit is contained in:
@@ -1,24 +1,3 @@
|
||||
// Faster-RCNN models use custom layer called 'Proposal' written in Python. To
|
||||
// map it into OpenCV's layer replace a layer node with [type: 'Python'] to the
|
||||
// following definition:
|
||||
// layer {
|
||||
// name: 'proposal'
|
||||
// type: 'Proposal'
|
||||
// bottom: 'rpn_cls_prob_reshape'
|
||||
// bottom: 'rpn_bbox_pred'
|
||||
// bottom: 'im_info'
|
||||
// top: 'rois'
|
||||
// proposal_param {
|
||||
// ratio: 0.5
|
||||
// ratio: 1.0
|
||||
// ratio: 2.0
|
||||
// scale: 8
|
||||
// scale: 16
|
||||
// scale: 32
|
||||
// }
|
||||
// }
|
||||
#include <iostream>
|
||||
|
||||
#include <opencv2/dnn.hpp>
|
||||
#include <opencv2/dnn/all_layers.hpp>
|
||||
#include <opencv2/imgproc.hpp>
|
||||
@@ -50,9 +29,11 @@ int main(int argc, char** argv)
|
||||
{
|
||||
// Parse command line arguments.
|
||||
CommandLineParser parser(argc, argv, keys);
|
||||
parser.about( "This sample is used to run Faster-RCNN object detection with OpenCV.\n"
|
||||
"You can get required models from https://github.com/rbgirshick/py-faster-rcnn" );
|
||||
|
||||
parser.about("This sample is used to run Faster-RCNN and R-FCN object detection "
|
||||
"models with OpenCV. You can get required models from "
|
||||
"https://github.com/rbgirshick/py-faster-rcnn (Faster-RCNN) and from "
|
||||
"https://github.com/YuwenXiong/py-R-FCN (R-FCN). Corresponding .prototxt "
|
||||
"files may be found at https://github.com/opencv/opencv_extra/tree/master/testdata/dnn.");
|
||||
if (argc == 1 || parser.has("help"))
|
||||
{
|
||||
parser.printMessage();
|
||||
@@ -68,19 +49,6 @@ int main(int argc, char** argv)
|
||||
// Load a model.
|
||||
Net net = readNetFromCaffe(protoPath, modelPath);
|
||||
|
||||
// Create a preprocessing layer that does final bounding boxes applying predicted
|
||||
// deltas to objects locations proposals and doing non-maximum suppression over it.
|
||||
LayerParams lp;
|
||||
lp.set("code_type", "CENTER_SIZE"); // An every bounding box is [xmin, ymin, xmax, ymax]
|
||||
lp.set("num_classes", 21);
|
||||
lp.set("share_location", (int)false); // Separate predictions for different classes.
|
||||
lp.set("background_label_id", 0);
|
||||
lp.set("variance_encoded_in_target", (int)true);
|
||||
lp.set("keep_top_k", 100);
|
||||
lp.set("nms_threshold", 0.3);
|
||||
lp.set("normalized_bbox", (int)false);
|
||||
Ptr<Layer> detectionOutputLayer = DetectionOutputLayer::create(lp);
|
||||
|
||||
Mat img = imread(imagePath);
|
||||
resize(img, img, Size(kInpWidth, kInpHeight));
|
||||
Mat blob = blobFromImage(img, 1.0, Size(), Scalar(102.9801, 115.9465, 122.7717), false, false);
|
||||
@@ -89,31 +57,8 @@ int main(int argc, char** argv)
|
||||
net.setInput(blob, "data");
|
||||
net.setInput(imInfo, "im_info");
|
||||
|
||||
std::vector<Mat> outs;
|
||||
std::vector<String> outNames(3);
|
||||
outNames[0] = "proposal";
|
||||
outNames[1] = "bbox_pred";
|
||||
outNames[2] = "cls_prob";
|
||||
net.forward(outs, outNames);
|
||||
|
||||
Mat proposals = outs[0].colRange(1, 5).clone(); // Only last 4 columns.
|
||||
Mat& deltas = outs[1];
|
||||
Mat& scores = outs[2];
|
||||
|
||||
// Reshape proposals from Nx4 to 1x1xN*4
|
||||
std::vector<int> shape(3, 1);
|
||||
shape[2] = (int)proposals.total();
|
||||
proposals = proposals.reshape(1, shape);
|
||||
|
||||
// Run postprocessing layer.
|
||||
std::vector<Mat> layerInputs(3), layerOutputs(1), layerInternals;
|
||||
layerInputs[0] = deltas.reshape(1, 1);
|
||||
layerInputs[1] = scores.reshape(1, 1);
|
||||
layerInputs[2] = proposals;
|
||||
detectionOutputLayer->forward(layerInputs, layerOutputs, layerInternals);
|
||||
|
||||
// Draw detections.
|
||||
Mat detections = layerOutputs[0];
|
||||
Mat detections = net.forward();
|
||||
const float* data = (float*)detections.data;
|
||||
for (size_t i = 0; i < detections.total(); i += 7)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user