IVGCVSW-4888 Update Resize Front end for new parameters
authorDavid Monahan <david.monahan@arm.com>
Sat, 30 May 2020 08:48:39 +0000 (09:48 +0100)
committerDavid Monahan <david.monahan@arm.com>
Sat, 30 May 2020 10:35:48 +0000 (11:35 +0100)
 * Added AlignCorners and HalfPixelCenters to Resize and ResizeBilinear
 * Updated Serializer and Serializer tests

!android-nn-driver:3280

Signed-off-by: David Monahan <david.monahan@arm.com>
Change-Id: Ice3bb448c239b04323854641525bfe0808c03b2e

include/armnn/Descriptors.hpp
src/armnn/Network.cpp
src/armnnDeserializer/Deserializer.cpp
src/armnnSerializer/ArmnnSchema.fbs
src/armnnSerializer/Serializer.cpp
src/armnnSerializer/test/SerializerTests.cpp
src/armnnTfLiteParser/TfLiteParser.cpp
src/backends/cl/workloads/ClResizeWorkload.cpp
src/backends/neon/workloads/NeonResizeWorkload.cpp
src/backends/reference/workloads/RefResizeWorkload.cpp

index 13765e8..9e5dea2 100644 (file)
@@ -718,6 +718,8 @@ struct ResizeBilinearDescriptor
         : m_TargetWidth(0)
         , m_TargetHeight(0)
         , m_DataLayout(DataLayout::NCHW)
+        , m_AlignCorners(false)
+        , m_HalfPixelCenters(false)
     {}
 
     /// Target width value.
@@ -726,6 +728,10 @@ struct ResizeBilinearDescriptor
     uint32_t          m_TargetHeight;
     /// The data layout to be used (NCHW, NHWC).
     DataLayout m_DataLayout;
+    /// Aligned corners
+    bool m_AlignCorners;
+    /// Half Pixel Centers
+    bool m_HalfPixelCenters;
 };
 
 /// A ResizeDescriptor for the ResizeLayer.
@@ -736,7 +742,7 @@ struct ResizeDescriptor
         , m_TargetHeight(0)
         , m_Method(ResizeMethod::NearestNeighbor)
         , m_DataLayout(DataLayout::NCHW)
-        , m_BilinearAlignCorners(false)
+        , m_AlignCorners(false)
         , m_HalfPixelCenters(false)
     {}
 
@@ -746,7 +752,7 @@ struct ResizeDescriptor
                m_TargetHeight         == rhs.m_TargetHeight &&
                m_Method               == rhs.m_Method &&
                m_DataLayout           == rhs.m_DataLayout &&
-               m_BilinearAlignCorners == rhs.m_BilinearAlignCorners &&
+               m_AlignCorners         == rhs.m_AlignCorners &&
                m_HalfPixelCenters     == rhs.m_HalfPixelCenters;
     }
 
@@ -759,8 +765,8 @@ struct ResizeDescriptor
     ResizeMethod m_Method;
     /// The data layout to be used (NCHW, NHWC).
     DataLayout m_DataLayout;
-    /// Aligned corners for bilinear method
-    bool m_BilinearAlignCorners;
+    /// Aligned corners
+    bool m_AlignCorners;
     /// Half Pixel Centers
     bool m_HalfPixelCenters;
 };
index a047297..d636d01 100644 (file)
@@ -1458,10 +1458,12 @@ IConnectableLayer* Network::AddResizeBilinearLayer(const ResizeBilinearDescripto
                                                    const char* name)
 {
     ResizeDescriptor resizeDescriptor;
-    resizeDescriptor.m_Method       = ResizeMethod::Bilinear;
-    resizeDescriptor.m_DataLayout   = descriptor.m_DataLayout;
-    resizeDescriptor.m_TargetWidth  = descriptor.m_TargetWidth;
-    resizeDescriptor.m_TargetHeight = descriptor.m_TargetHeight;
+    resizeDescriptor.m_Method           = ResizeMethod::Bilinear;
+    resizeDescriptor.m_DataLayout       = descriptor.m_DataLayout;
+    resizeDescriptor.m_TargetWidth      = descriptor.m_TargetWidth;
+    resizeDescriptor.m_TargetHeight     = descriptor.m_TargetHeight;
+    resizeDescriptor.m_AlignCorners     = descriptor.m_AlignCorners;
+    resizeDescriptor.m_HalfPixelCenters = descriptor.m_HalfPixelCenters;
 
     return m_Graph->AddLayer<ResizeLayer>(resizeDescriptor, name);
 }
