From 8edb16d884530e7f35d05983e1617c13d200bb91 Mon Sep 17 00:00:00 2001 From: Aron Virginas-Tar Date: Tue, 1 Oct 2019 13:34:59 +0100 Subject: IVGCVSW-3737 Add support for converting DEPTH_TO_SPACE * Added ConvertDepthToSpace() to hal_1_0::HalPolicy and hal_1_2::HalPolicy * Implemented ConvertDepthToSpace() template inside ConversionUtils.hpp * Changed unsupported operation from DEPTH_TO_SPACE to HASHTABLE_LOOKUP in GenericLayerTests/GetSupportedOperations Signed-off-by: Aron Virginas-Tar Change-Id: I12bf73ea721e7b6d49cc4a76000b43a3f274c6f5 --- 1.0/HalPolicy.cpp | 8 ++++++ 1.0/HalPolicy.hpp | 2 ++ 1.1/HalPolicy.cpp | 1 + 1.2/HalPolicy.cpp | 8 ++++++ 1.2/HalPolicy.hpp | 2 ++ ConversionUtils.hpp | 67 ++++++++++++++++++++++++++++++++++++++++++++++ test/GenericLayerTests.cpp | 22 ++++++++++----- 7 files changed, 104 insertions(+), 6 deletions(-) diff --git a/1.0/HalPolicy.cpp b/1.0/HalPolicy.cpp index cff678a8..7e9e9efa 100644 --- a/1.0/HalPolicy.cpp +++ b/1.0/HalPolicy.cpp @@ -27,6 +27,8 @@ bool HalPolicy::ConvertOperation(const Operation& operation, const Model& model, return ConvertConcatenation(operation, model, data); case V1_0::OperationType::CONV_2D: return ConvertConv2d(operation, model, data); + case V1_0::OperationType::DEPTH_TO_SPACE: + return ConvertDepthToSpace(operation, model, data); case V1_0::OperationType::DEPTHWISE_CONV_2D: return ConvertDepthwiseConv2d(operation, model, data); case V1_0::OperationType::DEQUANTIZE: @@ -95,6 +97,12 @@ bool HalPolicy::ConvertConv2d(const Operation& operation, const Model& model, Co return ::ConvertConv2d(operation, model, data); } +bool HalPolicy::ConvertDepthToSpace(const Operation& operation, const Model& model, ConversionData& data) +{ + ALOGV("hal_1_0::HalPolicy::ConvertDepthToSpace()"); + return ::ConvertDepthToSpace(operation, model, data); +} + bool HalPolicy::ConvertDepthwiseConv2d(const Operation& operation, const Model& model, ConversionData& data) { ALOGV("hal_1_0::HalPolicy::ConvertDepthwiseConv2d()"); diff --git a/1.0/HalPolicy.hpp b/1.0/HalPolicy.hpp index 4b8dc47a..9eb13b47 100644 --- a/1.0/HalPolicy.hpp +++ b/1.0/HalPolicy.hpp @@ -38,6 +38,8 @@ private: static bool ConvertConv2d(const Operation& operation, const Model& model, ConversionData& data); + static bool ConvertDepthToSpace(const Operation& operation, const Model& model, ConversionData& data); + static bool ConvertDepthwiseConv2d(const Operation& operation, const Model& model, ConversionData& data); static bool ConvertDequantize(const Operation& operation, const Model& model, ConversionData& data); diff --git a/1.1/HalPolicy.cpp b/1.1/HalPolicy.cpp index aa650e90..53a884ca 100644 --- a/1.1/HalPolicy.cpp +++ b/1.1/HalPolicy.cpp @@ -16,6 +16,7 @@ static std::vector opsEquivalentInV10({ V1_0::OperationType::AVERAGE_POOL_2D, V1_0::OperationType::CONCATENATION, V1_0::OperationType::CONV_2D, + V1_0::OperationType::DEPTH_TO_SPACE, V1_0::OperationType::DEPTHWISE_CONV_2D, V1_0::OperationType::DEQUANTIZE, V1_0::OperationType::FLOOR, diff --git a/1.2/HalPolicy.cpp b/1.2/HalPolicy.cpp index 7aa6967a..d91cb3b2 100644 --- a/1.2/HalPolicy.cpp +++ b/1.2/HalPolicy.cpp @@ -34,6 +34,8 @@ bool HalPolicy::ConvertOperation(const Operation& operation, const Model& model, return ConvertConcatenation(operation, model, data); case V1_2::OperationType::CONV_2D: return ConvertConv2d(operation, model, data); + case V1_2::OperationType::DEPTH_TO_SPACE: + return ConvertDepthToSpace(operation, model, data); case V1_2::OperationType::DEPTHWISE_CONV_2D: return ConvertDepthwiseConv2d(operation, model, data); case V1_2::OperationType::DEQUANTIZE: @@ -298,6 +300,12 @@ bool HalPolicy::ConvertConv2d(const Operation& operation, const Model& model, Co return SetupAndTrackLayerOutputSlot(operation, 0, *endLayer, model, data); } +bool HalPolicy::ConvertDepthToSpace(const Operation& operation, const Model& model, ConversionData& data) +{ + ALOGV("hal_1_2::HalPolicy::ConvertDepthToSpace()"); + return ::ConvertDepthToSpace(operation, model, data); +} + bool HalPolicy::ConvertDepthwiseConv2d(const Operation& operation, const Model& model, ConversionData& data) { ALOGV("hal_1_2::HalPolicy::ConvertDepthwiseConv2d()"); diff --git a/1.2/HalPolicy.hpp b/1.2/HalPolicy.hpp index c7e1d4bc..82de44cd 100644 --- a/1.2/HalPolicy.hpp +++ b/1.2/HalPolicy.hpp @@ -43,6 +43,8 @@ private: static bool ConvertConv2d(const Operation& operation, const Model& model, ConversionData& data); + static bool ConvertDepthToSpace(const Operation& operation, const Model& model, ConversionData& data); + static bool ConvertDepthwiseConv2d(const Operation& operation, const Model& model, ConversionData& data); static bool ConvertDequantize(const Operation& operation, const Model& model, ConversionData& data); diff --git a/ConversionUtils.hpp b/ConversionUtils.hpp index 683da5e4..2e4cadd7 100644 --- a/ConversionUtils.hpp +++ b/ConversionUtils.hpp @@ -1877,6 +1877,73 @@ bool ConvertConv2d(const HalOperation& operation, const HalModel& model, Convers return SetupAndTrackLayerOutputSlot(operation, 0, *endLayer, model, data); } +template +bool ConvertDepthToSpace(const HalOperation& operation, const HalModel& model, ConversionData& data) +{ + using HalOperand = typename HalPolicy::Operand; + using HalOperandType = typename HalPolicy::OperandType; + + LayerInputHandle input = ConvertToLayerInputHandle(operation, 0, model, data); + if (!input.IsValid() ) + { + return Fail("%s: Operation has invalid inputs", __func__); + } + + const armnn::TensorInfo& inputInfo = input.GetTensorInfo(); + unsigned int rank = inputInfo.GetNumDimensions(); + if (rank != 4) + { + return Fail("%s: Only inputs with rank 4 are supported", __func__); + } + + const HalOperand* output = GetOutputOperand(operation, 0, model); + if (!output) + { + return Fail("%s: Could not read output 0", __func__); + } + + const armnn::TensorInfo& outputInfo = GetTensorInfoForOperand(*output); + if (IsDynamicTensor(outputInfo)) + { + return Fail("%s: Dynamic output tensors are not supported", __func__); + } + + armnn::DepthToSpaceDescriptor descriptor; + + GetInputScalar(operation, 1, HalOperandType::INT32, descriptor.m_BlockSize, model, data); + if (descriptor.m_BlockSize <= 1) + { + return Fail("%s: Block size must be at least 1 in all dimensions"); + } + + descriptor.m_DataLayout = armnn::DataLayout::NHWC; + if (Is12Operand(*output)) + { + descriptor.m_DataLayout = OptionalDataLayout(operation, 2, model, data); + } + + bool isSupported = false; + FORWARD_LAYER_SUPPORT_FUNC(__func__, + IsDepthToSpaceSupported, + data.m_Backends, + isSupported, + inputInfo, + outputInfo, + descriptor); + if (!isSupported) + { + return false; + } + + armnn::IConnectableLayer* const layer = data.m_Network->AddDepthToSpaceLayer(descriptor); + assert(layer != nullptr); + input.Connect(layer->GetInputSlot(0)); + + return SetupAndTrackLayerOutputSlot(operation, 0, *layer, model, data); +} + template diff --git a/test/GenericLayerTests.cpp b/test/GenericLayerTests.cpp index 3b11b726..3788e66a 100644 --- a/test/GenericLayerTests.cpp +++ b/test/GenericLayerTests.cpp @@ -122,16 +122,26 @@ BOOST_AUTO_TEST_CASE(GetSupportedOperations) V1_0::Model model3 = {}; - AddInputOperand(model3, hidl_vec{1, 1, 1, 8}); - AddIntOperand(model3, 2); - AddOutputOperand(model3, hidl_vec{1, 2, 2, 2}); + AddInputOperand(model3, + hidl_vec{1, 1, 3, 4}, + HalPolicy::OperandType::TENSOR_INT32); + AddInputOperand(model3, + hidl_vec{4}, + HalPolicy::OperandType::TENSOR_INT32); + AddInputOperand(model3, hidl_vec{1, 1, 3, 4}); + + AddOutputOperand(model3, hidl_vec{1, 1, 3, 4}); + AddOutputOperand(model3, + hidl_vec{1, 1, 3, 4}, + HalPolicy::OperandType::TENSOR_QUANT8_ASYMM, + 1.f / 225.f); model3.operations.resize(1); // Add unsupported operation, should return no error but we don't support it - model3.operations[0].type = HalPolicy::OperationType::DEPTH_TO_SPACE; - model3.operations[0].inputs = hidl_vec{0, 1}; - model3.operations[0].outputs = hidl_vec{2}; + model3.operations[0].type = HalPolicy::OperationType::HASHTABLE_LOOKUP; + model3.operations[0].inputs = hidl_vec{0, 1, 2}; + model3.operations[0].outputs = hidl_vec{3, 4}; driver->getSupportedOperations(model3, cb); BOOST_TEST((int)errorStatus == (int)ErrorStatus::NONE); -- cgit v1.2.1