From 15d63e2ec45a244bd8c7d913d834aa5cab46a807 Mon Sep 17 00:00:00 2001 From: Sadik Armagan Date: Fri, 26 Jul 2019 16:59:35 +0100 Subject: IVGCVSW-3582 Fix Skipped Pooling Hal 1.2 Tests Signed-off-by: Sadik Armagan Change-Id: I9f9d11b19de591ec8936822ca229b4090ed318fe --- 1.2/HalPolicy.cpp | 27 ++++++++++++++++++++++++--- 1.2/HalPolicy.hpp | 6 ++++++ ConversionUtils.hpp | 42 +++++++++++++++++++++++++++--------------- 3 files changed, 57 insertions(+), 18 deletions(-) diff --git a/1.2/HalPolicy.cpp b/1.2/HalPolicy.cpp index 7515eb3e..9cad29fa 100644 --- a/1.2/HalPolicy.cpp +++ b/1.2/HalPolicy.cpp @@ -25,7 +25,6 @@ bool HandledByV1_0(V1_2::OperationType operationType) switch (static_cast(operationType)) { case V1_0::OperationType::ADD: - case V1_0::OperationType::AVERAGE_POOL_2D: case V1_0::OperationType::CONCATENATION: case V1_0::OperationType::DEPTH_TO_SPACE: case V1_0::OperationType::DEQUANTIZE: @@ -34,12 +33,10 @@ bool HandledByV1_0(V1_2::OperationType operationType) case V1_0::OperationType::FULLY_CONNECTED: case V1_0::OperationType::HASHTABLE_LOOKUP: case V1_0::OperationType::L2_NORMALIZATION: - case V1_0::OperationType::L2_POOL_2D: case V1_0::OperationType::LOCAL_RESPONSE_NORMALIZATION: case V1_0::OperationType::LOGISTIC: case V1_0::OperationType::LSH_PROJECTION: case V1_0::OperationType::LSTM: - case V1_0::OperationType::MAX_POOL_2D: case V1_0::OperationType::MUL: case V1_0::OperationType::RESHAPE: case V1_0::OperationType::RNN: @@ -131,10 +128,16 @@ bool HalPolicy::ConvertOperation(const Operation& operation, const Model& model, switch (operation.type) { + case V1_2::OperationType::AVERAGE_POOL_2D: + return ConvertAveragePool2d(operation, model, data); case V1_2::OperationType::CONV_2D: return ConvertConv2d(operation, model, data); case V1_2::OperationType::DEPTHWISE_CONV_2D: return ConvertDepthwiseConv2d(operation, model, data); + case V1_2::OperationType::L2_POOL_2D: + return ConvertL2Pool2d(operation, model, data); + case V1_2::OperationType::MAX_POOL_2D: + return ConvertMaxPool2d(operation, model, data); case V1_2::OperationType::MAXIMUM: return ConvertMaximum(operation, model, data); case V1_2::OperationType::MINIMUM: @@ -167,6 +170,12 @@ bool HalPolicy::ConvertOperation(const Operation& operation, const Model& model, } } +bool HalPolicy::ConvertAveragePool2d(const Operation& operation, const Model& model, ConversionData& data) +{ + ALOGV("hal_1_2::HalPolicy::ConvertAveragePool2d()"); + return ConvertPooling2d(operation, __func__, armnn::PoolingAlgorithm::Average, model, data); +} + bool HalPolicy::ConvertConv2d(const Operation& operation, const Model& model, ConversionData& data) { ALOGV("hal_1_2::HalPolicy::ConvertConv2d()"); @@ -485,6 +494,18 @@ bool HalPolicy::ConvertDepthwiseConv2d(const Operation& operation, const Model& return SetupAndTrackLayerOutputSlot(operation, 0, *endLayer, model, data); } +bool HalPolicy::ConvertL2Pool2d(const Operation& operation, const Model& model, ConversionData& data) +{ + ALOGV("hal_1_2::HalPolicy::ConvertL2Pool2d()"); + return ConvertPooling2d(operation, __func__, armnn::PoolingAlgorithm::L2, model, data); +} + +bool HalPolicy::ConvertMaxPool2d(const Operation& operation, const Model& model, ConversionData& data) +{ + ALOGV("hal_1_2::HalPolicy::ConvertMaxPool2d()"); + return ConvertPooling2d(operation, __func__, armnn::PoolingAlgorithm::Max, model, data); +} + bool HalPolicy::ConvertMaximum(const Operation& operation, const Model& model, ConversionData& data) { ALOGV("hal_1_2::HalPolicy::ConvertMaximum()"); diff --git a/1.2/HalPolicy.hpp b/1.2/HalPolicy.hpp index d11ae3ca..f689613f 100644 --- a/1.2/HalPolicy.hpp +++ b/1.2/HalPolicy.hpp @@ -31,10 +31,16 @@ public: static bool ConvertOperation(const Operation& operation, const Model& model, ConversionData& data); private: + static bool ConvertAveragePool2d(const Operation& operation, const Model& model, ConversionData& data); + static bool ConvertConv2d(const Operation& operation, const Model& model, ConversionData& data); static bool ConvertDepthwiseConv2d(const Operation& operation, const Model& model, ConversionData& data); + static bool ConvertL2Pool2d(const Operation& operation, const Model& model, ConversionData& data); + + static bool ConvertMaxPool2d(const Operation& operation, const Model& model, ConversionData& data); + static bool ConvertMaximum(const Operation& operation, const Model& model, ConversionData& data); static bool ConvertMinimum(const Operation& operation, const Model& model, ConversionData& data); diff --git a/ConversionUtils.hpp b/ConversionUtils.hpp index 9a2b08f0..759514d6 100644 --- a/ConversionUtils.hpp +++ b/ConversionUtils.hpp @@ -1332,7 +1332,30 @@ bool ConvertPooling2d(const HalOperation& operation, ActivationFn activation; - if (operation.inputs.size() == 7) + auto inputSize = operation.inputs.size(); + + if (inputSize >= 10) + { + // one input, 9 parameters (padding l r t b, stridex, stridey, width, height, activation type) + if (!GetInputScalar(operation, 1, HalOperandType::INT32, desc.m_PadLeft, model, data) || + !GetInputScalar(operation, 2, HalOperandType::INT32, desc.m_PadRight, model, data) || + !GetInputScalar(operation, 3, HalOperandType::INT32, desc.m_PadTop, model, data) || + !GetInputScalar(operation, 4, HalOperandType::INT32, desc.m_PadBottom, model, data) || + !GetInputScalar(operation, 5, HalOperandType::INT32, desc.m_StrideX, model, data) || + !GetInputScalar(operation, 6, HalOperandType::INT32, desc.m_StrideY, model, data) || + !GetInputScalar(operation, 7, HalOperandType::INT32, desc.m_PoolWidth, model, data) || + !GetInputScalar(operation, 8, HalOperandType::INT32, desc.m_PoolHeight, model, data) || + !GetInputActivationFunction(operation, 9, activation, model, data)) + { + return Fail("%s: Operation has invalid inputs", operationName); + } + + if (Is12Operand(*output)) + { + desc.m_DataLayout = OptionalDataLayout(operation, 10, model, data); + } + } + else { // one input, 6 parameters (padding, stridex, stridey, width, height, activation type) android::nn::PaddingScheme scheme; @@ -1351,21 +1374,10 @@ bool ConvertPooling2d(const HalOperation& operation, CalcPadding(inputWidth, desc.m_PoolWidth, desc.m_StrideX, desc.m_PadLeft, desc.m_PadRight, scheme); CalcPadding(inputHeight, desc.m_PoolHeight, desc.m_StrideY, desc.m_PadTop, desc.m_PadBottom, scheme); - } - else - { - // one input, 9 parameters (padding l r t b, stridex, stridey, width, height, activation type) - if (!GetInputScalar(operation, 1, HalOperandType::INT32, desc.m_PadLeft, model, data) || - !GetInputScalar(operation, 2, HalOperandType::INT32, desc.m_PadRight, model, data) || - !GetInputScalar(operation, 3, HalOperandType::INT32, desc.m_PadTop, model, data) || - !GetInputScalar(operation, 4, HalOperandType::INT32, desc.m_PadBottom, model, data) || - !GetInputScalar(operation, 5, HalOperandType::INT32, desc.m_StrideX, model, data) || - !GetInputScalar(operation, 6, HalOperandType::INT32, desc.m_StrideY, model, data) || - !GetInputScalar(operation, 7, HalOperandType::INT32, desc.m_PoolWidth, model, data) || - !GetInputScalar(operation, 8, HalOperandType::INT32, desc.m_PoolHeight, model, data) || - !GetInputActivationFunction(operation, 9, activation, model, data)) + + if (Is12Operand(*output)) { - return Fail("%s: Operation has invalid inputs", operationName); + desc.m_DataLayout = OptionalDataLayout(operation, 7, model, data); } } -- cgit v1.2.1