X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=modules%2Fdnn%2Fsrc%2Flayers%2Fmax_unpooling_layer.cpp;h=a44d25ce899c5d96ce0b450036ae8b1c1e70977c;hb=613c12e59015f4bd7909916ceee195edd7ef88d0;hp=98cb3595aa15061564b6ee573eba549841ad1323;hpb=bab4f4f5d8d7697597e6e34502a8b49a9e59d41e;p=platform%2Fupstream%2Fopencv.git diff --git a/modules/dnn/src/layers/max_unpooling_layer.cpp b/modules/dnn/src/layers/max_unpooling_layer.cpp index 98cb359..a44d25c 100644 --- a/modules/dnn/src/layers/max_unpooling_layer.cpp +++ b/modules/dnn/src/layers/max_unpooling_layer.cpp @@ -11,10 +11,14 @@ Implementation of Batch Normalization layer. #include "../precomp.hpp" #include "layers_common.hpp" +#include "../op_cuda.hpp" #include "../op_halide.hpp" #include -#include +#ifdef HAVE_CUDA +#include "../cuda4dnn/primitives/max_unpooling.hpp" +using namespace cv::dnn::cuda4dnn; +#endif namespace cv { @@ -35,8 +39,8 @@ public: virtual bool supportBackend(int backendId) CV_OVERRIDE { return backendId == DNN_BACKEND_OPENCV || - backendId == DNN_BACKEND_HALIDE && haveHalide() && - !poolPad.width && !poolPad.height; + backendId == DNN_BACKEND_CUDA || + (backendId == DNN_BACKEND_HALIDE && haveHalide() && !poolPad.width && !poolPad.height); } bool getMemoryShapes(const std::vector &inputs, @@ -44,12 +48,18 @@ public: std::vector &outputs, std::vector &internals) const CV_OVERRIDE { - CV_Assert(inputs.size() == 2); + CV_Assert(inputs.size() == 2 || inputs.size() == 3); CV_Assert(total(inputs[0]) == total(inputs[1])); - MatShape outShape = inputs[0]; - outShape[2] = (outShape[2] - 1) * poolStride.height + poolKernel.height - 2 * poolPad.height; - outShape[3] = (outShape[3] - 1) * poolStride.width + poolKernel.width - 2 * poolPad.width; + MatShape outShape; + if (inputs.size() == 2) + { + outShape = inputs[0]; + outShape[2] = (outShape[2] - 1) * poolStride.height + poolKernel.height - 2 * poolPad.height; + outShape[3] = (outShape[3] - 1) * poolStride.width + poolKernel.width - 2 * poolPad.width; + } + else + outShape = inputs[2]; outputs.clear(); outputs.push_back(outShape); @@ -62,17 +72,19 @@ public: CV_TRACE_FUNCTION(); CV_TRACE_ARG_VALUE(name, "name", name.c_str()); - Layer::forward_fallback(inputs_arr, outputs_arr, internals_arr); - } + if (inputs_arr.depth() == CV_16S) + { + forward_fallback(inputs_arr, outputs_arr, internals_arr); + return; + } - void forward(std::vector &inputs, std::vector &outputs, std::vector &internals) CV_OVERRIDE - { - CV_TRACE_FUNCTION(); - CV_TRACE_ARG_VALUE(name, "name", name.c_str()); + std::vector inputs, outputs; + inputs_arr.getMatVector(inputs); + outputs_arr.getMatVector(outputs); - CV_Assert(inputs.size() == 2); - Mat& input = *inputs[0]; - Mat& indices = *inputs[1]; + CV_Assert(inputs.size() == 2 || inputs.size() == 3); + Mat& input = inputs[0]; + Mat& indices = inputs[1]; CV_Assert(input.total() == indices.total()); CV_Assert(input.size[0] == 1); @@ -117,6 +129,35 @@ public: } } +#ifdef HAVE_CUDA + Ptr initCUDA( + void *context_, + const std::vector>& inputs, + const std::vector>& outputs + ) override + { + auto context = reinterpret_cast(context_); + + cuda4dnn::MaxUnpoolingConfiguration config; + auto& window_size = config.window_size; + window_size.resize(2); + window_size[0] = poolKernel.height; + window_size[1] = poolKernel.width; + + auto& strides = config.strides; + strides.resize(2); + strides[0] = poolStride.height; + strides[1] = poolStride.width; + + auto& pads_begin = config.pads_begin; + pads_begin.resize(2); + pads_begin[0] = poolPad.height; + pads_begin[1] = poolPad.width; + + return make_cuda_node(preferableTarget, std::move(context->stream), config); + } +#endif + virtual Ptr initHalide(const std::vector > &input) CV_OVERRIDE { #ifdef HAVE_HALIDE