From e4294fd7363fd2f5a7be25d1722f20ed935d3445 Mon Sep 17 00:00:00 2001 From: Nattapat Chaimanowong Date: Thu, 28 Mar 2019 09:56:53 +0000 Subject: IVGCVSW-2874 Add DequantizeLayer and no-op factory method *Add Dequantize layer to the frontend *Add Serializer and Deserializer for Dequantize Change-Id: Ide2647b9e0348d599deb97e61ca4bf66e2f17fc0 Signed-off-by: Nattapat Chaimanowong --- src/backends/backendsCommon/LayerSupportBase.cpp | 7 +++++++ src/backends/backendsCommon/LayerSupportBase.hpp | 4 ++++ src/backends/backendsCommon/WorkloadData.cpp | 17 +++++++++++++++++ src/backends/backendsCommon/WorkloadData.hpp | 5 +++++ src/backends/backendsCommon/WorkloadFactory.cpp | 16 ++++++++++++++++ src/backends/backendsCommon/WorkloadFactory.hpp | 3 +++ .../backendsCommon/test/IsLayerSupportedTestImpl.hpp | 2 ++ 7 files changed, 54 insertions(+) (limited to 'src/backends/backendsCommon') diff --git a/src/backends/backendsCommon/LayerSupportBase.cpp b/src/backends/backendsCommon/LayerSupportBase.cpp index 137e77eebe..04f822cea9 100644 --- a/src/backends/backendsCommon/LayerSupportBase.cpp +++ b/src/backends/backendsCommon/LayerSupportBase.cpp @@ -115,6 +115,13 @@ bool LayerSupportBase::IsDepthwiseConvolutionSupported(const TensorInfo& input, return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); } +bool LayerSupportBase::IsDequantizeSupported(const TensorInfo& input, + const TensorInfo& output, + Optional reasonIfUnsupported) const +{ + return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); +} + bool LayerSupportBase::IsDetectionPostProcessSupported(const armnn::TensorInfo& input0, const armnn::TensorInfo& input1, const armnn::DetectionPostProcessDescriptor& descriptor, diff --git a/src/backends/backendsCommon/LayerSupportBase.hpp b/src/backends/backendsCommon/LayerSupportBase.hpp index ceb3b2768e..7d64095667 100644 --- a/src/backends/backendsCommon/LayerSupportBase.hpp +++ b/src/backends/backendsCommon/LayerSupportBase.hpp @@ -67,6 +67,10 @@ public: const Optional& biases, Optional reasonIfUnsupported = EmptyOptional()) const override; + bool IsDequantizeSupported(const TensorInfo& input, + const TensorInfo& output, + Optional reasonIfUnsupported = EmptyOptional()) const override; + bool IsDetectionPostProcessSupported(const TensorInfo& input0, const TensorInfo& input1, const DetectionPostProcessDescriptor& descriptor, diff --git a/src/backends/backendsCommon/WorkloadData.cpp b/src/backends/backendsCommon/WorkloadData.cpp index e30a3f36b7..91b1c5790b 100644 --- a/src/backends/backendsCommon/WorkloadData.cpp +++ b/src/backends/backendsCommon/WorkloadData.cpp @@ -1153,6 +1153,23 @@ void DetectionPostProcessQueueDescriptor::Validate(const WorkloadInfo& workloadI } } +void DequantizeQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const +{ + ValidateSingleInput(workloadInfo, "DequantizeQueueDescriptor"); + ValidateSingleOutput(workloadInfo, "DequantizeQueueDescriptor"); + + if (workloadInfo.m_InputTensorInfos[0].GetDataType() != DataType::QuantisedAsymm8 && + workloadInfo.m_InputTensorInfos[0].GetDataType() != DataType::QuantisedSymm16) + { + throw InvalidArgumentException("Input to dequantize layer must be quantized type."); + } + + if (workloadInfo.m_OutputTensorInfos[0].GetDataType() != DataType::Float32) + { + throw InvalidArgumentException("Output of dequantize layer must be Float32 type."); + } +} + void PreCompiledQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const { // This is internally generated so it should not need validation. diff --git a/src/backends/backendsCommon/WorkloadData.hpp b/src/backends/backendsCommon/WorkloadData.hpp index 9250ceac43..5640701d82 100644 --- a/src/backends/backendsCommon/WorkloadData.hpp +++ b/src/backends/backendsCommon/WorkloadData.hpp @@ -416,4 +416,9 @@ struct PreCompiledQueueDescriptor : QueueDescriptorWithParametersGetTensorInfo(); + const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo(); + + result = layerSupportObject->IsDequantizeSupported(OverrideDataType(input, dataType), + OverrideDataType(output, DataType::Float32), + reason); + break; + } case LayerType::DetectionPostProcess: { const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo(); @@ -821,6 +831,12 @@ std::unique_ptr IWorkloadFactory::CreateDepthwiseConvolution2d( return std::unique_ptr(); } +std::unique_ptr IWorkloadFactory::CreateDequantize( + const DequantizeQueueDescriptor& descriptor, const WorkloadInfo& info) const +{ + return std::unique_ptr(); +} + std::unique_ptr IWorkloadFactory::CreateDetectionPostProcess( const DetectionPostProcessQueueDescriptor& descriptor, const WorkloadInfo& info) const { diff --git a/src/backends/backendsCommon/WorkloadFactory.hpp b/src/backends/backendsCommon/WorkloadFactory.hpp index 2aa3854c4a..ed7303cf33 100644 --- a/src/backends/backendsCommon/WorkloadFactory.hpp +++ b/src/backends/backendsCommon/WorkloadFactory.hpp @@ -79,6 +79,9 @@ public: virtual std::unique_ptr CreateDepthwiseConvolution2d( const DepthwiseConvolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const; + virtual std::unique_ptr CreateDequantize(const DequantizeQueueDescriptor& descriptor, + const WorkloadInfo& info) const; + virtual std::unique_ptr CreateDetectionPostProcess( const DetectionPostProcessQueueDescriptor& descriptor, const WorkloadInfo& info) const; diff --git a/src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp b/src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp index 8f86132274..26fb03f55d 100644 --- a/src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp +++ b/src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp @@ -336,6 +336,8 @@ DECLARE_LAYER_POLICY_1_PARAM(Debug) DECLARE_LAYER_POLICY_2_PARAM(DepthwiseConvolution2d) +DECLARE_LAYER_POLICY_1_PARAM(Dequantize) + DECLARE_LAYER_POLICY_2_PARAM(DetectionPostProcess) DECLARE_LAYER_POLICY_1_PARAM(Equal) -- cgit v1.2.1