aboutsummaryrefslogtreecommitdiff
path: root/src/armnnSerializer
diff options
context:
space:
mode:
authorFinnWilliamsArm <Finn.Williams@arm.com>2019-06-28 15:07:10 +0100
committerFinnWilliamsArm <Finn.Williams@arm.com>2019-07-01 10:53:47 +0100
commit6fb339a7d202a9c64d8c7843d630fe8ab7be9f33 (patch)
tree08f7119b14c042bc009cae4ca90c0c49c5c15387 /src/armnnSerializer
parenta9075df5b704e4f4432bf26027e3ba671d4596f0 (diff)
downloadarmnn-6fb339a7d202a9c64d8c7843d630fe8ab7be9f33.tar.gz
IVGCVSW-3364 Add serialization support for Resize layer
Signed-off-by: FinnWilliamsArm <Finn.Williams@arm.com> Change-Id: I3b1af816cefc1760f63324f365de93f899c9c9ee
Diffstat (limited to 'src/armnnSerializer')
-rw-r--r--src/armnnSerializer/ArmnnSchema.fbs23
-rw-r--r--src/armnnSerializer/Serializer.cpp15
-rw-r--r--src/armnnSerializer/SerializerSupport.md1
-rw-r--r--src/armnnSerializer/SerializerUtils.cpp13
-rw-r--r--src/armnnSerializer/SerializerUtils.hpp2
-rw-r--r--src/armnnSerializer/test/SerializerTests.cpp59
6 files changed, 110 insertions, 3 deletions
diff --git a/src/armnnSerializer/ArmnnSchema.fbs b/src/armnnSerializer/ArmnnSchema.fbs
index 7969d10598..09187927ae 100644
--- a/src/armnnSerializer/ArmnnSchema.fbs
+++ b/src/armnnSerializer/ArmnnSchema.fbs
@@ -36,6 +36,11 @@ enum DataLayout : byte {
NCHW = 1
}
+enum ResizeMethod: byte {
+ NearestNeighbor = 0,
+ Bilinear = 1,
+}
+
table TensorInfo {
dimensions:[uint];
dataType:DataType;
@@ -124,7 +129,8 @@ enum LayerType : uint {
Concat = 39,
SpaceToDepth = 40,
Prelu = 41,
- TransposeConvolution2d = 42
+ TransposeConvolution2d = 42,
+ Resize = 43
}
// Base layer table to be used as part of other layers
@@ -581,6 +587,18 @@ table TransposeConvolution2dDescriptor {
dataLayout:DataLayout = NCHW;
}
+table ResizeLayer {
+ base:LayerBase;
+ descriptor:ResizeDescriptor;
+}
+
+table ResizeDescriptor {
+ targetHeight:uint;
+ targetWidth:uint;
+ method:ResizeMethod = NearestNeighbor;
+ dataLayout:DataLayout;
+}
+
union Layer {
ActivationLayer,
AdditionLayer,
@@ -624,7 +642,8 @@ union Layer {
ConcatLayer,
SpaceToDepthLayer,
PreluLayer,
- TransposeConvolution2dLayer
+ TransposeConvolution2dLayer,
+ ResizeLayer
}
table AnyLayer {
diff --git a/src/armnnSerializer/Serializer.cpp b/src/armnnSerializer/Serializer.cpp
index 2d5877db63..57d674095b 100644
--- a/src/armnnSerializer/Serializer.cpp
+++ b/src/armnnSerializer/Serializer.cpp
@@ -660,7 +660,20 @@ void SerializerVisitor::VisitResizeLayer(const armnn::IConnectableLayer* layer,
const armnn::ResizeDescriptor& resizeDescriptor,
const char* name)
{
- throw armnn::Exception("SerializerVisitor::VisitResizeLayer is not yet implemented");
+ auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
+
+ auto flatBufferDescriptor =
+ CreateResizeDescriptor(m_flatBufferBuilder,
+ resizeDescriptor.m_TargetHeight,
+ resizeDescriptor.m_TargetWidth,
+ GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
+ GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
+
+ auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
+ flatBufferBaseLayer,
+ flatBufferDescriptor);
+
+ CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
}
void SerializerVisitor::VisitRsqrtLayer(const armnn::IConnectableLayer* layer, const char* name)
diff --git a/src/armnnSerializer/SerializerSupport.md b/src/armnnSerializer/SerializerSupport.md
index 99bc332ac8..924bab423f 100644
--- a/src/armnnSerializer/SerializerSupport.md
+++ b/src/armnnSerializer/SerializerSupport.md
@@ -46,6 +46,7 @@ The Arm NN SDK Serializer currently supports the following layers:
* Subtraction
* Switch
* TransposeConvolution2d
+* Resize
More machine learning layers will be supported in future releases.
diff --git a/src/armnnSerializer/SerializerUtils.cpp b/src/armnnSerializer/SerializerUtils.cpp
index bfe795c8c4..9790d6e23b 100644
--- a/src/armnnSerializer/SerializerUtils.cpp
+++ b/src/armnnSerializer/SerializerUtils.cpp
@@ -124,4 +124,17 @@ armnnSerializer::NormalizationAlgorithmMethod GetFlatBufferNormalizationAlgorith
}
}
+armnnSerializer::ResizeMethod GetFlatBufferResizeMethod(armnn::ResizeMethod method)
+{
+ switch (method)
+ {
+ case armnn::ResizeMethod::NearestNeighbor:
+ return armnnSerializer::ResizeMethod_NearestNeighbor;
+ case armnn::ResizeMethod::Bilinear:
+ return armnnSerializer::ResizeMethod_Bilinear;
+ default:
+ return armnnSerializer::ResizeMethod_NearestNeighbor;
+ }
+}
+
} // namespace armnnSerializer \ No newline at end of file
diff --git a/src/armnnSerializer/SerializerUtils.hpp b/src/armnnSerializer/SerializerUtils.hpp
index 29cda0d629..578689b2dd 100644
--- a/src/armnnSerializer/SerializerUtils.hpp
+++ b/src/armnnSerializer/SerializerUtils.hpp
@@ -30,4 +30,6 @@ armnnSerializer::NormalizationAlgorithmChannel GetFlatBufferNormalizationAlgorit
armnnSerializer::NormalizationAlgorithmMethod GetFlatBufferNormalizationAlgorithmMethod(
armnn::NormalizationAlgorithmMethod normalizationAlgorithmMethod);
+armnnSerializer::ResizeMethod GetFlatBufferResizeMethod(armnn::ResizeMethod method);
+
} // namespace armnnSerializer
diff --git a/src/armnnSerializer/test/SerializerTests.cpp b/src/armnnSerializer/test/SerializerTests.cpp
index 294adec12e..e51f76bd33 100644
--- a/src/armnnSerializer/test/SerializerTests.cpp
+++ b/src/armnnSerializer/test/SerializerTests.cpp
@@ -2025,6 +2025,65 @@ BOOST_AUTO_TEST_CASE(SerializeReshape)
deserializedNetwork->Accept(verifier);
}
+BOOST_AUTO_TEST_CASE(SerializeResize)
+{
+ class ResizeLayerVerifier : public LayerVerifierBase
+ {
+ public:
+ ResizeLayerVerifier(const std::string& layerName,
+ const std::vector<armnn::TensorInfo>& inputInfos,
+ const std::vector<armnn::TensorInfo>& outputInfos,
+ const armnn::ResizeDescriptor& descriptor)
+ : LayerVerifierBase(layerName, inputInfos, outputInfos)
+ , m_Descriptor(descriptor) {}
+
+ void VisitResizeLayer(const armnn::IConnectableLayer* layer,
+ const armnn::ResizeDescriptor& descriptor,
+ const char* name) override
+ {
+ VerifyNameAndConnections(layer, name);
+ VerifyDescriptor(descriptor);
+ }
+
+ private:
+ void VerifyDescriptor(const armnn::ResizeDescriptor& descriptor)
+ {
+ BOOST_CHECK(descriptor.m_DataLayout == m_Descriptor.m_DataLayout);
+ BOOST_CHECK(descriptor.m_TargetWidth == m_Descriptor.m_TargetWidth);
+ BOOST_CHECK(descriptor.m_TargetHeight == m_Descriptor.m_TargetHeight);
+ BOOST_CHECK(descriptor.m_Method == m_Descriptor.m_Method);
+ }
+
+ armnn::ResizeDescriptor m_Descriptor;
+ };
+
+ const std::string layerName("resize");
+ const armnn::TensorInfo inputInfo = armnn::TensorInfo({1, 3, 5, 5}, armnn::DataType::Float32);
+ const armnn::TensorInfo outputInfo = armnn::TensorInfo({1, 3, 2, 4}, armnn::DataType::Float32);
+
+ armnn::ResizeDescriptor desc;
+ desc.m_TargetWidth = 4;
+ desc.m_TargetHeight = 2;
+ desc.m_Method = armnn::ResizeMethod::NearestNeighbor;
+
+ armnn::INetworkPtr network = armnn::INetwork::Create();
+ armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
+ armnn::IConnectableLayer* const resizeLayer = network->AddResizeLayer(desc, layerName.c_str());
+ armnn::IConnectableLayer* const outputLayer = network->AddOutputLayer(0);
+
+ inputLayer->GetOutputSlot(0).Connect(resizeLayer->GetInputSlot(0));
+ resizeLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
+
+ inputLayer->GetOutputSlot(0).SetTensorInfo(inputInfo);
+ resizeLayer->GetOutputSlot(0).SetTensorInfo(outputInfo);
+
+ armnn::INetworkPtr deserializedNetwork = DeserializeNetwork(SerializeNetwork(*network));
+ BOOST_CHECK(deserializedNetwork);
+
+ ResizeLayerVerifier verifier(layerName, {inputInfo}, {outputInfo}, desc);
+ deserializedNetwork->Accept(verifier);
+}
+
BOOST_AUTO_TEST_CASE(SerializeResizeBilinear)
{
class ResizeBilinearLayerVerifier : public LayerVerifierBase