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=daac57854c6c125d49fa9bc33cfb47dc9f16e7cc;hpb=c231472ad6672082f11e7447cf52631e19d7d7dc;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 daac578..a44d25c 100644 --- a/modules/dnn/src/layers/max_unpooling_layer.cpp +++ b/modules/dnn/src/layers/max_unpooling_layer.cpp @@ -11,17 +11,21 @@ Implementation of Batch Normalization layer. #include "../precomp.hpp" #include "layers_common.hpp" -#include "op_halide.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 { namespace dnn { -class MaxUnpoolLayerImpl : public MaxUnpoolLayer +class MaxUnpoolLayerImpl CV_FINAL : public MaxUnpoolLayer { public: MaxUnpoolLayerImpl(const LayerParams& params) @@ -32,24 +36,30 @@ public: poolStride = Size(params.get("pool_stride_w"), params.get("pool_stride_h")); } - virtual bool supportBackend(int backendId) + virtual bool supportBackend(int backendId) CV_OVERRIDE { - return backendId == DNN_BACKEND_DEFAULT || - backendId == DNN_BACKEND_HALIDE && haveHalide() && - !poolPad.width && !poolPad.height; + return backendId == DNN_BACKEND_OPENCV || + backendId == DNN_BACKEND_CUDA || + (backendId == DNN_BACKEND_HALIDE && haveHalide() && !poolPad.width && !poolPad.height); } bool getMemoryShapes(const std::vector &inputs, const int requiredOutputs, std::vector &outputs, - std::vector &internals) const + 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); @@ -57,22 +67,24 @@ public: return false; } - void forward(InputArrayOfArrays inputs_arr, OutputArrayOfArrays outputs_arr, OutputArrayOfArrays internals_arr) + void forward(InputArrayOfArrays inputs_arr, OutputArrayOfArrays outputs_arr, OutputArrayOfArrays internals_arr) CV_OVERRIDE { 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_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); @@ -103,6 +115,7 @@ public: << "i_c=" << i_c << std::endl << "i_wh=" << i_wh << std::endl << "index=" << index << std::endl + << "maxval=" << inptr[i_wh] << std::endl << "outPlaneTotal=" << outPlaneTotal << std::endl << "input.size=" << input.size << std::endl << "indices.size=" << indices.size << std::endl @@ -116,7 +129,36 @@ public: } } - virtual Ptr initHalide(const std::vector > &input) +#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 // Meaningless operation if false because if kernel > stride