From: Alexander Alekhin Date: Sat, 27 Mar 2021 15:35:16 +0000 (+0000) Subject: Merge remote-tracking branch 'upstream/3.4' into merge-3.4 X-Git-Tag: submit/tizen/20220120.021815~1^2~136 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=35eaacd1db1ebd264218dd8f8bd34a364ecb11a7;p=platform%2Fupstream%2Fopencv.git Merge remote-tracking branch 'upstream/3.4' into merge-3.4 --- 35eaacd1db1ebd264218dd8f8bd34a364ecb11a7 diff --cc modules/core/src/va_intel.cpp index c81e6f3687,30f89c4181..1d2b1cbf32 --- a/modules/core/src/va_intel.cpp +++ b/modules/core/src/va_intel.cpp @@@ -202,10 -171,10 +202,10 @@@ static bool ocl_convert_bgr_to_nv12(cl_ k.args(clBuffer, step, cols, rows, clImageY, clImageUV); - size_t globalsize[] = { (size_t)cols, (size_t)rows }; + size_t globalsize[] = { (size_t)cols/2, (size_t)rows/2 }; return k.run(2, globalsize, 0, false); } -#endif // HAVE_VA_INTEL && HAVE_OPENCL +#endif // HAVE_VA_INTEL } // namespace cv::va_intel::ocl diff --cc modules/dnn/src/layers/slice_layer.cpp index 790788b70e,507964edf9..ff997c3afc --- a/modules/dnn/src/layers/slice_layer.cpp +++ b/modules/dnn/src/layers/slice_layer.cpp @@@ -130,10 -141,9 +147,13 @@@ public #endif #ifdef HAVE_DNN_NGRAPH if (backendId == DNN_BACKEND_INFERENCE_ENGINE_NGRAPH) - return sliceRanges.size() == 1; + return sliceRanges.size() == 1 && !hasSteps; ++#endif ++#ifdef HAVE_CUDA ++ if (backendId == DNN_BACKEND_CUDA) ++ return !hasSteps; #endif - return backendId == DNN_BACKEND_OPENCV || - backendId == DNN_BACKEND_CUDA; + return backendId == DNN_BACKEND_OPENCV; } bool getMemoryShapes(const std::vector &inputs, @@@ -579,30 -612,36 +624,60 @@@ } #endif // HAVE_DNN_NGRAPH + +#ifdef HAVE_CUDA + Ptr initCUDA( + void *context_, + const std::vector>& inputs, + const std::vector>& outputs + ) override + { + auto context = reinterpret_cast(context_); + + std::vector> offsets; + for (const auto& ranges : finalSliceRanges) + { + std::vector offsets_i; + for (const auto& range : ranges) + offsets_i.push_back(range.start); + offsets.push_back(std::move(offsets_i)); + } + + return make_cuda_node(preferableTarget, std::move(context->stream), std::move(offsets)); + } +#endif + + + private: + void getSliceRecursive(const Mat &inpMat, std::vector &inpIdx, + const std::vector &sliceRanges, + const std::vector &sliceSteps, int dim, int dimsNum, + Mat &outputs, std::vector &outIdx) + { + int begin = sliceRanges[dim].start; + int end = sliceRanges[dim].end; + int step = !sliceSteps.empty() ? sliceSteps[dim] : 1; + + const bool is32F = inpMat.depth() == CV_32F; + + // TODO optimization is required (for 2D tail case at least) + for (int k = begin, j = 0; k < end; k += step, j++) + { + inpIdx[dim] = k; + outIdx[dim] = j; + + if (dim + 1 < dimsNum) + getSliceRecursive(inpMat, inpIdx, sliceRanges, sliceSteps, dim + 1, dimsNum, outputs, outIdx); + else + { + if (is32F) + outputs.at(outIdx.data()) = inpMat.at(inpIdx.data()); + else + outputs.at(outIdx.data()) = inpMat.at(inpIdx.data()); // 16F emulation + } + } + } + protected: // The actual non-negative values determined from @p sliceRanges depends on input size. std::vector > finalSliceRanges; diff --cc modules/dnn/test/test_torch_importer.cpp index c0d86d9370,8738e5e25c..f1d636895b --- a/modules/dnn/test/test_torch_importer.cpp +++ b/modules/dnn/test/test_torch_importer.cpp @@@ -253,11 -224,14 +253,19 @@@ TEST_P(Test_Torch_layers, net_conv_gemm l1 = 0.046; lInf = 0.023; } + else if (target == DNN_TARGET_CUDA_FP16) + { + l1 = 0.0042; + lInf = 0.021; + } + // The OpenCL kernels use the native_ math functions which have + // implementation defined accuracy, so we use relaxed thresholds. See + // https://github.com/opencv/opencv/issues/9821 for more details. + else if (target == DNN_TARGET_OPENCL) + { + l1 = 0.02; + lInf = 0.02; + } runTorchNet("net_conv_gemm_lrn", "", false, true, true, l1, lInf); }