index 36beebc..bea34e1 100644 (file)
@@ -2045,6 +2045,8 @@ void Deserializer::ParseResize(GraphPtr graph, unsigned int layerIndex)
     descriptor.m_TargetHeight = flatBufferDescriptor->targetHeight();
     descriptor.m_Method = ToResizeMethod(flatBufferDescriptor->method());
     descriptor.m_DataLayout = ToDataLayout(flatBufferDescriptor->dataLayout());
+    descriptor.m_AlignCorners = flatBufferDescriptor->alignCorners();
+    descriptor.m_HalfPixelCenters = flatBufferDescriptor->halfPixelCenters();
 
     auto layerName = GetLayerName(graph, layerIndex);
     IConnectableLayer* layer = m_Network->AddResizeLayer(descriptor, layerName.c_str());
@@ -2073,6 +2075,8 @@ void Deserializer::ParseResizeBilinear(GraphPtr graph, unsigned int layerIndex)
     descriptor.m_TargetHeight = flatBufferDescriptor->targetHeight();
     descriptor.m_Method       = armnn::ResizeMethod::Bilinear;
     descriptor.m_DataLayout   = ToDataLayout(flatBufferDescriptor->dataLayout());
+    descriptor.m_AlignCorners = flatBufferDescriptor->alignCorners();
+    descriptor.m_HalfPixelCenters = flatBufferDescriptor->halfPixelCenters();
 
     auto layerName = GetLayerName(graph, layerIndex);
     IConnectableLayer* layer = m_Network->AddResizeLayer(descriptor, layerName.c_str());
