Merge remote-tracking branch 'upstream/3.4' into merge-3.4
authorAlexander Alekhin <alexander.a.alekhin@gmail.com>
Sat, 11 Sep 2021 16:32:13 +0000 (16:32 +0000)
committerAlexander Alekhin <alexander.a.alekhin@gmail.com>
Sat, 11 Sep 2021 21:27:26 +0000 (21:27 +0000)
18 files changed:
1  2 
cmake/OpenCVDetectInferenceEngine.cmake
modules/core/include/opencv2/core/ocl.hpp
modules/core/src/matmul.dispatch.cpp
modules/core/src/ocl.cpp
modules/dnn/src/layers/batch_norm_layer.cpp
modules/dnn/src/layers/elementwise_layers.cpp
modules/dnn/src/layers/mvn_layer.cpp
modules/dnn/src/layers/resize_layer.cpp
modules/dnn/src/layers/slice_layer.cpp
modules/dnn/src/ocl4dnn/src/ocl4dnn_conv_spatial.cpp
modules/dnn/src/onnx/onnx_graph_simplifier.cpp
modules/dnn/src/onnx/onnx_importer.cpp
modules/dnn/src/tensorflow/tf_importer.cpp
modules/dnn/test/test_onnx_importer.cpp
modules/dnn/test/test_tf_importer.cpp
modules/features2d/include/opencv2/features2d.hpp
modules/python/src2/hdr_parser.py
platforms/winpack_dldt/build_package.py

