diff --git a/modules/dnn/src/net_impl.cpp b/modules/dnn/src/net_impl.cpp index 18a757f8c1..611eb859af 100644 --- a/modules/dnn/src/net_impl.cpp +++ b/modules/dnn/src/net_impl.cpp @@ -2378,11 +2378,33 @@ std::vector Net::Impl::getLayerNames() const } -// FIXIT drop "unconnected" API std::vector Net::Impl::getUnconnectedOutLayers() const { std::vector layersIds; + if (mainGraph) { + const std::vector& outargs = mainGraph->outputs(); + std::set outArgIdxs; + for (const auto& out : outargs) + outArgIdxs.insert(out.idx); + + int graph_ofs = 0; + for (const auto& graph : allgraphs) { + const std::vector>& prog = graph->prog(); + for (int i = 0; i < (int)prog.size(); i++) { + for (const auto& layerOut : prog[i]->outputs) { + if (outArgIdxs.count(layerOut.idx)) { + layersIds.push_back(graph_ofs + i); + break; + } + } + } + graph_ofs += (int)prog.size(); + } + if (!layersIds.empty()) + return layersIds; + } + // registerOutput() flow if (!outputNameToId.empty()) { diff --git a/modules/dnn/test/test_onnx_importer.cpp b/modules/dnn/test/test_onnx_importer.cpp index 3f00143a25..7c227942b9 100644 --- a/modules/dnn/test/test_onnx_importer.cpp +++ b/modules/dnn/test/test_onnx_importer.cpp @@ -3566,4 +3566,28 @@ TEST_P(Test_ONNX_layers, RandomNormalLike_complex) INSTANTIATE_TEST_CASE_P(/**/, Test_ONNX_nets, dnnBackendsAndTargets()); +TEST_P(Test_ONNX_layers, getUnconnectedOutLayers) +{ + auto engine_forced = static_cast( + cv::utils::getConfigurationParameterSizeT("OPENCV_FORCE_DNN_ENGINE", cv::dnn::ENGINE_AUTO)); + if (engine_forced == cv::dnn::ENGINE_ORT) + applyTestTag(CV_TEST_TAG_DNN_SKIP_PARSER); + + Net net = readNetFromONNX(_tf("models/yolov8x.onnx", false)); + ASSERT_FALSE(net.empty()); + net.setPreferableBackend(backend); + net.setPreferableTarget(target); + + std::vector outIds = net.getUnconnectedOutLayers(); + std::vector outNames = net.getUnconnectedOutLayersNames(); + + EXPECT_EQ(outIds.size(), outNames.size()); + EXPECT_EQ(1, outIds.size()); + + EXPECT_EQ("output0", outNames[0]); + EXPECT_GT(outIds[0], 0); + Ptr layer = net.getLayer(outIds[0]); + ASSERT_TRUE(layer); +} + }} // namespace