From 206b546e5a61c456c731747a447d4891e3d9fbcb Mon Sep 17 00:00:00 2001 From: gal0is Date: Sat, 15 Jun 2019 23:51:13 +0800 Subject: [PATCH] tensroflow support maxpoolgrad --- modules/dnn/src/layers/max_unpooling_layer.cpp | 16 +++++++++++----- modules/dnn/src/tensorflow/tf_importer.cpp | 18 ++++++++++++++++++ modules/dnn/test/test_tf_importer.cpp | 7 +++++++ 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/modules/dnn/src/layers/max_unpooling_layer.cpp b/modules/dnn/src/layers/max_unpooling_layer.cpp index b9c1f2d..2978509 100644 --- a/modules/dnn/src/layers/max_unpooling_layer.cpp +++ b/modules/dnn/src/layers/max_unpooling_layer.cpp @@ -43,12 +43,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); @@ -71,7 +77,7 @@ public: inputs_arr.getMatVector(inputs); outputs_arr.getMatVector(outputs); - CV_Assert(inputs.size() == 2); + CV_Assert(inputs.size() == 2 || inputs.size() == 3); Mat& input = inputs[0]; Mat& indices = inputs[1]; diff --git a/modules/dnn/src/tensorflow/tf_importer.cpp b/modules/dnn/src/tensorflow/tf_importer.cpp index 3a5bd34..c38b250 100644 --- a/modules/dnn/src/tensorflow/tf_importer.cpp +++ b/modules/dnn/src/tensorflow/tf_importer.cpp @@ -1370,6 +1370,24 @@ void TFImporter::populateNet(Net dstNet) connectToAllBlobs(layer_id, dstNet, parsePin(layer.input(0)), id, layer.input_size()); } + else if (type == "MaxPoolGrad") + { + CV_Assert(layer.input_size() == 3); + + layerParams.set("pool_k_h", 0); + layerParams.set("pool_k_w", 0); + layerParams.set("pool_stride_h", 0); + layerParams.set("pool_stride_w", 0); + layerParams.set("pool_pad_h", 0); + layerParams.set("pool_pad_w", 0); + + int id = dstNet.addLayer(name, "MaxUnpool", layerParams); + layer_id[name] = id; + + connect(layer_id, dstNet, parsePin(layer.input(2)), id, 0); + connect(layer_id, dstNet, parsePin(layer.input(1) + ":1"), id, 1); + connect(layer_id, dstNet, parsePin(layer.input(0)), id, 2); + } else if (type == "Placeholder") { if (!hasLayerAttr(layer, "dtype") || diff --git a/modules/dnn/test/test_tf_importer.cpp b/modules/dnn/test/test_tf_importer.cpp index dd5d871..0687c0b 100644 --- a/modules/dnn/test/test_tf_importer.cpp +++ b/modules/dnn/test/test_tf_importer.cpp @@ -218,6 +218,13 @@ TEST_P(Test_TensorFlow_layers, pooling) runTensorFlowNet("reduce_mean"); // an average pooling over all spatial dimensions. } +TEST_P(Test_TensorFlow_layers, max_pool_grad) +{ + if (backend == DNN_BACKEND_INFERENCE_ENGINE) + applyTestTag(CV_TEST_TAG_DNN_SKIP_IE); + runTensorFlowNet("max_pool_grad"); +} + // TODO: fix tests and replace to pooling TEST_P(Test_TensorFlow_layers, ave_pool_same) { -- 2.7.4