diff --git a/modules/dnn/src/dnn.cpp b/modules/dnn/src/dnn.cpp index 92975a7560..c5fbb28e07 100644 --- a/modules/dnn/src/dnn.cpp +++ b/modules/dnn/src/dnn.cpp @@ -2795,8 +2795,7 @@ void Net::forward(std::vector >& outputBlobs, std::vector pins; for (int i = 0; i < outBlobNames.size(); i++) { - std::vector lp = impl->getLayerOutPins(outBlobNames[i]); - pins.insert(pins.end(), lp.begin(), lp.end()); + pins.push_back(impl->getPinByAlias(outBlobNames[i])); } impl->setUpNet(pins); @@ -2809,9 +2808,10 @@ void Net::forward(std::vector >& outputBlobs, for (int i = 0; i < outBlobNames.size(); i++) { std::vector lp = impl->getLayerOutPins(outBlobNames[i]); - for (int i = 0; i < lp.size(); i++) + outputBlobs[i].resize(lp.size()); + for (int j = 0; j < lp.size(); j++) { - outputBlobs[i].push_back(impl->getBlob(lp[i])); + outputBlobs[i][j] = impl->getBlob(lp[j]); } } } diff --git a/modules/dnn/test/test_misc.cpp b/modules/dnn/test/test_misc.cpp index 685ee02856..458344cc4f 100644 --- a/modules/dnn/test/test_misc.cpp +++ b/modules/dnn/test/test_misc.cpp @@ -306,4 +306,38 @@ TEST_P(DeprecatedForward, CustomLayerWithFallback) INSTANTIATE_TEST_CASE_P(/**/, DeprecatedForward, dnnBackendsAndTargets()); +TEST(Net, forwardAndRetrieve) +{ + std::string prototxt = + "input: \"data\"\n" + "layer {\n" + " name: \"testLayer\"\n" + " type: \"Slice\"\n" + " bottom: \"data\"\n" + " top: \"firstCopy\"\n" + " top: \"secondCopy\"\n" + " slice_param {\n" + " axis: 0\n" + " slice_point: 2\n" + " }\n" + "}"; + Net net = readNetFromCaffe(&prototxt[0], prototxt.size()); + net.setPreferableBackend(DNN_BACKEND_OPENCV); + + Mat inp(4, 5, CV_32F); + randu(inp, -1, 1); + net.setInput(inp); + + std::vector outNames; + outNames.push_back("testLayer"); + std::vector > outBlobs; + + net.forward(outBlobs, outNames); + + EXPECT_EQ(outBlobs.size(), 1); + EXPECT_EQ(outBlobs[0].size(), 2); + normAssert(outBlobs[0][0], inp.rowRange(0, 2), "first part"); + normAssert(outBlobs[0][1], inp.rowRange(2, 4), "second part"); +} + }} // namespace