From 2b173126319343e49d1f081cfb58eacd96afc715 Mon Sep 17 00:00:00 2001 From: Aron Virginas-Tar Date: Mon, 15 Jul 2019 14:29:09 +0100 Subject: IVGCVSW-3452 Support dynamic output shape in hal_1_2::HalPolicy::ConvertConv2d Signed-off-by: Aron Virginas-Tar Change-Id: I8694e1f1c62da6f74eb356558b17a63758ccfdad --- 1.2/HalPolicy.cpp | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) (limited to '1.2/HalPolicy.cpp') diff --git a/1.2/HalPolicy.cpp b/1.2/HalPolicy.cpp index a82db80b..69cc4713 100644 --- a/1.2/HalPolicy.cpp +++ b/1.2/HalPolicy.cpp @@ -172,13 +172,8 @@ bool HalPolicy::ConvertConv2d(const Operation& operation, const Model& model, Co return Fail("%s: Could not read output 0", __func__); } - const armnn::TensorInfo& inputInfo = input.GetTensorInfo(); - const armnn::TensorInfo& outputInfo = GetTensorInfoForOperand(*output); - - if (IsDynamicOutput(outputInfo)) - { - return Fail("%s: Dynamic output not supported", __func__); - } + const armnn::TensorInfo& inputInfo = input.GetTensorInfo(); + armnn::TensorInfo outputInfo = GetTensorInfoForOperand(*output); armnn::Convolution2dDescriptor desc; desc.m_DataLayout = armnn::DataLayout::NHWC; @@ -272,6 +267,21 @@ bool HalPolicy::ConvertConv2d(const Operation& operation, const Model& model, Co desc.m_BiasEnabled = true; armnn::Optional biases(bias.GetInfo()); + if (IsDynamicOutput(outputInfo)) + { + try + { + ALOGD("Output shape not set, will infer from inputs"); + outputInfo.SetShape(InferConvolution2dOutputShape(inputInfo.GetShape(), + weights.GetInfo().GetShape(), + desc)); + } + catch (armnn::Exception& e) + { + return Fail("%s: Could not infer dynamic output shape: %s", __func__, e.what()); + } + } + bool isSupported = false; FORWARD_LAYER_SUPPORT_FUNC(__func__, IsConvolution2dSupported, @@ -282,6 +292,7 @@ bool HalPolicy::ConvertConv2d(const Operation& operation, const Model& model, Co desc, weights.GetInfo(), biases); + if (!isSupported) { return false; @@ -304,7 +315,12 @@ bool HalPolicy::ConvertConv2d(const Operation& operation, const Model& model, Co input.Connect(startLayer->GetInputSlot(0)); - return SetupAndTrackLayerOutputSlot(operation, 0, *endLayer, model, data); + return SetupAndTrackLayerOutputSlot(operation, + 0, + *endLayer, + model, + data, + armnn::Optional(outputInfo)); } bool HalPolicy::ConvertDepthwiseConv2d(const Operation& operation, const Model& model, ConversionData& data) -- cgit v1.2.1