From a6b504a8925174739f5a064cf77d1563cca38708 Mon Sep 17 00:00:00 2001 From: Francis Murtagh Date: Mon, 18 Feb 2019 17:14:10 +0000 Subject: IVGCVSW-2619 Support static quantization of StridedSlice Change-Id: Iff0902ea2751b079563ce82fbbec6db5157c3392 Signed-off-by: Francis Murtagh --- src/armnn/QuantizerVisitor.cpp | 9 +++++++++ src/armnn/QuantizerVisitor.hpp | 4 ++++ src/armnn/StaticRangeVisitor.cpp | 9 +++++++++ src/armnn/StaticRangeVisitor.hpp | 4 ++++ src/armnn/test/QuantizerTest.cpp | 30 ++++++++++++++++++++++++++++++ 5 files changed, 56 insertions(+) diff --git a/src/armnn/QuantizerVisitor.cpp b/src/armnn/QuantizerVisitor.cpp index 8b009c679f..c0cf0dfc5b 100644 --- a/src/armnn/QuantizerVisitor.cpp +++ b/src/armnn/QuantizerVisitor.cpp @@ -289,4 +289,13 @@ void QuantizerVisitor::VisitResizeBilinearLayer(const IConnectableLayer* layer, SetQuantizedInputConnections(layer, newLayer); } +void QuantizerVisitor::VisitStridedSliceLayer(const IConnectableLayer* layer, + const StridedSliceDescriptor& stridedSliceDescriptor, + const char* name) +{ + IConnectableLayer* newLayer = m_QuantizedNetwork->AddStridedSliceLayer(stridedSliceDescriptor, name); + RecordLayer(layer, newLayer); + SetQuantizedInputConnections(layer, newLayer); +} + } //namespace armnn diff --git a/src/armnn/QuantizerVisitor.hpp b/src/armnn/QuantizerVisitor.hpp index 2ccbac2ffc..6954ede8c7 100644 --- a/src/armnn/QuantizerVisitor.hpp +++ b/src/armnn/QuantizerVisitor.hpp @@ -100,6 +100,10 @@ public: const ResizeBilinearDescriptor& resizeDesc, const char* name = nullptr) override; + void VisitStridedSliceLayer(const IConnectableLayer* layer, + const StridedSliceDescriptor& stridedSliceDescriptor, + const char* name = nullptr) override; + /// Extract the quantized network INetworkPtr RetrieveFinalNetwork() { return std::move(m_QuantizedNetwork); } diff --git a/src/armnn/StaticRangeVisitor.cpp b/src/armnn/StaticRangeVisitor.cpp index 15f4616988..766b4ad3db 100644 --- a/src/armnn/StaticRangeVisitor.cpp +++ b/src/armnn/StaticRangeVisitor.cpp @@ -225,4 +225,13 @@ void StaticRangeVisitor::VisitResizeBilinearLayer(const IConnectableLayer* layer ForwardParentParameters(layer); } +void StaticRangeVisitor::VisitStridedSliceLayer(const IConnectableLayer* layer, + const StridedSliceDescriptor& stridedSliceDescriptor, + const char* name) +{ + boost::ignore_unused(stridedSliceDescriptor); + boost::ignore_unused(name); + ForwardParentParameters(layer); +} + } //namespace armnn diff --git a/src/armnn/StaticRangeVisitor.hpp b/src/armnn/StaticRangeVisitor.hpp index 6984346a7f..1002c860a5 100644 --- a/src/armnn/StaticRangeVisitor.hpp +++ b/src/armnn/StaticRangeVisitor.hpp @@ -91,6 +91,10 @@ public: const ResizeBilinearDescriptor& resizeDesc, const char* name = nullptr) override; + void VisitStridedSliceLayer(const IConnectableLayer* layer, + const StridedSliceDescriptor& stridedSliceDescriptor, + const char* name = nullptr) override; + private: /// Set the range for an output slot on a layer void SetRange(const IConnectableLayer* layer, unsigned int outputIdx, float min, float max); diff --git a/src/armnn/test/QuantizerTest.cpp b/src/armnn/test/QuantizerTest.cpp index 21ac3e66ec..3edea9cc6e 100644 --- a/src/armnn/test/QuantizerTest.cpp +++ b/src/armnn/test/QuantizerTest.cpp @@ -1153,5 +1153,35 @@ BOOST_AUTO_TEST_CASE(QuantizeResizeBilinear) VisitLayersTopologically(quantizedNetwork.get(), validator); } +class TestStridedSliceQuantization : public TestLeakyReLuActivationQuantization +{ +public: + virtual void VisitStridedSliceLayer(const IConnectableLayer* layer, + const StridedSliceDescriptor& desc, + const char* name = nullptr) + { + CheckForwardedQuantizationSettings(layer); + } +}; + +BOOST_AUTO_TEST_CASE(QuantizeStridedSlice) +{ + auto network = INetwork::Create(); + + TensorShape shape{3U}; + TensorInfo info(shape, DataType::Float32); + + IConnectableLayer* activation = CreateStartOfLeakyReluNetwork(network.get(), info); + + // Add the layer under test + StridedSliceDescriptor stridedSliceDesc; + IConnectableLayer* stridedSlice = network->AddStridedSliceLayer(stridedSliceDesc); + CompleteLeakyReluNetwork(network.get(), activation, stridedSlice, info); + + auto quantizedNetwork = INetworkQuantizer::Create(network.get())->ExportNetwork(); + TestStridedSliceQuantization validator; + VisitLayersTopologically(quantizedNetwork.get(), validator); +} + BOOST_AUTO_TEST_SUITE_END() } // namespace armnn -- cgit v1.2.1