index 6e5ee3f..532c12c 100644 (file)
@@ -558,6 +558,8 @@ table ResizeBilinearDescriptor {
     targetWidth:uint;
     targetHeight:uint;
     dataLayout:DataLayout;
+    alignCorners:bool;
+    halfPixelCenters:bool;
 }
 
 table SliceLayer {
@@ -817,6 +819,8 @@ table ResizeDescriptor {
     targetWidth:uint;
     method:ResizeMethod = NearestNeighbor;
     dataLayout:DataLayout;
+    alignCorners:bool;
+    halfPixelCenters:bool;
 }
 
 table StackLayer {
index c4d3cfb..9c62a93 100644 (file)
@@ -864,7 +864,9 @@ void SerializerVisitor::VisitResizeBilinearLayer(const armnn::IConnectableLayer*
         CreateResizeBilinearDescriptor(m_flatBufferBuilder,
                                        resizeDescriptor.m_TargetWidth,
                                        resizeDescriptor.m_TargetHeight,
-                                       GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
+                                       GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
+                                       resizeDescriptor.m_AlignCorners,
+                                       resizeDescriptor.m_HalfPixelCenters);
 
     auto flatBufferLayer = serializer::CreateResizeBilinearLayer(m_flatBufferBuilder,
                                                                  flatBufferBaseLayer,
@@ -886,7 +888,9 @@ void SerializerVisitor::VisitResizeLayer(const armnn::IConnectableLayer* layer,
                                    resizeDescriptor.m_TargetHeight,
                                    resizeDescriptor.m_TargetWidth,
                                    GetFlatBufferResizeMethod(resizeDescriptor.m_Method),
-                                   GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout));
+                                   GetFlatBufferDataLayout(resizeDescriptor.m_DataLayout),
+                                   resizeDescriptor.m_AlignCorners,
+                                   resizeDescriptor.m_HalfPixelCenters);
 
     auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
                                                          flatBufferBaseLayer,
index 76ac5a4..e7f93c6 100644 (file)
@@ -2206,6 +2206,8 @@ BOOST_AUTO_TEST_CASE(SerializeResize)
     desc.m_TargetWidth  = 4;
     desc.m_TargetHeight = 2;
     desc.m_Method       = armnn::ResizeMethod::NearestNeighbor;
+    desc.m_AlignCorners = true;
+    desc.m_HalfPixelCenters = true;
 
     armnn::INetworkPtr network = armnn::INetwork::Create();
     armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
@@ -2241,10 +2243,12 @@ public:
     {
         VerifyNameAndConnections(layer, name);
 
-        BOOST_CHECK(descriptor.m_Method       == armnn::ResizeMethod::Bilinear);
-        BOOST_CHECK(descriptor.m_TargetWidth  == m_Descriptor.m_TargetWidth);
-        BOOST_CHECK(descriptor.m_TargetHeight == m_Descriptor.m_TargetHeight);
-        BOOST_CHECK(descriptor.m_DataLayout   == m_Descriptor.m_DataLayout);
+        BOOST_CHECK(descriptor.m_Method             == armnn::ResizeMethod::Bilinear);
+        BOOST_CHECK(descriptor.m_TargetWidth        == m_Descriptor.m_TargetWidth);
+        BOOST_CHECK(descriptor.m_TargetHeight       == m_Descriptor.m_TargetHeight);
+        BOOST_CHECK(descriptor.m_DataLayout         == m_Descriptor.m_DataLayout);
+        BOOST_CHECK(descriptor.m_AlignCorners       == m_Descriptor.m_AlignCorners);
+        BOOST_CHECK(descriptor.m_HalfPixelCenters   == m_Descriptor.m_HalfPixelCenters);
     }
 
     void VisitResizeBilinearLayer(const armnn::IConnectableLayer*,
@@ -2267,6 +2271,8 @@ BOOST_AUTO_TEST_CASE(SerializeResizeBilinear)
     armnn::ResizeBilinearDescriptor desc;
     desc.m_TargetWidth  = 4u;
     desc.m_TargetHeight = 2u;
+    desc.m_AlignCorners = true;
+    desc.m_HalfPixelCenters = true;
 
     armnn::INetworkPtr network = armnn::INetwork::Create();
     armnn::IConnectableLayer* const inputLayer = network->AddInputLayer(0);
index 08bd68d..53b49f4 100644 (file)
@@ -2168,7 +2168,7 @@ void TfLiteParser::ParseResize(size_t subgraphIndex, size_t operatorIndex, Resiz
             const auto & operatorPtr = m_Model->subgraphs[subgraphIndex]->operators[operatorIndex];
             const auto * options     = operatorPtr->builtin_options.AsResizeBilinearOptions();
 
-            desc.m_BilinearAlignCorners = options->align_corners;
+            desc.m_AlignCorners = options->align_corners;
             break;
         }
         case ResizeMethod::NearestNeighbor:
index 05b212c..adfb368 100644 (file)
@@ -40,7 +40,7 @@ arm_compute::Status ClResizeWorkloadValidate(const TensorInfo& input,
                                           arm_compute::PixelValue(0.f),
                                           arm_compute::SamplingPolicy::TOP_LEFT,
                                           true,
-                                          descriptor.m_BilinearAlignCorners);
+                                          descriptor.m_AlignCorners);
 }
 
 ClResizeWorkload::ClResizeWorkload(const ResizeQueueDescriptor& descriptor, const WorkloadInfo& info) :
@@ -65,7 +65,7 @@ ClResizeWorkload::ClResizeWorkload(const ResizeQueueDescriptor& descriptor, cons
                             arm_compute::PixelValue(0.f),
                             arm_compute::SamplingPolicy::TOP_LEFT,
                             true,
-                            descriptor.m_Parameters.m_BilinearAlignCorners);
+                            descriptor.m_Parameters.m_AlignCorners);
 };
 
 void ClResizeWorkload::Execute() const
index 9e3be26..afb753f 100644 (file)
@@ -64,7 +64,7 @@ NeonResizeWorkload::NeonResizeWorkload(const ResizeQueueDescriptor& descriptor,
                             arm_compute::PixelValue(0.f),
                             arm_compute::SamplingPolicy::TOP_LEFT,
                             true,
-                            descriptor.m_Parameters.m_BilinearAlignCorners);
+                            descriptor.m_Parameters.m_AlignCorners);
 };
 
 void NeonResizeWorkload::Execute() const
index 624b426..4e53c4f 100644 (file)
@@ -35,7 +35,7 @@ void RefResizeWorkload::Execute() const
            outputInfo,
            m_Data.m_Parameters.m_DataLayout,
            m_Data.m_Parameters.m_Method,
-           m_Data.m_Parameters.m_BilinearAlignCorners);
+           m_Data.m_Parameters.m_AlignCorners);
 }
 
 } //namespace armnn