}
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;
#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(