@@@ -478,29 -407,164 +478,29 @@@ public
      template<typename _Tp> int set(int i, const _Tp& value)
      { return set(i, &value, sizeof(value)); }
  
 -    template<typename _Tp0>
 -    Kernel& args(const _Tp0& a0)
 -    {
 -        set(0, a0); return *this;
 -    }
 -
 -    template<typename _Tp0, typename _Tp1>
 -    Kernel& args(const _Tp0& a0, const _Tp1& a1)
 -    {
 -        int i = set(0, a0); set(i, a1); return *this;
 -    }
 -
 -    template<typename _Tp0, typename _Tp1, typename _Tp2>
 -    Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2)
 -    {
 -        int i = set(0, a0); i = set(i, a1); set(i, a2); return *this;
 -    }
 -
 -    template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3>
 -    Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3)
 -    {
 -        int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); return *this;
 -    }
 -
 -    template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4>
 -    Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2,
 -                 const _Tp3& a3, const _Tp4& a4)
 -    {
 -        int i = set(0, a0); i = set(i, a1); i = set(i, a2);
 -        i = set(i, a3); set(i, a4); return *this;
 -    }
 -
 -    template<typename _Tp0, typename _Tp1, typename _Tp2,
 -             typename _Tp3, typename _Tp4, typename _Tp5>
 -    Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2,
 -                 const _Tp3& a3, const _Tp4& a4, const _Tp5& a5)
 -    {
 -        int i = set(0, a0); i = set(i, a1); i = set(i, a2);
 -        i = set(i, a3); i = set(i, a4); set(i, a5); return *this;
 -    }
 -
 -    template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
 -             typename _Tp4, typename _Tp5, typename _Tp6>
 -    Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
 -                 const _Tp4& a4, const _Tp5& a5, const _Tp6& a6)
 -    {
 -        int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3);
 -        i = set(i, a4); i = set(i, a5); set(i, a6); return *this;
 -    }
 -
 -    template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
 -             typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7>
 -    Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
 -                 const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7)
 -    {
 -        int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3);
 -        i = set(i, a4); i = set(i, a5); i = set(i, a6); set(i, a7); return *this;
 -    }
 -
 -    template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4,
 -             typename _Tp5, typename _Tp6, typename _Tp7, typename _Tp8>
 -    Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
 -                 const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
 -                 const _Tp8& a8)
 -    {
 -        int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4);
 -        i = set(i, a5); i = set(i, a6); i = set(i, a7); set(i, a8); return *this;
 -    }
 -
 -    template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4,
 -             typename _Tp5, typename _Tp6, typename _Tp7, typename _Tp8, typename _Tp9>
 -    Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
 -                 const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
 -                 const _Tp8& a8, const _Tp9& a9)
 -    {
 -        int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4); i = set(i, a5);
 -        i = set(i, a6); i = set(i, a7); i = set(i, a8); set(i, a9); return *this;
 -    }
 -
 -    template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
 -             typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
 -             typename _Tp8, typename _Tp9, typename _Tp10>
 -    Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
 -                 const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
 -                 const _Tp8& a8, const _Tp9& a9, const _Tp10& a10)
 -    {
 -        int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4); i = set(i, a5);
 -        i = set(i, a6); i = set(i, a7); i = set(i, a8); i = set(i, a9); set(i, a10); return *this;
 -    }
 -
 -    template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
 -             typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
 -             typename _Tp8, typename _Tp9, typename _Tp10, typename _Tp11>
 -    Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
 -                 const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
 -                 const _Tp8& a8, const _Tp9& a9, const _Tp10& a10, const _Tp11& a11)
 -    {
 -        int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4); i = set(i, a5);
 -        i = set(i, a6); i = set(i, a7); i = set(i, a8); i = set(i, a9); i = set(i, a10); set(i, a11); return *this;
 -    }
 -
 -    template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
 -             typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
 -             typename _Tp8, typename _Tp9, typename _Tp10, typename _Tp11, typename _Tp12>
 -    Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
 -                 const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
 -                 const _Tp8& a8, const _Tp9& a9, const _Tp10& a10, const _Tp11& a11,
 -                 const _Tp12& a12)
 -    {
 -        int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4); i = set(i, a5);
 -        i = set(i, a6); i = set(i, a7); i = set(i, a8); i = set(i, a9); i = set(i, a10); i = set(i, a11);
 -        set(i, a12); return *this;
 -    }
 -
 -    template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
 -             typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
 -             typename _Tp8, typename _Tp9, typename _Tp10, typename _Tp11, typename _Tp12,
 -             typename _Tp13>
 -    Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
 -                 const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
 -                 const _Tp8& a8, const _Tp9& a9, const _Tp10& a10, const _Tp11& a11,
 -                 const _Tp12& a12, const _Tp13& a13)
 -    {
 -        int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4); i = set(i, a5);
 -        i = set(i, a6); i = set(i, a7); i = set(i, a8); i = set(i, a9); i = set(i, a10); i = set(i, a11);
 -        i = set(i, a12); set(i, a13); return *this;
 -    }
  
 -    template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
 -             typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
 -             typename _Tp8, typename _Tp9, typename _Tp10, typename _Tp11, typename _Tp12,
 -             typename _Tp13, typename _Tp14>
 -    Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
 -                 const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
 -                 const _Tp8& a8, const _Tp9& a9, const _Tp10& a10, const _Tp11& a11,
 -                 const _Tp12& a12, const _Tp13& a13, const _Tp14& a14)
 -    {
 -        int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4); i = set(i, a5);
 -        i = set(i, a6); i = set(i, a7); i = set(i, a8); i = set(i, a9); i = set(i, a10); i = set(i, a11);
 -        i = set(i, a12); i = set(i, a13); set(i, a14); return *this;
 -    }
 -
 -    template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
 -             typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
 -             typename _Tp8, typename _Tp9, typename _Tp10, typename _Tp11, typename _Tp12,
 -             typename _Tp13, typename _Tp14, typename _Tp15>
 -    Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
 -                 const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
 -                 const _Tp8& a8, const _Tp9& a9, const _Tp10& a10, const _Tp11& a11,
 -                 const _Tp12& a12, const _Tp13& a13, const _Tp14& a14, const _Tp15& a15)
 -    {
 -        int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4); i = set(i, a5);
 -        i = set(i, a6); i = set(i, a7); i = set(i, a8); i = set(i, a9); i = set(i, a10); i = set(i, a11);
 -        i = set(i, a12); i = set(i, a13); i = set(i, a14); set(i, a15); return *this;
 -    }
 +protected:
 +    template<typename _Tp0> inline
 +    int set_args_(int i, const _Tp0& a0) { return set(i, a0); }
 +    template<typename _Tp0, typename... _Tps> inline
 +    int set_args_(int i, const _Tp0& a0, const _Tps&... rest_args) { i = set(i, a0); return set_args_(i, rest_args...); }
 +public:
 +    /** @brief Setup OpenCL Kernel arguments.
 +    Avoid direct using of set(i, ...) methods.
 +    @code
 +    bool ok = kernel
 +        .args(
 +            srcUMat, dstUMat,
 +            (float)some_float_param
 +        ).run(ndims, globalSize, localSize);
 +    if (!ok) return false;
 +    @endcode
 +    */
 +    template<typename... _Tps> inline
 +    Kernel& args(const _Tps&... kernel_args) { set_args_(0, kernel_args...); return *this; }
  
