Merge remote-tracking branch 'upstream/3.4' into merge-3.4
authorAlexander Alekhin <alexander.a.alekhin@gmail.com>
Fri, 12 Jul 2019 18:43:27 +0000 (18:43 +0000)
committerAlexander Alekhin <alexander.a.alekhin@gmail.com>
Fri, 12 Jul 2019 18:45:06 +0000 (18:45 +0000)
1  2 
modules/dnn/src/layers/convolution_layer.cpp
modules/dnn/src/layers/pooling_layer.cpp
modules/dnn/src/onnx/onnx_importer.cpp

@@@ -257,13 -257,8 +258,16 @@@ public
          }
          else
  #endif
 -            return (kernel_size.size() == 3 && preferableTarget == DNN_TARGET_CPU && backendId == DNN_BACKEND_OPENCV) ||
 -                   (kernel_size.size() == 2 && (backendId == DNN_BACKEND_OPENCV || backendId == DNN_BACKEND_HALIDE));
 +        {
-             if (kernel_size.size() != 2)
++            if (kernel_size.size() == 3)
++                return (preferableTarget == DNN_TARGET_CPU && backendId == DNN_BACKEND_OPENCV);
++            else if (kernel_size.size() == 2)
++                return backendId == DNN_BACKEND_OPENCV ||
++                       backendId == DNN_BACKEND_HALIDE ||
++                       (backendId == DNN_BACKEND_VKCOM && haveVulkan());
++            else
 +                return false;
-             return backendId == DNN_BACKEND_OPENCV ||
-                    backendId == DNN_BACKEND_HALIDE ||
-                    (backendId == DNN_BACKEND_VKCOM && haveVulkan());
 +        }
      }
  
      bool getMemoryShapes(const std::vector<MatShape> &inputs,
  #include "opencv2/core/hal/intrin.hpp"
  #include "../op_halide.hpp"
  #include "../op_inf_engine.hpp"
 +#include "../op_vkcom.hpp"
  #include <float.h>
  #include <algorithm>
+ #include <numeric>
  using std::max;
  using std::min;
  
@@@ -178,15 -178,10 +179,18 @@@ public
  #endif
          }
          else
 -            return (kernel_size.size() == 3 && backendId == DNN_BACKEND_OPENCV && preferableTarget == DNN_TARGET_CPU) ||
 -                   ((kernel_size.empty() || kernel_size.size() == 2) && (backendId == DNN_BACKEND_OPENCV ||
 -                   (backendId == DNN_BACKEND_HALIDE && haveHalide() &&
 -                   (type == MAX || (type == AVE && !pad_t && !pad_l && !pad_b && !pad_r)))));
 +        {
-             if (!kernel_size.empty() && kernel_size.size() != 2)  // TODO Support Pooling3D
++            if (kernel_size.size() == 3)
++                return (backendId == DNN_BACKEND_OPENCV && preferableTarget == DNN_TARGET_CPU);
++            if (kernel_size.empty() || kernel_size.size() == 2)
++                return backendId == DNN_BACKEND_OPENCV ||
++                       (backendId == DNN_BACKEND_HALIDE && haveHalide() &&
++                           (type == MAX || (type == AVE && !pad_t && !pad_l && !pad_b && !pad_r))) ||
++                       (backendId == DNN_BACKEND_VKCOM && haveVulkan() &&
++                           (type == MAX || type == AVE));
++            else
 +                return false;
-             return backendId == DNN_BACKEND_OPENCV ||
-                    (backendId == DNN_BACKEND_HALIDE && haveHalide() &&
-                        (type == MAX || (type == AVE && !pad_t && !pad_l && !pad_b && !pad_r))) ||
-                    (backendId == DNN_BACKEND_VKCOM && haveVulkan() &&
-                        (type == MAX || type == AVE));
 +        }
      }
  
  #ifdef HAVE_OPENCL
          int poolingType;
          float spatialScale;
  
 -        PoolingInvoker() : src(0), rois(0), dst(0), mask(0), avePoolPaddedArea(false), nstripes(0),
+         std::vector<size_t> pads_begin, pads_end;
+         std::vector<size_t> kernel_size;
+         std::vector<size_t> strides;
 +        PoolingInvoker() : src(0), rois(0), dst(0), mask(0), pad_l(0), pad_t(0), pad_r(0), pad_b(0),
 +                           avePoolPaddedArea(false), nstripes(0),
                             computeMaxIdx(0), poolingType(MAX), spatialScale(0) {}
  
-         static void run(const Mat& src, const Mat& rois, Mat& dst, Mat& mask, Size kernel,
-                         Size stride, int pad_l, int pad_t, int pad_r, int pad_b, bool avePoolPaddedArea, int poolingType, float spatialScale,
+         static void run(const Mat& src, const Mat& rois, Mat& dst, Mat& mask,
+                         std::vector<size_t> kernel_size, std::vector<size_t> strides,
+                         std::vector<size_t> pads_begin, std::vector<size_t> pads_end,
+                         bool avePoolPaddedArea, int poolingType, float spatialScale,
                          bool computeMaxIdx, int nstripes)
          {
              CV_Assert_N(