blob: 0b60db28ee0b0c732d50177271c44b744cf0ca6d [file] [log] [blame]
Teresa Charlina9075df2019-06-27 15:41:57 +01001//
Declan-ARM7c75e332024-03-12 16:40:25 +00002// Copyright © 2019-2024 Arm Ltd and Contributors. All rights reserved.
Teresa Charlina9075df2019-06-27 15:41:57 +01003// SPDX-License-Identifier: MIT
4//
Teresa Charlina9075df2019-06-27 15:41:57 +01005
Matteo Martincighe011d202019-11-28 11:35:47 +00006#include "ResizeLayer.hpp"
Teresa Charlina9075df2019-06-27 15:41:57 +01007#include "LayerCloneBase.hpp"
8
9#include <armnn/TypesUtils.hpp>
10
Matteo Martincighe011d202019-11-28 11:35:47 +000011#include <armnnUtils/DataLayoutIndexed.hpp>
12
Colm Donelan0c479742021-12-10 12:43:54 +000013#include <armnn/backends/WorkloadData.hpp>
14#include <armnn/backends/WorkloadFactory.hpp>
Teresa Charlina9075df2019-06-27 15:41:57 +010015
Teresa Charlina9075df2019-06-27 15:41:57 +010016using namespace armnnUtils;
17
18namespace armnn
19{
20
21ResizeLayer::ResizeLayer(const ResizeDescriptor& param, const char* name)
22 : LayerWithParameters(1, 1, LayerType::Resize, param, name)
23{
24}
25
Derek Lamberti94a88d22019-12-10 21:12:59 +000026std::unique_ptr<IWorkload> ResizeLayer::CreateWorkload(const IWorkloadFactory& factory) const
Teresa Charlina9075df2019-06-27 15:41:57 +010027{
28 ResizeQueueDescriptor descriptor;
Keith Davisdf04d232020-10-23 17:20:05 +010029 SetAdditionalInfo(descriptor);
30
Teresa Charlin611c7fb2022-01-07 09:47:29 +000031 return factory.CreateWorkload(LayerType::Resize, descriptor, PrepInfoAndDesc(descriptor));
Teresa Charlina9075df2019-06-27 15:41:57 +010032}
33
34ResizeLayer* ResizeLayer::Clone(Graph& graph) const
35{
36 return CloneBase<ResizeLayer>(graph, m_Param, GetName());
37}
38
39std::vector<TensorShape> ResizeLayer::InferOutputShapes(const std::vector<TensorShape>& inputShapes) const
40{
Declan-ARM7c75e332024-03-12 16:40:25 +000041 if (inputShapes.size() != 1)
42 {
43 throw armnn::Exception("inputShapes' size is \"" + std::to_string(inputShapes.size()) +
44 "\" - should be \"1\".");
45 }
Teresa Charlina9075df2019-06-27 15:41:57 +010046
47 const TensorShape& inputShape = inputShapes[0];
48 const DataLayoutIndexed dimensionIndices = m_Param.m_DataLayout;
49
50 unsigned int outWidth = m_Param.m_TargetWidth;
51 unsigned int outHeight = m_Param.m_TargetHeight;
52 unsigned int outChannels = inputShape[dimensionIndices.GetChannelsIndex()];
53 unsigned int outBatch = inputShape[0];
54
55 TensorShape tensorShape = m_Param.m_DataLayout == armnn::DataLayout::NHWC ?
56 TensorShape( { outBatch, outHeight, outWidth, outChannels } ) :
57 TensorShape( { outBatch, outChannels, outHeight, outWidth });
58
David Monahanab219752020-06-19 16:43:48 +010059 if (m_Param.m_HalfPixelCenters && m_Param.m_AlignCorners)
60 {
61 throw LayerValidationException("ResizeLayer: AlignCorners cannot be true when HalfPixelCenters is true");
62 }
63
Teresa Charlina9075df2019-06-27 15:41:57 +010064 return std::vector<TensorShape>({ tensorShape });
65}
66
Finn Williamsf24effa2020-07-03 10:12:03 +010067void ResizeLayer::ValidateTensorShapesFromInputs()
Teresa Charlina9075df2019-06-27 15:41:57 +010068{
69 VerifyLayerConnections(1, CHECK_LOCATION());
70
Finn Williams87d0bda2020-07-03 10:12:03 +010071 const TensorShape& outputShape = GetOutputSlot(0).GetTensorInfo().GetShape();
72
Finn Williamsf24effa2020-07-03 10:12:03 +010073 VerifyShapeInferenceType(outputShape, m_ShapeInferenceMethod);
Finn Williams87d0bda2020-07-03 10:12:03 +010074
Mike Kellya9ac6ba2023-06-30 15:18:26 +010075 auto inferredShapes = InferOutputShapes({ GetInputSlot(0).GetTensorInfo().GetShape() });
Teresa Charlina9075df2019-06-27 15:41:57 +010076
Declan-ARM7c75e332024-03-12 16:40:25 +000077 if (inferredShapes.size() != 1)
78 {
79 throw armnn::LayerValidationException("inferredShapes has "
80 + std::to_string(inferredShapes.size()) +
81 " elements - should only have 1.");
82 }
Teresa Charlina9075df2019-06-27 15:41:57 +010083
Finn Williamsf24effa2020-07-03 10:12:03 +010084 ValidateAndCopyShape(outputShape, inferredShapes[0], m_ShapeInferenceMethod, "ResizeLayer");
Teresa Charlina9075df2019-06-27 15:41:57 +010085}
86
Nikhil Raj4d2eec02022-05-30 11:08:52 +010087void ResizeLayer::ExecuteStrategy(IStrategy& strategy) const
Teresa Charlina9075df2019-06-27 15:41:57 +010088{
Nikhil Raj4d2eec02022-05-30 11:08:52 +010089 strategy.ExecuteStrategy(this, GetParameters(), {}, GetName());
Teresa Charlina9075df2019-06-27 15:41:57 +010090}
Teresa Charlina9075df2019-06-27 15:41:57 +010091
92} // namespace armnn