+     /** @brief Run the OpenCL kernel (globalsize value may be adjusted)
  
-     /** @brief Run the OpenCL kernel.
      @param dims the work problem dimensions. It is the length of globalsize and localsize. It can be either 1, 2 or 3.
      @param globalsize work items for each dimension. It is not the final globalsize passed to
        OpenCL. Each dimension will be adjusted to the nearest integer divisible by the corresponding
  //M*/
  
  #include "precomp.hpp"
+ #include <opencv2/core/utils/logger.hpp>
  #include "opencl_kernels_core.hpp"
 -#include "opencv2/core/opencl/runtime/opencl_clamdblas.hpp"
 +#include "opencv2/core/opencl/runtime/opencl_clblas.hpp"
  #include "opencv2/core/opencl/runtime/opencl_core.hpp"
  #include "intel_gpu_gemm.inl.hpp"
  
Simple merge
Simple merge
@@@ -64,9 -59,54 +64,11 @@@ class ONNXImporte
      void addLayer(LayerParams& layerParams,
                    const opencv_onnx::NodeProto& node_proto);
  
+     void expandMid(const std::string& prefix, opencv_onnx::NodeProto& node_proto,
+                    const std::string& input, size_t n);
  public:
 -
 -    ONNXImporter(Net& net, const char *onnxFile)
 -        : dstNet(net), dispatch(buildDispatchMap())
 -    {
 -        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));
 -        }
 -
 -        populateNet();
 -    }
 -
 -    ONNXImporter(Net& net, const char* buffer, size_t sizeBuffer)
 -        : dstNet(net), dispatch(buildDispatchMap())
 -    {
 -        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<char*>(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();
 -    }
 +    ONNXImporter(Net& net, const char *onnxFile);
 +    ONNXImporter(Net& net, const char* buffer, size_t sizeBuffer);
  
      void populateNet();
  
@@@ -486,6 -429,37 +488,37 @@@ void ONNXImporter::addLayer(LayerParams
      }
  }
  
 -        copyLP.name = format("%s/copy_%d", prefix.c_str(), j);
+ /** @brief Make N copies of input layer and set them as input to node_proto.
+  * @param prefix prefix of new layers' names
+  * @param node_proto node which will contain all copies as inputs
+  * @param input name of the node to copy
+  * @param n number of copies
+  */
+ void ONNXImporter::expandMid(const std::string& prefix, opencv_onnx::NodeProto& node_proto,
+                              const std::string& input, size_t n)
+ {
+     std::vector<std::string> input_names;
+     input_names.reserve(n);
+     for (size_t j = 0; j < n; j++)
+     {
+         LayerParams copyLP;
++        copyLP.name = format("%s/copy_%zu", prefix.c_str(), j);
+         copyLP.type = "Identity";
+         CV_Assert((layer_id.find(copyLP.name) == layer_id.end()) &&
+             "Couldn't copy the node: generated name already exists in the graph.");
+         input_names.push_back(copyLP.name);
+         node_proto.set_input(0, input);
+         node_proto.set_output(0, copyLP.name);
+         addLayer(copyLP, node_proto);
+     }
+     node_proto.clear_input();
+     for (size_t i = 0; i < input_names.size(); i++)
+     {
+         node_proto.add_input(input_names[i]);
+     }
+ }
  void ONNXImporter::addConstant(const std::string& name, const Mat& blob)
  {
      constBlobs.insert(std::make_pair(name, blob));
Simple merge
Simple merge