diff --git a/modules/dnn/include/opencv2/dnn/dnn.hpp b/modules/dnn/include/opencv2/dnn/dnn.hpp index 7a5cb3824f..f290b81e93 100644 --- a/modules/dnn/include/opencv2/dnn/dnn.hpp +++ b/modules/dnn/include/opencv2/dnn/dnn.hpp @@ -835,7 +835,7 @@ CV__DNN_INLINE_NS_BEGIN */ CV_WRAP void setParam(int layer, int numParam, CV_ND const Mat &blob); /** @brief Sets the parameter blob of a layer identified by its name or output tensor name. - * @param layerName layer name (classic engine) or raw ONNX output tensor name (ENGINE_NEW). + * @param layerName raw ONNX output tensor name (ENGINE_NEW). * @param numParam index of the constant weight input to update (0 = kernel, 1 = bias, etc.). * @param blob the new parameter value. */ @@ -1083,9 +1083,7 @@ CV__DNN_INLINE_NS_BEGIN enum EngineType { - ENGINE_CLASSIC=1, //!< Force use the old dnn engine similar to 4.x branch - ENGINE_NEW=2, //!< Force use the new dnn engine. The engine does not support non CPU back-ends for now. - ENGINE_AUTO=3, //!< Try to use the new engine and then fall back to the classic version. + ENGINE_NEW=2, //!< Use the new dnn engine. This is the only supported engine. The engine does not support non CPU back-ends for now. ENGINE_ORT=4 //!< Try to use ONNX Runtime wrapper (ONNX only, requires build with WITH_ONNXRUNTIME=ON). }; @@ -1101,7 +1099,7 @@ CV__DNN_INLINE_NS_BEGIN */ CV_EXPORTS_W Net readNetFromTensorflow(CV_WRAP_FILE_PATH const String &model, CV_WRAP_FILE_PATH const String &config = String(), - int engine=ENGINE_AUTO, + int engine=ENGINE_NEW, const std::vector& extraOutputs = std::vector()); /** @brief Reads a network model stored in TensorFlow framework's format. @@ -1114,7 +1112,7 @@ CV__DNN_INLINE_NS_BEGIN */ CV_EXPORTS_W Net readNetFromTensorflow(const std::vector& bufferModel, const std::vector& bufferConfig = std::vector(), - int engine=ENGINE_AUTO, + int engine=ENGINE_NEW, const std::vector& extraOutputs = std::vector()); /** @brief Reads a network model stored in TensorFlow framework's format. @@ -1130,34 +1128,34 @@ CV__DNN_INLINE_NS_BEGIN */ CV_EXPORTS Net readNetFromTensorflow(const char *bufferModel, size_t lenModel, const char *bufferConfig = NULL, size_t lenConfig = 0, - int engine=ENGINE_AUTO, + int engine=ENGINE_NEW, const std::vector& extraOutputs = std::vector()); /** @brief Reads a network model stored in TFLite framework's format. * @param model path to the .tflite file with binary flatbuffers description of the network architecture - * @param engine select DNN engine to be used. With auto selection the new engine is used first and falls back to classic. + * @param engine select DNN engine to be used. Only ENGINE_NEW (the default) and ENGINE_ORT are supported. * Please pay attention that the new DNN does not support non-CPU back-ends for now. * @returns Net object. */ - CV_EXPORTS_W Net readNetFromTFLite(CV_WRAP_FILE_PATH const String &model, int engine=ENGINE_AUTO); + CV_EXPORTS_W Net readNetFromTFLite(CV_WRAP_FILE_PATH const String &model, int engine=ENGINE_NEW); /** @brief Reads a network model stored in TFLite framework's format. * @param bufferModel buffer containing the content of the tflite file - * @param engine select DNN engine to be used. With auto selection the new engine is used first and falls back to classic. + * @param engine select DNN engine to be used. Only ENGINE_NEW (the default) and ENGINE_ORT are supported. * Please pay attention that the new DNN does not support non-CPU back-ends for now. * @returns Net object. */ - CV_EXPORTS_W Net readNetFromTFLite(const std::vector& bufferModel, int engine=ENGINE_AUTO); + CV_EXPORTS_W Net readNetFromTFLite(const std::vector& bufferModel, int engine=ENGINE_NEW); /** @brief Reads a network model stored in TFLite framework's format. * @details This is an overloaded member function, provided for convenience. * It differs from the above function only in what argument(s) it accepts. * @param bufferModel buffer containing the content of the tflite file * @param lenModel length of bufferModel - * @param engine select DNN engine to be used. With auto selection the new engine is used first and falls back to classic. + * @param engine select DNN engine to be used. Only ENGINE_NEW (the default) and ENGINE_ORT are supported. * Please pay attention that the new DNN does not support non-CPU back-ends for now. */ - CV_EXPORTS Net readNetFromTFLite(const char *bufferModel, size_t lenModel, int engine=ENGINE_AUTO); + CV_EXPORTS Net readNetFromTFLite(const char *bufferModel, size_t lenModel, int engine=ENGINE_NEW); /** * @brief Read deep learning network represented in one of the supported formats. @@ -1171,9 +1169,8 @@ CV__DNN_INLINE_NS_BEGIN * * `*.pbtxt` (TensorFlow, https://www.tensorflow.org/) * * `*.xml` (OpenVINO, https://software.intel.com/openvino-toolkit) * @param[in] framework Explicit framework name tag to determine a format. - * @param[in] engine select DNN engine to be used. With auto selection the new engine is used first and falls back to classic. + * @param engine select DNN engine to be used. Only ENGINE_NEW (the default) and ENGINE_ORT are supported. * Please pay attention that the new DNN does not support non-CPU back-ends for now. - * Use ENGINE_CLASSIC if you want to use other back-ends. * @returns Net object. * * This function automatically detects an origin framework of trained model @@ -1183,7 +1180,7 @@ CV__DNN_INLINE_NS_BEGIN CV_EXPORTS_W Net readNet(CV_WRAP_FILE_PATH const String& model, CV_WRAP_FILE_PATH const String& config = "", const String& framework = "", - int engine = ENGINE_AUTO); + int engine = ENGINE_NEW); /** * @brief Read deep learning network represented in one of the supported formats. @@ -1192,14 +1189,13 @@ CV__DNN_INLINE_NS_BEGIN * @param[in] framework Name of origin framework. * @param[in] bufferModel A buffer with a content of binary file with weights * @param[in] bufferConfig A buffer with a content of text file contains network configuration. - * @param engine select DNN engine to be used. With auto selection the new engine is used first and falls back to classic. + * @param engine select DNN engine to be used. Only ENGINE_NEW (the default) and ENGINE_ORT are supported. * Please pay attention that the new DNN does not support non-CPU back-ends for now. - * Use ENGINE_CLASSIC if you want to use other back-ends. * @returns Net object. */ CV_EXPORTS_W Net readNet(const String& framework, const std::vector& bufferModel, const std::vector& bufferConfig = std::vector(), - int engine = ENGINE_AUTO); + int engine = ENGINE_NEW); /** @brief Load a network from Intel's Model Optimizer intermediate representation. * @param[in] xml XML configuration file with network's topology. @@ -1237,31 +1233,31 @@ CV__DNN_INLINE_NS_BEGIN /** @brief Reads a network model ONNX. * @param onnxFile path to the .onnx file with text description of the network architecture. - * @param engine select DNN engine to be used. With auto selection the new engine is used first and falls back to classic. + * @param engine select DNN engine to be used. Only ENGINE_NEW (the default) and ENGINE_ORT are supported. * Please pay attention that the new DNN does not support non-CPU back-ends for now. * @returns Network object that ready to do forward, throw an exception in failure cases. */ - CV_EXPORTS_W Net readNetFromONNX(CV_WRAP_FILE_PATH const String &onnxFile, int engine=ENGINE_AUTO); + CV_EXPORTS_W Net readNetFromONNX(CV_WRAP_FILE_PATH const String &onnxFile, int engine=ENGINE_NEW); /** @brief Reads a network model from ONNX * in-memory buffer. * @param buffer memory address of the first byte of the buffer. * @param sizeBuffer size of the buffer. - * @param engine select DNN engine to be used. With auto selection the new engine is used first and falls back to classic. + * @param engine select DNN engine to be used. Only ENGINE_NEW (the default) and ENGINE_ORT are supported. * @returns Network object that ready to do forward, throw an exception * in failure cases. */ - CV_EXPORTS Net readNetFromONNX(const char* buffer, size_t sizeBuffer, int engine=ENGINE_AUTO); + CV_EXPORTS Net readNetFromONNX(const char* buffer, size_t sizeBuffer, int engine=ENGINE_NEW); /** @brief Reads a network model from ONNX * in-memory buffer. * @param buffer in-memory buffer that stores the ONNX model bytes. - * @param engine select DNN engine to be used. With auto selection the new engine is used first and falls back to classic. + * @param engine select DNN engine to be used. Only ENGINE_NEW (the default) and ENGINE_ORT are supported. * Please pay attention that the new DNN does not support non-CPU back-ends for now. * @returns Network object that ready to do forward, throw an exception * in failure cases. */ - CV_EXPORTS_W Net readNetFromONNX(const std::vector& buffer, int engine=ENGINE_AUTO); + CV_EXPORTS_W Net readNetFromONNX(const std::vector& buffer, int engine=ENGINE_NEW); /** @brief Creates blob from .pb file. * @param path to the .pb file with input tensor. diff --git a/modules/dnn/misc/java/test/DnnForwardAndRetrieve.java b/modules/dnn/misc/java/test/DnnForwardAndRetrieve.java index 682099a261..326c670b97 100644 --- a/modules/dnn/misc/java/test/DnnForwardAndRetrieve.java +++ b/modules/dnn/misc/java/test/DnnForwardAndRetrieve.java @@ -45,7 +45,7 @@ public class DnnForwardAndRetrieve extends OpenCVTestCase { public void testForwardAndRetrieve() { // Verifies forwardAndRetrieve nested list marshalling using a small ONNX model instead of the removed Caffe importer. - Net net = Dnn.readNetFromONNX(modelFileName, Dnn.ENGINE_CLASSIC); + Net net = Dnn.readNetFromONNX(modelFileName, Dnn.ENGINE_NEW); net.setPreferableBackend(Dnn.DNN_BACKEND_OPENCV); // split_0.onnx declares a single 4D input named "image" of shape [1, 3, 2, 2]. diff --git a/modules/dnn/misc/python/test/test_dnn.py b/modules/dnn/misc/python/test/test_dnn.py index cf764e93d2..8f45a82947 100755 --- a/modules/dnn/misc/python/test/test_dnn.py +++ b/modules/dnn/misc/python/test/test_dnn.py @@ -366,7 +366,7 @@ class dnn_test(NewOpenCVTests): for backend, target in self.dnnBackendsAndTargets: printParams(backend, target) - net = cv.dnn.readNet(model, engine=cv.dnn.ENGINE_CLASSIC) + net = cv.dnn.readNet(model, engine=cv.dnn.ENGINE_NEW) net.setPreferableBackend(backend) net.setPreferableTarget(target) @@ -415,7 +415,7 @@ class dnn_test(NewOpenCVTests): for backend, target in self.dnnBackendsAndTargets: printParams(backend, target) - net = cv.dnn.readNet(model_path, "", "", engine=cv.dnn.ENGINE_CLASSIC) + net = cv.dnn.readNet(model_path, "", "", engine=cv.dnn.ENGINE_NEW) node_name = net.getLayerNames()[0] w = net.getParam(node_name, 0) # returns the original tensor of three-dimensional shape diff --git a/modules/dnn/perf/perf_net.cpp b/modules/dnn/perf/perf_net.cpp index 9dbc3dc14c..8bb6351713 100644 --- a/modules/dnn/perf/perf_net.cpp +++ b/modules/dnn/perf/perf_net.cpp @@ -145,12 +145,6 @@ PERF_TEST_P_(DNNTestNetwork, SSD) { applyTestTag(CV_TEST_TAG_DEBUG_VERYLONG); - // SSD_VGG16's specialized preprocessing is handled by the new engine importer only. - auto engine_forced = static_cast( - utils::getConfigurationParameterSizeT("OPENCV_FORCE_DNN_ENGINE", dnn::ENGINE_AUTO)); - if (engine_forced == dnn::ENGINE_CLASSIC) - throw SkipTestException("SSD_VGG16 is supported on the new DNN engine only"); - processNet("dnn/onnx/models/ssd_vgg16.onnx", "", cv::Size(300, 300)); } diff --git a/modules/dnn/src/onnx/onnx_importer.cpp b/modules/dnn/src/onnx/onnx_importer.cpp index ac8c550286..93c657da9d 100644 --- a/modules/dnn/src/onnx/onnx_importer.cpp +++ b/modules/dnn/src/onnx/onnx_importer.cpp @@ -52,31 +52,67 @@ namespace cv { namespace dnn { CV__DNN_INLINE_NS_BEGIN -extern bool DNN_DIAGNOSTICS_RUN; - #ifdef HAVE_PROTOBUF -class ONNXLayerHandler; -template -static T getScalarFromMat(Mat m) +// ENGINE_CLASSIC/ENGINE_AUTO have been removed. Resolve any engine request to a +// supported one (ENGINE_NEW or ENGINE_ORT), honoring the OPENCV_FORCE_DNN_ENGINE override. +static int resolveOnnxEngine(int engine) { - CV_Assert(m.total() == 1); - return m.at(0); + static const int engine_forced = + (int)utils::getConfigurationParameterSizeT("OPENCV_FORCE_DNN_ENGINE", ENGINE_NEW); + if (engine_forced == ENGINE_NEW || engine_forced == ENGINE_ORT) + engine = engine_forced; + if (engine != ENGINE_NEW && engine != ENGINE_ORT) + { + CV_LOG_WARNING(NULL, "DNN/ONNX: only ENGINE_NEW and ENGINE_ORT are supported; " + "ENGINE_CLASSIC/ENGINE_AUTO are deprecated, falling back to ENGINE_NEW."); + engine = ENGINE_NEW; + } + return engine; } -// Read scalar zero-point from a Mat of any supported integer depth. -// `unshiftFromInt8` undoes the -128 offset that populateNet() applies when -// rewriting UINT8 initializers as INT8. -static int readZpScalar(const Mat& m, int i, bool unshiftFromInt8 = false) +Net readNetFromONNX(const String& onnxFile, int engine) { - switch (m.depth()) { - case CV_8U: return (int)m.at(i); - case CV_8S: return (int)m.at(i) + (unshiftFromInt8 ? 128 : 0); - case CV_16U: return (int)m.at(i); - case CV_16S: return (int)m.at(i); - case CV_32S: return m.at(i); - default: CV_Error(Error::StsNotImplemented, "Unsupported zero_point depth"); + if (resolveOnnxEngine(engine) == ENGINE_ORT) + { +#ifdef HAVE_ONNXRUNTIME + Net net = readNetFromONNX2_ORT(onnxFile); + if (net.empty()) + CV_Error(Error::StsError, "DNN/ONNX/ORT: failed to load model"); + if (!net.getImpl() || net.getImpl()->modelFileName.empty()) + CV_Error(Error::StsError, "DNN/ONNX/ORT: ONNX Runtime model metadata was not initialized"); + return net; +#else + CV_LOG_WARNING(NULL, "DNN/ONNX/ORT: OpenCV was built without ONNX Runtime (WITH_ONNXRUNTIME=OFF). Falling back to ENGINE_NEW."); +#endif } + return readNetFromONNX2(onnxFile); +} + +Net readNetFromONNX(const char* buffer, size_t sizeBuffer, int engine) +{ + if (resolveOnnxEngine(engine) == ENGINE_ORT) + { +#ifdef HAVE_ONNXRUNTIME + CV_Error(Error::StsNotImplemented, "DNN/ONNX/ORT: loading from memory buffer is not supported"); +#else + CV_LOG_WARNING(NULL, "DNN/ONNX/ORT: OpenCV was built without ONNX Runtime (WITH_ONNXRUNTIME=OFF). Falling back to ENGINE_NEW."); +#endif + } + return readNetFromONNX2(buffer, sizeBuffer); +} + +Net readNetFromONNX(const std::vector& buffer, int engine) +{ + if (resolveOnnxEngine(engine) == ENGINE_ORT) + { +#ifdef HAVE_ONNXRUNTIME + CV_Error(Error::StsNotImplemented, "DNN/ONNX/ORT: loading from memory buffer is not supported"); +#else + CV_LOG_WARNING(NULL, "DNN/ONNX/ORT: OpenCV was built without ONNX Runtime (WITH_ONNXRUNTIME=OFF). Falling back to ENGINE_NEW."); +#endif + } + return readNetFromONNX2(buffer); } static int onnxDataTypeToCvDepth(int onnxType) @@ -98,319 +134,7 @@ static int onnxDataTypeToCvDepth(int onnxType) } } -class ONNXImporter -{ - FPDenormalsIgnoreHintScope fp_denormals_ignore_scope; - - opencv_onnx::ModelProto model_proto; - struct LayerInfo { - int layerId; - int outputId; - int depth; - LayerInfo(int _layerId = 0, int _outputId = 0, int _depth = CV_32F) - :layerId(_layerId), outputId(_outputId), depth(_depth) {} - }; - - struct TensorInfo { - int real_ndims; - int onnx_dtype; - TensorInfo(int _real_ndims = 0, int _onnx_dtype = 0) - : real_ndims(_real_ndims), onnx_dtype(_onnx_dtype) {} - }; - - std::map getGraphTensors( - const opencv_onnx::GraphProto& graph_proto); - Mat getBlob(const opencv_onnx::NodeProto& node_proto, int index); - Mat getBlob(const std::string& input_name); - Mat getIntBlob(const opencv_onnx::NodeProto& node_proto, int index); - TensorInfo getBlobExtraInfo(const opencv_onnx::NodeProto& node_proto, int index); - TensorInfo getBlobExtraInfo(const std::string& input_name); - - LayerParams getLayerParams(const opencv_onnx::NodeProto& node_proto); - - void addConstant(const std::string& name, const Mat& blob); - void addLayer(LayerParams& layerParams, - const opencv_onnx::NodeProto& node_proto, - int num_inputs = std::numeric_limits::max()); - void setParamsDtype(LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - - void lstm_extractConsts(LayerParams& layerParams, const opencv_onnx::NodeProto& lstm_proto, size_t idx, int* blobShape_, int size); - void lstm_add_reshape(const std::string& input_name, const std::string& output_name, int* layerShape, size_t n); - std::string lstm_add_slice(int index, const std::string& input_name, int* begin, int* end, size_t n); - std::string lstm_fix_dims(LayerParams& layerParams, const opencv_onnx::NodeProto& lstm_proto, - int batch_size, int num_directions, int hidden_size, bool need_y, const std::string& y_name, - const int index); - void lstm_add_transform(int num_directions, int batch_size, int hidden_size, - int index, const std::string& input_name, const std::string& output_name); -public: - ONNXImporter(Net& net, const char *onnxFile); - ONNXImporter(Net& net, const char* buffer, size_t sizeBuffer); - - void populateNet(); - -protected: - std::unique_ptr layerHandler; - Net& dstNet; - - opencv_onnx::GraphProto* graph_proto; - std::string framework_name; - - std::map constBlobs; - std::map constBlobsExtraInfo; - - std::map outShapes; // List of internal blobs shapes. - bool hasDynamicShapes; // Whether the model has inputs with dynamic shapes - typedef std::map::iterator IterShape_t; - - std::map layer_id; - typedef std::map::iterator IterLayerId_t; - typedef std::map::const_iterator ConstIterLayerId_t; - - void handleNode(const opencv_onnx::NodeProto& node_proto); - -private: - friend class ONNXLayerHandler; - typedef void (ONNXImporter::*ONNXImporterNodeParser)(LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - typedef std::map DispatchMap; - typedef std::map DomainDispatchMap; - - DomainDispatchMap domain_dispatch_map; - std::string getLayerTypeDomain(const opencv_onnx::NodeProto& node_proto); - const DispatchMap& getDispatchMap(const opencv_onnx::NodeProto& node_proto); - void buildDispatchMap_ONNX_AI(); - void buildDispatchMap_COM_MICROSOFT(); - - // Domain: 'ai.onnx' (default) - // URL: https://github.com/onnx/onnx/blob/master/docs/Operators.md - void parseArg (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseMaxUnpool (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseMaxPool (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseAveragePool (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseGlobalPool (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseReduce (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseSlice (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseSplit (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseNeg (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseConstant (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseLSTM (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseGRU (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseImageScaler (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseClip (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseLeakyRelu (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseRelu (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseElu (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseTanh (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseAbs (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parsePRelu (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseLRN (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseInstanceNormalization(LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseBatchNormalization (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseGemm (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseMatMul (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseConv (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseConvTranspose (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseTranspose (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseSqueeze (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseFlatten (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseUnsqueeze (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseExpand (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseReshape (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parsePad (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseShape (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseCast (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseConstantFill (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseGather (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseGatherElements (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseConcat (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseResize (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseUpsample (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseSoftMax (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseDetectionOutput (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseCumSum (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseElementWise (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseDepthSpaceOps (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseRange (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseRandomNormalLike (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseScatter (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseTile (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseLayerNorm (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseTopK (LayerParams& LayerParams, const opencv_onnx::NodeProto& node_proto); - void parseSimpleLayers (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseEinsum (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseHardmax (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseGatherND (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - - // Domain: com.microsoft - // URL: https://github.com/microsoft/onnxruntime/blob/master/docs/ContribOperators.md - void parseQuantDequant (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseQConv (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseQMatMul (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseQEltwise (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseQLeakyRelu (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseQSigmoid (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseQAvgPool (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseQConcat (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseQGemm (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseQSoftmax (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - void parseAttention (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - - // '???' domain or '???' layer type - void parseCustomLayer (LayerParams& layerParams, const opencv_onnx::NodeProto& node_proto); - - std::map onnx_opset_map; // map from OperatorSetIdProto - void parseOperatorSet(); - - const std::string str_domain_ai_onnx = "ai.onnx"; - const std::string str_domain_com_microsoft = "com.microsoft"; - - bool useLegacyNames; - bool getParamUseLegacyNames() - { - bool param = utils::getConfigurationParameterBool("OPENCV_DNN_ONNX_USE_LEGACY_NAMES", false); - return param; - } - std::string extractNodeName(const opencv_onnx::NodeProto& node_proto); - std::string onnxBasePath; - -}; - - -class ONNXLayerHandler : public detail::LayerHandler -{ -public: - explicit ONNXLayerHandler(ONNXImporter* importer_); - - void fillRegistry(const opencv_onnx::GraphProto& net); - -protected: - ONNXImporter* importer; -}; - -ONNXLayerHandler::ONNXLayerHandler(ONNXImporter* importer_) : importer(importer_){} - -void ONNXLayerHandler::fillRegistry(const opencv_onnx::GraphProto &net) -{ - int layersSize = net.node_size(); - for (int li = 0; li < layersSize; li++) { - const opencv_onnx::NodeProto &node_proto = net.node(li); - const std::string& name = node_proto.output(0); - const std::string& type = node_proto.op_type(); - const std::string& layer_type_domain = importer->getLayerTypeDomain(node_proto); - const auto& dispatch = importer->getDispatchMap(node_proto); - if (dispatch.find(type) == dispatch.end()) - { - addMissing(name, cv::format("%s.%s", layer_type_domain.c_str(), type.c_str())); - } - } - printMissing(); -} - -ONNXImporter::ONNXImporter(Net& net, const char *onnxFile) - : layerHandler(DNN_DIAGNOSTICS_RUN ? new ONNXLayerHandler(this) : nullptr) - , dstNet(net) - , useLegacyNames(getParamUseLegacyNames()) -{ - hasDynamicShapes = false; - CV_Assert(onnxFile); - CV_LOG_DEBUG(NULL, "DNN/ONNX: processing ONNX model from file: " << onnxFile); - - std::fstream input(onnxFile, std::ios::in | std::ios::binary); - if (!input) - { - CV_Error(Error::StsBadArg, cv::format("Can't read ONNX file: %s", onnxFile)); - } - - if (!model_proto.ParseFromIstream(&input)) - { - CV_Error(Error::StsUnsupportedFormat, cv::format("Failed to parse ONNX model: %s", onnxFile)); - } - onnxBasePath = utils::fs::getParent(onnxFile); - populateNet(); -} - -ONNXImporter::ONNXImporter(Net& net, const char* buffer, size_t sizeBuffer) - : layerHandler(DNN_DIAGNOSTICS_RUN ? new ONNXLayerHandler(this) : nullptr) - , dstNet(net) - , useLegacyNames(getParamUseLegacyNames()) -{ - hasDynamicShapes = false; - CV_LOG_DEBUG(NULL, "DNN/ONNX: processing in-memory ONNX model (" << sizeBuffer << " bytes)"); - - struct _Buf : public std::streambuf - { - _Buf(const char* buffer, size_t sizeBuffer) - { - char* p = const_cast(buffer); - setg(p, p, p + sizeBuffer); - } - }; - - _Buf buf(buffer, sizeBuffer); - std::istream input(&buf); - - if (!model_proto.ParseFromIstream(&input)) - CV_Error(Error::StsUnsupportedFormat, "Failed to parse onnx model from in-memory byte array."); - - populateNet(); -} - - -inline void replaceLayerParam(LayerParams& layerParams, const String& oldKey, const String& newKey) -{ - if (layerParams.has(oldKey)) { - layerParams.set(newKey, layerParams.get(oldKey)); - layerParams.erase(oldKey); - } -} - -static -void dumpValueInfoProto(int i, const opencv_onnx::ValueInfoProto& valueInfoProto, const std::string& prefix) -{ - CV_Assert(valueInfoProto.has_name()); - CV_Assert(valueInfoProto.has_type()); - const opencv_onnx::TypeProto& typeProto = valueInfoProto.type(); - CV_Assert(typeProto.has_tensor_type()); - const opencv_onnx::TypeProto::Tensor& tensor = typeProto.tensor_type(); - CV_Assert(tensor.has_shape()); - const opencv_onnx::TensorShapeProto& tensorShape = tensor.shape(); - - int dim_size = tensorShape.dim_size(); - CV_CheckGE(dim_size, 0, ""); - MatShape shape(dim_size); - for (int j = 0; j < dim_size; ++j) - { - const opencv_onnx::TensorShapeProto_Dimension& dimension = tensorShape.dim(j); - if (dimension.has_dim_param()) - { - CV_LOG_DEBUG(NULL, "DNN/ONNX: " << prefix << "[" << i << "] dim[" << j << "] = <" << dimension.dim_param() << "> (dynamic)"); - } - // https://github.com/onnx/onnx/blob/master/docs/DimensionDenotation.md#denotation-definition - if (dimension.has_denotation()) - { - CV_LOG_INFO(NULL, "DNN/ONNX: " << prefix << "[" << i << "] dim[" << j << "] denotation is '" << dimension.denotation() << "'"); - } - shape[j] = dimension.dim_value(); - } - CV_LOG_DEBUG(NULL, "DNN/ONNX: " << prefix << "[" << i << " as '" << valueInfoProto.name() << "'] shape=" << toString(shape)); -} - -static -void dumpTensorProto(int i, const opencv_onnx::TensorProto& tensorProto, const std::string& prefix) -{ - if (utils::logging::getLogLevel() < utils::logging::LOG_LEVEL_VERBOSE) - return; - int dim_size = tensorProto.dims_size(); - CV_CheckGE(dim_size, 0, ""); - MatShape shape(dim_size); - for (int j = 0; j < dim_size; ++j) - { - int sz = static_cast(tensorProto.dims(j)); - shape[j] = sz; - } - CV_LOG_VERBOSE(NULL, 0, "DNN/ONNX: " << prefix << "[" << i << " as '" << tensorProto.name() << "'] shape=" << toString(shape) << " data_type=" << (int)tensorProto.data_type()); -} - -void releaseONNXTensor(opencv_onnx::TensorProto& tensor_proto) +static void releaseONNXTensor(opencv_onnx::TensorProto& tensor_proto) { if (!tensor_proto.raw_data().empty()) { delete tensor_proto.release_raw_data(); diff --git a/modules/dnn/src/onnx/onnx_importer2.cpp b/modules/dnn/src/onnx/onnx_importer2.cpp index 2d7b5e1a6e..90feb2939c 100644 --- a/modules/dnn/src/onnx/onnx_importer2.cpp +++ b/modules/dnn/src/onnx/onnx_importer2.cpp @@ -722,7 +722,7 @@ Net ONNXImporter2::parseModel() sstrm << "DNN/ONNX: the model "; if (!onnxFilename.empty()) sstrm << "'" << onnxFilename << "' "; - sstrm << "cannot be loaded with the new parser. Trying the older parser. "; + sstrm << "cannot be loaded by the DNN engine."; if (!missing_ops.empty()) { sstrm << " Unsupported operations:\n"; auto it = missing_ops.begin(); @@ -778,7 +778,8 @@ bool ONNXImporter2::parseValueInfo(const opencv_onnx::ValueInfoProto& valueInfoP // ONNX allows dimensions without dim_value and dim_param. // Treat them as unnamed symbolic dimensions. // NOTE: LSTM with unnamed dimensions is not ready in the new graph - // engine yet, so force fallback to classic parser. + // engine yet. The classic parser used to handle it, but it has been + // removed, so such models are reported as unsupported. if (curr_graph_proto) { const int n_nodes = curr_graph_proto->node_size(); diff --git a/modules/dnn/src/tensorflow/tf_importer.cpp b/modules/dnn/src/tensorflow/tf_importer.cpp index c69e06c2a1..0204c6b1a5 100644 --- a/modules/dnn/src/tensorflow/tf_importer.cpp +++ b/modules/dnn/src/tensorflow/tf_importer.cpp @@ -3263,31 +3263,24 @@ void TFLayerHandler::handleFailed(const tensorflow::NodeDef& layer) } // namespace +// ENGINE_CLASSIC/ENGINE_AUTO have been removed; the TensorFlow importer always uses the new engine. +static void warnIfUnsupportedTfEngine(int engine) +{ + static const int engine_forced = + (int)utils::getConfigurationParameterSizeT("OPENCV_FORCE_DNN_ENGINE", ENGINE_NEW); + if (engine_forced == ENGINE_NEW) + engine = engine_forced; + if (engine != ENGINE_NEW) + CV_LOG_WARNING(NULL, "DNN/TF: only ENGINE_NEW is supported; " + "ENGINE_CLASSIC/ENGINE_AUTO are deprecated, using ENGINE_NEW."); +} + Net readNetFromTensorflow(const String &model, const String &config, int engine, const std::vector& extraOutputs) { - static const int engine_forced = utils::getConfigurationParameterSizeT("OPENCV_FORCE_DNN_ENGINE", ENGINE_AUTO); - if(engine_forced != ENGINE_AUTO) - engine = engine_forced; - - if (engine == ENGINE_AUTO) - { - try - { - return detail::readNetDiagnostic(model.c_str(), config.c_str(), - true, extraOutputs); - } - catch(const std::exception& e) - { - CV_LOG_WARNING(NULL, "Can't parse model with the new dnn engine, trying to parse with the old dnn engine: " << e.what()); - return detail::readNetDiagnostic(model.c_str(), config.c_str(), - false, extraOutputs); - } - } - else - { - return detail::readNetDiagnostic(model.c_str(), config.c_str(), engine == ENGINE_NEW || engine == ENGINE_AUTO, extraOutputs); - } + warnIfUnsupportedTfEngine(engine); + return detail::readNetDiagnostic(model.c_str(), config.c_str(), + /*newEngine*/ true, extraOutputs); } Net readNetFromTensorflow(const char* bufferModel, size_t lenModel, @@ -3295,26 +3288,9 @@ Net readNetFromTensorflow(const char* bufferModel, size_t lenModel, int engine, const std::vector& extraOutputs) { - static const int engine_forced = utils::getConfigurationParameterSizeT("OPENCV_FORCE_DNN_ENGINE", ENGINE_AUTO); - if(engine_forced != ENGINE_AUTO) - engine = engine_forced; - - if (engine == ENGINE_AUTO) - { - try - { - return detail::readNetDiagnostic(bufferModel, lenModel, bufferConfig, lenConfig, true, extraOutputs); - } - catch(const std::exception& e) - { - CV_LOG_WARNING(NULL, "Can't parse model with the new dnn engine, trying to parse with the old dnn engine: " << e.what()); - return detail::readNetDiagnostic(bufferModel, lenModel, bufferConfig, lenConfig, false, extraOutputs); - } - } - else - { - return detail::readNetDiagnostic(bufferModel, lenModel, bufferConfig, lenConfig, engine == ENGINE_NEW || engine == ENGINE_AUTO, extraOutputs); - } + warnIfUnsupportedTfEngine(engine); + return detail::readNetDiagnostic(bufferModel, lenModel, bufferConfig, lenConfig, + /*newEngine*/ true, extraOutputs); } Net readNetFromTensorflow(const std::vector& bufferModel, const std::vector& bufferConfig, int engine, diff --git a/modules/dnn/src/tflite/tflite_importer.cpp b/modules/dnn/src/tflite/tflite_importer.cpp index b09c4b612d..b2235428a7 100644 --- a/modules/dnn/src/tflite/tflite_importer.cpp +++ b/modules/dnn/src/tflite/tflite_importer.cpp @@ -1503,10 +1503,20 @@ void TFLiteImporter::getQuantParams(const Operator& op, float& inpScale, int& in } } -Net readNetFromTFLite(const String &modelPath, int engine) { - static const int engine_forced = utils::getConfigurationParameterSizeT("OPENCV_FORCE_DNN_ENGINE", ENGINE_AUTO); - if(engine_forced != ENGINE_AUTO) +// ENGINE_CLASSIC/ENGINE_AUTO have been removed; the TFLite importer always uses the new engine. +static void warnIfUnsupportedTFLiteEngine(int engine) +{ + static const int engine_forced = + (int)utils::getConfigurationParameterSizeT("OPENCV_FORCE_DNN_ENGINE", ENGINE_NEW); + if (engine_forced == ENGINE_NEW) engine = engine_forced; + if (engine != ENGINE_NEW) + CV_LOG_WARNING(NULL, "DNN/TFLite: only ENGINE_NEW is supported; " + "ENGINE_CLASSIC/ENGINE_AUTO are deprecated, using ENGINE_NEW."); +} + +Net readNetFromTFLite(const String &modelPath, int engine) { + warnIfUnsupportedTFLiteEngine(engine); Net net; @@ -1526,7 +1536,7 @@ Net readNetFromTFLite(const String &modelPath, int engine) { ifs.read(content.data(), sz); CV_Assert(!ifs.bad()); - TFLiteImporter(net, content.data(), content.size(), engine == ENGINE_NEW || engine == ENGINE_AUTO); + TFLiteImporter(net, content.data(), content.size(), /*newEngine*/ true); return net; } @@ -1535,12 +1545,10 @@ Net readNetFromTFLite(const std::vector& bufferModel, int engine) { } Net readNetFromTFLite(const char *bufferModel, size_t bufSize, int engine) { - static const int engine_forced = utils::getConfigurationParameterSizeT("OPENCV_FORCE_DNN_ENGINE", ENGINE_AUTO); - if(engine_forced != ENGINE_AUTO) - engine = engine_forced; + warnIfUnsupportedTFLiteEngine(engine); Net net; - TFLiteImporter(net, bufferModel, bufSize, engine == ENGINE_NEW || engine == ENGINE_AUTO); + TFLiteImporter(net, bufferModel, bufSize, /*newEngine*/ true); return net; } diff --git a/modules/dnn/test/test_backends.cpp b/modules/dnn/test/test_backends.cpp index b47a52dec7..bcd791f738 100644 --- a/modules/dnn/test/test_backends.cpp +++ b/modules/dnn/test/test_backends.cpp @@ -269,13 +269,6 @@ TEST_P(DNNTestNetwork, SSD_VGG16) if (backend == DNN_BACKEND_INFERENCE_ENGINE_NGRAPH) applyTestTag(CV_TEST_TAG_DNN_SKIP_IE_NGRAPH); - auto engine_forced = static_cast( - cv::utils::getConfigurationParameterSizeT("OPENCV_FORCE_DNN_ENGINE", cv::dnn::ENGINE_AUTO)); - if (engine_forced == cv::dnn::ENGINE_CLASSIC) - { - applyTestTag(CV_TEST_TAG_DNN_SKIP_PARSER); - return; - } Mat sample = imread(findDataFile("dnn/street.png")); Mat inp = blobFromImage(sample, 1.0f, Size(300, 300), Scalar(), false); diff --git a/modules/dnn/test/test_caffe_importer.cpp b/modules/dnn/test/test_caffe_importer.cpp index 7f031bd760..3638f22400 100644 --- a/modules/dnn/test/test_caffe_importer.cpp +++ b/modules/dnn/test/test_caffe_importer.cpp @@ -90,17 +90,6 @@ TEST(Reproducibility_SSD, Accuracy) CV_TEST_TAG_DEBUG_VERYLONG ); - // The classic engine importer no longer carries the Caffe-SSD specific - // handling (LpNormalization/DetectionOutput); this model is supported on - // the new engine only. - auto engine_forced = static_cast( - cv::utils::getConfigurationParameterSizeT("OPENCV_FORCE_DNN_ENGINE", cv::dnn::ENGINE_AUTO)); - if (engine_forced == cv::dnn::ENGINE_CLASSIC) - { - applyTestTag(CV_TEST_TAG_DNN_SKIP_PARSER); - return; - } - Net net = readNetFromONNX(findDataFile("dnn/onnx/models/ssd_vgg16.onnx", false)); ASSERT_FALSE(net.empty()); net.setPreferableBackend(DNN_BACKEND_OPENCV); diff --git a/modules/dnn/test/test_darknet_importer.cpp b/modules/dnn/test/test_darknet_importer.cpp index 45a3a8c8d1..a5000dd832 100644 --- a/modules/dnn/test/test_darknet_importer.cpp +++ b/modules/dnn/test/test_darknet_importer.cpp @@ -55,13 +55,6 @@ static std::string _tf(TString filename) TEST(Test_YOLO, read_yolov4_onnx) { - auto engine_forced = static_cast( - cv::utils::getConfigurationParameterSizeT("OPENCV_FORCE_DNN_ENGINE", cv::dnn::ENGINE_AUTO)); - if (engine_forced == cv::dnn::ENGINE_CLASSIC) - { - applyTestTag(CV_TEST_TAG_DNN_SKIP_PARSER); - return; - } Net net = readNet(findDataFile("dnn/yolov4.onnx", false)); ASSERT_FALSE(net.empty()); } @@ -78,14 +71,6 @@ public: float nmsThreshold = 0.4, bool useWinograd = true, int zeroPadW = 0, Size inputSize = Size()) { - auto engine_forced = static_cast( - cv::utils::getConfigurationParameterSizeT("OPENCV_FORCE_DNN_ENGINE", cv::dnn::ENGINE_AUTO)); - if (engine_forced == cv::dnn::ENGINE_CLASSIC) - { - applyTestTag(CV_TEST_TAG_DNN_SKIP_PARSER); - return; - } - checkBackend(); Mat img1 = imread(_tf("dog416.png")); diff --git a/modules/dnn/test/test_graph_simplifier.cpp b/modules/dnn/test/test_graph_simplifier.cpp index 59d527acef..99814d970d 100644 --- a/modules/dnn/test/test_graph_simplifier.cpp +++ b/modules/dnn/test/test_graph_simplifier.cpp @@ -153,9 +153,7 @@ TEST_F(Test_Graph_Simplifier, BiasedMatMulSubgraph) { /* Test for 1 subgraphs - BiasedMatMulSubgraph */ - auto engine_forced = static_cast( - cv::utils::getConfigurationParameterSizeT("OPENCV_FORCE_DNN_ENGINE", cv::dnn::ENGINE_AUTO)); - const std::string expected = engine_forced == cv::dnn::ENGINE_CLASSIC ? "MatMul" : "Gemm"; + const std::string expected = "Gemm"; test("biased_matmul", expected); } diff --git a/modules/dnn/test/test_layers.cpp b/modules/dnn/test/test_layers.cpp index c5e6a665e2..27f2f69610 100644 --- a/modules/dnn/test/test_layers.cpp +++ b/modules/dnn/test/test_layers.cpp @@ -2249,17 +2249,6 @@ TEST(Layer_LSTM, repeatedInference) TEST(Layer_If, resize) { - // Skip this test when the classic DNN engine is explicitly requested. The - // "if" layer is supported only by the new engine. - auto engine_forced = static_cast( - cv::utils::getConfigurationParameterSizeT("OPENCV_FORCE_DNN_ENGINE", cv::dnn::ENGINE_AUTO)); - if (engine_forced == cv::dnn::ENGINE_CLASSIC) - { - // Mark the test as skipped and exit early. - applyTestTag(CV_TEST_TAG_DNN_SKIP_PARSER); - return; - } - const std::string imgname = findDataFile("cv/shared/lena.png", true); const std::string modelname = findDataFile("dnn/onnx/models/if_layer.onnx", true); @@ -2286,14 +2275,6 @@ TEST(Layer_If, resize) TEST(Layer_If, subgraph_name_scoping) { - auto engine_forced = static_cast( - cv::utils::getConfigurationParameterSizeT("OPENCV_FORCE_DNN_ENGINE", cv::dnn::ENGINE_AUTO)); - if (engine_forced == cv::dnn::ENGINE_CLASSIC) - { - applyTestTag(CV_TEST_TAG_DNN_SKIP_PARSER); - return; - } - const std::string modelname = findDataFile("dnn/onnx/models/subgraph_name_scoping.onnx", true); dnn::Net net = dnn::readNetFromONNX(modelname, ENGINE_NEW); @@ -2331,14 +2312,6 @@ TEST(Layer_If, subgraph_name_scoping) TEST(Layer_Size, onnx_1d) { - auto engine_forced = static_cast( - cv::utils::getConfigurationParameterSizeT("OPENCV_FORCE_DNN_ENGINE", cv::dnn::ENGINE_AUTO)); - if (engine_forced == cv::dnn::ENGINE_CLASSIC) - { - applyTestTag(CV_TEST_TAG_DNN_SKIP_PARSER); - return; - } - const std::string modelname = findDataFile("dnn/onnx/models/test_size_1d_model.onnx", true); cv::dnn::Net net = cv::dnn::readNetFromONNX(modelname, ENGINE_NEW); @@ -2358,14 +2331,6 @@ TEST(Layer_Size, onnx_1d) TEST(Layer_Size, onnx_0d_scalar) { - auto engine_forced = static_cast( - cv::utils::getConfigurationParameterSizeT("OPENCV_FORCE_DNN_ENGINE", cv::dnn::ENGINE_AUTO)); - if (engine_forced == cv::dnn::ENGINE_CLASSIC) - { - applyTestTag(CV_TEST_TAG_DNN_SKIP_PARSER); - return; - } - const std::string modelname = findDataFile("dnn/onnx/models/test_size_0d_model.onnx", true); cv::dnn::Net net = cv::dnn::readNetFromONNX(modelname, ENGINE_NEW); @@ -2430,15 +2395,6 @@ class TESTKVCache : public testing::TestWithParam public: void testKVCache(const std::string& layout) { - auto engine_forced = static_cast( - cv::utils::getConfigurationParameterSizeT("OPENCV_FORCE_DNN_ENGINE", cv::dnn::ENGINE_AUTO)); - if (engine_forced == cv::dnn::ENGINE_CLASSIC) - { - // Mark the test as skipped and exit early. - applyTestTag(CV_TEST_TAG_DNN_SKIP_PARSER); - return; - } - std::string model_path = "dnn/onnx/models/test_attention_kv_cache_" + layout + ".onnx"; Net netWithKVCache = readNetFromONNX(findDataFile(model_path, true), cv::dnn::ENGINE_NEW); diff --git a/modules/dnn/test/test_model.cpp b/modules/dnn/test/test_model.cpp index 28d04d04ba..6111b232b7 100644 --- a/modules/dnn/test/test_model.cpp +++ b/modules/dnn/test/test_model.cpp @@ -798,13 +798,6 @@ TEST_P(Reproducibility_ViT_ONNX, Accuracy) Target targetId = GetParam(); applyTestTag(targetId == DNN_TARGET_CPU ? CV_TEST_TAG_MEMORY_1GB : CV_TEST_TAG_MEMORY_2GB); ASSERT_TRUE(ocl::useOpenCL() || targetId == DNN_TARGET_CPU || targetId == DNN_TARGET_CPU_FP16); - auto engine_forced = static_cast( - cv::utils::getConfigurationParameterSizeT("OPENCV_FORCE_DNN_ENGINE", ENGINE_AUTO)); - if (engine_forced == ENGINE_CLASSIC) - { - applyTestTag(CV_TEST_TAG_DNN_SKIP_PARSER); - return; - } std::string modelname = _tf("vit_base_patch16_224_Opset16.onnx", false); Net net = readNetFromONNX(modelname); @@ -859,13 +852,6 @@ TEST_P(Reproducibility_BERT_ONNX, Accuracy) Target targetId = GetParam(); ASSERT_TRUE(ocl::useOpenCL() || targetId == DNN_TARGET_CPU || targetId == DNN_TARGET_CPU_FP16); - auto engine_forced = static_cast( - cv::utils::getConfigurationParameterSizeT("OPENCV_FORCE_DNN_ENGINE", ENGINE_AUTO)); - if (engine_forced == ENGINE_CLASSIC) - { - applyTestTag(CV_TEST_TAG_DNN_SKIP_PARSER); - return; - } std::string modelname = _tf("onnx/models/bert.onnx", false); Net net = readNetFromONNX(modelname); @@ -931,14 +917,6 @@ typedef testing::TestWithParam Reproducibility_MobileNetSSD_ONNX; TEST_P(Reproducibility_MobileNetSSD_ONNX, Accuracy) { Target targetId = GetParam(); - auto engine_forced = static_cast( - cv::utils::getConfigurationParameterSizeT("OPENCV_FORCE_DNN_ENGINE", ENGINE_AUTO)); - if (engine_forced == ENGINE_CLASSIC) - { - applyTestTag(CV_TEST_TAG_DNN_SKIP_PARSER); - return; - } - applyTestTag(targetId == DNN_TARGET_CPU ? CV_TEST_TAG_MEMORY_512MB : CV_TEST_TAG_MEMORY_1GB); ASSERT_TRUE(ocl::useOpenCL() || targetId == DNN_TARGET_CPU || targetId == DNN_TARGET_CPU_FP16); @@ -1265,14 +1243,6 @@ INSTANTIATE_TEST_CASE_P(/**/, Reproducibility_YOLOXS_ONNX, typedef testing::TestWithParam Reproducibility_BlazeFace_ONNX; TEST_P(Reproducibility_BlazeFace_ONNX, Accuracy) { - auto engine_forced = static_cast( - cv::utils::getConfigurationParameterSizeT("OPENCV_FORCE_DNN_ENGINE", cv::dnn::ENGINE_AUTO)); - if (engine_forced == cv::dnn::ENGINE_CLASSIC) - { - applyTestTag(CV_TEST_TAG_DNN_SKIP_PARSER); - return; - } - Target targetId = GetParam(); applyTestTag(targetId == DNN_TARGET_CPU ? CV_TEST_TAG_MEMORY_512MB : CV_TEST_TAG_MEMORY_1GB); ASSERT_TRUE(ocl::useOpenCL() || targetId == DNN_TARGET_CPU || targetId == DNN_TARGET_CPU_FP16); @@ -1381,14 +1351,6 @@ TEST_P(Reproducibility_SwinIR_ONNX, Accuracy) Target targetId = GetParam(); applyTestTag(CV_TEST_TAG_MEMORY_512MB, CV_TEST_TAG_LONG); - auto engine_forced = static_cast( - cv::utils::getConfigurationParameterSizeT("OPENCV_FORCE_DNN_ENGINE", ENGINE_AUTO)); - if (engine_forced == ENGINE_CLASSIC) - { - applyTestTag(CV_TEST_TAG_DNN_SKIP_PARSER); - return; - } - std::string modelname = _tf("onnx/models/swinir_x4_gan.onnx", false); Net net = readNetFromONNX(modelname, ENGINE_NEW); ASSERT_FALSE(net.empty()); diff --git a/modules/dnn/test/test_nms.cpp b/modules/dnn/test/test_nms.cpp index 423bedf95e..9ed85155bc 100644 --- a/modules/dnn/test/test_nms.cpp +++ b/modules/dnn/test/test_nms.cpp @@ -109,13 +109,6 @@ TEST(SoftNMS, Accuracy) // NMS with dynamic output shapes is only supported by the new engine. TEST(NMS, ZeroDetections_Reshape) { - auto engine_forced = static_cast( - cv::utils::getConfigurationParameterSizeT("OPENCV_FORCE_DNN_ENGINE", cv::dnn::ENGINE_AUTO)); - if (engine_forced == cv::dnn::ENGINE_CLASSIC) - { - applyTestTag(CV_TEST_TAG_DNN_SKIP_PARSER); - return; - } std::string onnxmodel = findDataFile("dnn/onnx/models/nms_reshape_empty.onnx"); cv::dnn::Net net = cv::dnn::readNetFromONNX(onnxmodel); diff --git a/modules/dnn/test/test_onnx_conformance.cpp b/modules/dnn/test/test_onnx_conformance.cpp index 21b4226f5f..37483d944a 100644 --- a/modules/dnn/test/test_onnx_conformance.cpp +++ b/modules/dnn/test/test_onnx_conformance.cpp @@ -1937,18 +1937,6 @@ public: #include "test_onnx_conformance_layer_filter_opencv_ocl_fp32_denylist.inl.hpp" }; - EngineType engine_forced = - (EngineType)utils::getConfigurationParameterSizeT( - "OPENCV_FORCE_DNN_ENGINE", ENGINE_AUTO); - - if (engine_forced == ENGINE_CLASSIC) { - classic_deny_list = { -#include "test_onnx_conformance_layer_filter_opencv_classic_denylist.inl.hpp" - }; - } else { - classic_deny_list = {}; - } - #ifdef HAVE_HALIDE halide_deny_list = { #include "test_onnx_conformance_layer_filter__halide_denylist.inl.hpp" diff --git a/modules/dnn/test/test_onnx_importer.cpp b/modules/dnn/test/test_onnx_importer.cpp index 7e53228ad6..fdbee029e3 100644 --- a/modules/dnn/test/test_onnx_importer.cpp +++ b/modules/dnn/test/test_onnx_importer.cpp @@ -217,14 +217,6 @@ public: // output against an in-test attention reference computed from the same inputs. void testSDPAModel(const String& basename, double l1, double lInf) { - // SDPA is only handled by the new-engine ONNX importer. - auto engine_forced = static_cast( - cv::utils::getConfigurationParameterSizeT("OPENCV_FORCE_DNN_ENGINE", cv::dnn::ENGINE_AUTO)); - if (engine_forced == cv::dnn::ENGINE_CLASSIC) { - applyTestTag(CV_TEST_TAG_DNN_SKIP_PARSER); - return; - } - Mat Q = blobFromNPY(_tf("data/input_" + basename + "_0.npy")); Mat KT = blobFromNPY(_tf("data/input_" + basename + "_1.npy")); Mat V = blobFromNPY(_tf("data/input_" + basename + "_2.npy")); @@ -2323,14 +2315,6 @@ TEST_P(Test_ONNX_layers, Gemm_External_Data) TEST_P(Test_ONNX_layers, Quantized_MatMul_Variable_Weights) { - auto engine_forced = static_cast( - cv::utils::getConfigurationParameterSizeT("OPENCV_FORCE_DNN_ENGINE", cv::dnn::ENGINE_AUTO)); - if (engine_forced == cv::dnn::ENGINE_CLASSIC) - { - applyTestTag(CV_TEST_TAG_DNN_SKIP_PARSER); - return; - } - testONNXModels("quantized_matmul_variable_inputs", npy, 1.3, 1.3); } @@ -3774,7 +3758,7 @@ 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)); + cv::utils::getConfigurationParameterSizeT("OPENCV_FORCE_DNN_ENGINE", cv::dnn::ENGINE_NEW)); if (engine_forced == cv::dnn::ENGINE_ORT) applyTestTag(CV_TEST_TAG_DNN_SKIP_PARSER); diff --git a/modules/dnn/test/test_tf_importer.cpp b/modules/dnn/test/test_tf_importer.cpp index 4e5e464274..443b4a0f89 100644 --- a/modules/dnn/test/test_tf_importer.cpp +++ b/modules/dnn/test/test_tf_importer.cpp @@ -1813,7 +1813,7 @@ TEST_P(Test_TensorFlow_nets, Mask_RCNN) outNames[0] = "detection_out_final"; outNames[1] = "detection_masks"; - Net net = readNetFromTensorflow(model, proto, ENGINE_AUTO, outNames); + Net net = readNetFromTensorflow(model, proto, ENGINE_NEW, outNames); Mat refDetections = blobFromNPY(path("mask_rcnn_inception_v2_coco_2018_01_28.detection_out.npy")); Mat refMasks = blobFromNPY(path("mask_rcnn_inception_v2_coco_2018_01_28.detection_masks.npy")); Mat blob = blobFromImage(img, 1.0f, Size(800, 800), Scalar(), true, false); diff --git a/modules/features/test/test_aliked_lightglue.cpp b/modules/features/test/test_aliked_lightglue.cpp index 4d92c4dbce..4c166ea17b 100644 --- a/modules/features/test/test_aliked_lightglue.cpp +++ b/modules/features/test/test_aliked_lightglue.cpp @@ -8,18 +8,9 @@ #ifdef HAVE_OPENCV_DNN #include "opencv2/dnn.hpp" -#include "opencv2/core/utils/configuration.private.hpp" namespace opencv_test { namespace { -static void skipIfClassicDnnEngine() -{ - const auto engine = static_cast( - cv::utils::getConfigurationParameterSizeT("OPENCV_FORCE_DNN_ENGINE", cv::dnn::ENGINE_AUTO)); - if (engine == cv::dnn::ENGINE_CLASSIC) - throw SkipTestException("ALIKED/LightGlue reference outputs are generated with the new DNN engine"); -} - TEST(Features2d_ALIKED, Regression) { applyTestTag( CV_TEST_TAG_MEMORY_2GB); diff --git a/modules/features/test/test_disk.cpp b/modules/features/test/test_disk.cpp index 56ca784c73..05a67a574a 100644 --- a/modules/features/test/test_disk.cpp +++ b/modules/features/test/test_disk.cpp @@ -14,17 +14,8 @@ namespace opencv_test { namespace { -static void skipIfClassicDnnEngine() -{ - const auto engine = static_cast( - cv::utils::getConfigurationParameterSizeT("OPENCV_FORCE_DNN_ENGINE", cv::dnn::ENGINE_AUTO)); - if (engine == cv::dnn::ENGINE_CLASSIC) - throw SkipTestException("DISK ONNX model is not supported by the classic DNN engine"); -} - static void testDiskRegression(const Size& imageSize, const std::string& tag) { - skipIfClassicDnnEngine(); applyTestTag(CV_TEST_TAG_MEMORY_2GB); Mat refKpts = blobFromNPY(cvtest::findDataFile("features/disk/box_in_scene_" + tag + "_kpts.npy")); @@ -84,7 +75,6 @@ TEST(Features2d_DISK, regression_512x384) TEST(Features2d_DISK, MaxKeypointsAndThreshold) { - skipIfClassicDnnEngine(); applyTestTag(CV_TEST_TAG_MEMORY_2GB); const std::string modelPath = cvtest::findDataFile("dnn/disk.onnx", false); @@ -124,7 +114,6 @@ TEST(Features2d_DISK, MaxKeypointsAndThreshold) TEST(Features2d_DISK, MaskSupport) { - skipIfClassicDnnEngine(); applyTestTag(CV_TEST_TAG_MEMORY_2GB); const std::string modelPath = cvtest::findDataFile("dnn/disk.onnx", false); @@ -153,7 +142,6 @@ TEST(Features2d_DISK, MaskSupport) TEST(Features2d_DISK, InvalidImageSize) { - skipIfClassicDnnEngine(); const std::string modelPath = cvtest::findDataFile("dnn/disk.onnx", false); EXPECT_THROW(DISK::create(modelPath, -1, 0.0f, Size(1000, 1024)), cv::Exception); diff --git a/modules/video/src/tracking/tracker_nano.cpp b/modules/video/src/tracking/tracker_nano.cpp index 643a3ed571..86c7e12785 100644 --- a/modules/video/src/tracking/tracker_nano.cpp +++ b/modules/video/src/tracking/tracker_nano.cpp @@ -88,12 +88,8 @@ class TrackerNanoImpl : public TrackerNano public: TrackerNanoImpl(const TrackerNano::Params& parameters) { - dnn::EngineType engine = dnn::ENGINE_AUTO; - if (parameters.backend != 0 || parameters.target != 0){ - engine = dnn::ENGINE_CLASSIC; - } - backbone = dnn::readNet(parameters.backbone, "", "", engine); - neckhead = dnn::readNet(parameters.neckhead, "", "", engine); + backbone = dnn::readNet(parameters.backbone); + neckhead = dnn::readNet(parameters.neckhead); CV_Assert(!backbone.empty()); CV_Assert(!neckhead.empty()); diff --git a/modules/video/src/tracking/tracker_vit.cpp b/modules/video/src/tracking/tracker_vit.cpp index 53797e3391..7335b76b19 100644 --- a/modules/video/src/tracking/tracker_vit.cpp +++ b/modules/video/src/tracking/tracker_vit.cpp @@ -43,11 +43,7 @@ class TrackerVitImpl : public TrackerVit public: TrackerVitImpl(const TrackerVit::Params& parameters) { - dnn::EngineType engine = dnn::ENGINE_AUTO; - if (parameters.backend != 0 || parameters.target != 0){ - engine = dnn::ENGINE_CLASSIC; - } - net = dnn::readNet(parameters.net, "", "", engine); + net = dnn::readNet(parameters.net); CV_Assert(!net.empty()); net.setPreferableBackend(parameters.backend);