39 inline void check_nodeidx_pair(
const NodeIdxPair &pair,
const Graph &g)
43 ARM_COMPUTE_ERROR_ON((pair.node_id >= g.nodes().size()) || (g.node((pair).node_id) ==
nullptr) || (pair.index >= g.node(pair.node_id)->num_outputs()));
46 Status set_node_params(Graph &g,
NodeID nid, NodeParams ¶ms)
48 INode *node = g.node(nid);
51 node->set_common_node_parameters(params);
58 INode *node = g.node(nid);
61 Tensor *tensor = is_output ? node->output(idx) : node->input(idx);
64 tensor->set_accessor(std::move(accessor));
69 NodeID add_const_node_with_name(Graph &g, NodeParams params,
const std::string &
name,
const TensorDescriptor &desc,
ITensorAccessorUPtr accessor)
71 params.name = params.name.empty() ?
"" : params.name +
name;
73 set_node_params(g, nid, params);
77 template <
typename NT,
typename... Args>
78 NodeID create_simple_single_input_output_node(Graph &g, NodeParams ¶ms, NodeIdxPair
input, Args &&...
args)
80 check_nodeidx_pair(input, g);
82 NodeID nid = g.add_node<NT>(std::forward<Args>(
args)...);
83 g.add_connection(
input.node_id,
input.index, nid, 0);
84 set_node_params(g, nid, params);
89 template <
typename NT,
typename... Args>
90 NodeID create_simple_multiple_input_single_output_node(Graph &g, NodeParams ¶ms,
const std::vector<NodeIdxPair> &inputs, Args &&...
args)
94 NodeID nid = g.add_node<NT>(std::forward<Args>(
args)...);
97 for(
const auto &
input : inputs)
99 check_nodeidx_pair(
input, g);
100 g.add_connection(
input.node_id,
input.index, nid, i++);
102 set_node_params(g, nid, params);
111 set_node_params(g, nid, params);
112 set_accessor_on_node(g, nid,
true, 0, std::move(accessor));
119 set_node_params(g, nid, params);
120 set_accessor_on_node(g, nid,
true, 0, std::move(accessor));
126 check_nodeidx_pair(input, g);
130 set_node_params(g, nid, params);
131 set_accessor_on_node(g, nid,
false, 0, std::move(accessor));
139 return create_simple_single_input_output_node<ActivationLayerNode>(g, params,
input, act_info, out_quant_info);
145 return create_simple_single_input_output_node<ArgMinMaxLayerNode>(g, params,
input, op, axis, out_data_type, out_quant_info);
152 check_nodeidx_pair(input, g);
154 bool has_beta = (beta_accessor !=
nullptr);
155 bool has_gamma = (gamma_accessor !=
nullptr);
165 auto mean_nid = add_const_node_with_name(g, params,
"Mean", common_desc, std::move(mean_accessor));
166 auto var_nid = add_const_node_with_name(g, params,
"Variance", common_desc, std::move(var_accessor));
172 beta_nid = add_const_node_with_name(g, params,
"Beta", common_desc, std::move(beta_accessor));
179 gamma_nid = add_const_node_with_name(g, params,
"Gamma", common_desc, std::move(gamma_accessor));
195 set_node_params(g, batch_norm_nid, params);
197 return batch_norm_nid;
202 check_nodeidx_pair(input, g);
203 check_nodeidx_pair(deltas, g);
210 set_node_params(g, nid, params);
216 return create_simple_single_input_output_node<ChannelShuffleLayerNode>(g, params,
input,
num_groups);
226 check_nodeidx_pair(input, g);
230 bool has_bias = (bias_accessor !=
nullptr);
243 if(!weights_quant_info.
empty())
248 NodeID w_nid = add_const_node_with_name(g, params,
"Weights", w_desc, std::move(weights_accessor));
260 b_nid = add_const_node_with_name(g, params,
"Bias", b_desc, std::move(bias_accessor));
271 set_node_params(g, conv_nid, params);
281 check_nodeidx_pair(input, g);
285 bool has_bias = (bias_accessor !=
nullptr);
299 NodeID w_nid = add_const_node_with_name(g, params,
"Weights", w_desc, std::move(weights_accessor));
311 b_nid = add_const_node_with_name(g, params,
"Bias", b_desc, std::move(bias_accessor));
322 set_node_params(g, deconv_nid, params);
329 return create_simple_multiple_input_single_output_node<ConcatenateLayerNode>(g, params, inputs, inputs.size(), concat_descriptor);
336 check_nodeidx_pair(input, g);
339 bool has_bias = (bias_accessor !=
nullptr);
351 if(!quant_info.
empty())
356 NodeID w_nid = add_const_node_with_name(g, params,
"Weights", w_desc, std::move(weights_accessor));
370 b_nid = add_const_node_with_name(g, params,
"Bias", b_desc, std::move(bias_accessor));
381 set_node_params(g, conv_nid, params);
388 return create_simple_single_input_output_node<DepthToSpaceLayerNode>(g, params,
input, block_shape);
393 return create_simple_single_input_output_node<DequantizationLayerNode>(g, params,
input);
398 check_nodeidx_pair(input_loc, g);
399 check_nodeidx_pair(input_conf, g);
400 check_nodeidx_pair(input_priorbox, g);
408 set_node_params(g, detect_nid, params);
416 check_nodeidx_pair(input_box_encoding, g);
417 check_nodeidx_pair(input_class_prediction, g);
424 if(!anchor_quant_info.
empty())
430 auto anchors_nid = add_const_node_with_name(g, params,
"Anchors", anchor_desc, std::move(anchors_accessor));
438 set_node_params(g, detect_nid, params);
445 return create_simple_single_input_output_node<DummyNode>(g, params,
input,
shape);
450 check_nodeidx_pair(input0, g);
451 check_nodeidx_pair(input1, g);
458 set_node_params(g, nid, params);
465 return create_simple_single_input_output_node<FlattenLayerNode>(g, params,
input);
472 check_nodeidx_pair(input, g);
490 set_node_params(g, fc_nid, params);
500 check_nodeidx_pair(input, g);
503 bool has_bias = (bias_accessor !=
nullptr);
510 NodeID w_nid = add_const_node_with_name(g, params,
"Weights", w_desc, std::move(weights_accessor));
522 b_nid = add_const_node_with_name(g, params,
"Bias", b_desc, std::move(bias_accessor));
534 set_node_params(g, fc_nid, params);
541 check_nodeidx_pair(scores, g);
542 check_nodeidx_pair(deltas, g);
543 check_nodeidx_pair(anchors, g);
551 set_node_params(g, nid, params);
557 return create_simple_single_input_output_node<L2NormalizeLayerNode>(g, params,
input, axis,
epsilon);
562 return create_simple_single_input_output_node<NormalizationLayerNode>(g, params,
input, norm_info);
568 check_nodeidx_pair(input, g);
578 auto mean_nid = add_const_node_with_name(g, params,
"Mean", common_desc, std::move(mean_accessor));
579 auto std_nid = add_const_node_with_name(g, params,
"Std", common_desc, std::move(std_accessor));
586 set_node_params(g, norm_planar_yuv_nid, params);
588 return norm_planar_yuv_nid;
593 return create_simple_single_input_output_node<PadLayerNode>(g, params,
input, paddings, pad_value);
598 return create_simple_single_input_output_node<PermuteLayerNode>(g, params,
input, perm, layout);
603 check_nodeidx_pair(input, g);
604 check_nodeidx_pair(alpha, g);
610 set_node_params(g, prelu_nid, params);
617 return create_simple_single_input_output_node<PoolingLayerNode>(g, params,
input, pool_info);
622 return create_simple_single_input_output_node<PrintLayerNode>(g, params,
input, stream, format_info, transform);
627 check_nodeidx_pair(input0, g);
628 check_nodeidx_pair(input1, g);
635 set_node_params(g, prior_nid, params);
642 return create_simple_single_input_output_node<QuantizationLayerNode>(g, params,
input, out_quant_info);
647 return create_simple_single_input_output_node<ReductionLayerNode>(g, params,
input, op, axis, keep_dims);
652 return create_simple_single_input_output_node<ReorgLayerNode>(g, params,
input, stride);
657 return create_simple_single_input_output_node<ReshapeLayerNode>(g, params,
input,
shape);
661 float width_scale,
float height_scale)
663 return create_simple_single_input_output_node<ResizeLayerNode>(g, params,
input, policy, width_scale, height_scale);
668 check_nodeidx_pair(input, g);
669 check_nodeidx_pair(rois, g);
676 set_node_params(g, nid, params);
682 check_nodeidx_pair(input, g);
694 NodeID mul_const_nid = add_const_node_with_name(g, params,
"Mul", mul_desc, std::move(mul_accessor));
695 NodeIdxPair mul_const_nidxp = { mul_const_nid, 0 };
699 NodeID add_const_nid = add_const_node_with_name(g, params,
"Add", add_desc, std::move(add_accessor));
700 NodeIdxPair add_const_nidxp = { add_const_nid, 0 };
712 return create_simple_single_input_output_node<SoftmaxLayerNode>(g, params,
input, beta);
717 return create_simple_single_input_output_node<SliceLayerNode>(g, params,
input, starts, ends);
722 return create_simple_single_input_output_node<SplitLayerNode>(g, params,
input, num_splits, axis);
727 return create_simple_single_input_output_node<StridedSliceLayerNode>(g, params,
input, starts, ends, strides,
info);
732 return create_simple_multiple_input_single_output_node<StackLayerNode>(g, params, inputs, inputs.size(), axis);
737 check_nodeidx_pair(input, g);
750 set_node_params(g, box, params);
751 set_node_params(g, act_box, params);
756 const Coordinates imm_start = is_nhwc ? Coordinates(3, 0, 0) : Coordinates(0, 0, 3);
757 const Coordinates imm_end = is_nhwc ? Coordinates(5, -1, -1) : Coordinates(-1, -1, 5);
759 set_node_params(g, imm, params);
763 const Coordinates cls_start = is_nhwc ? Coordinates(5, 0, 0) : Coordinates(0, 0, 5);
764 const Coordinates cls_end = Coordinates(-1, -1, -1);
767 set_node_params(g, cls, params);
768 set_node_params(g, cls_act, params);
773 set_node_params(g, concat, params);
static NodeID add_reduction_operation_node(Graph &g, NodeParams params, NodeIdxPair input, ReductionOperation op, int axis, bool keep_dims=true)
Adds a reduction sum layer node to the graph.
TensorDescriptor get_tensor_descriptor(const Graph &g, TensorID tid)
Returns the tensor descriptor of a given tensor.
DataType data_type
Data type.
TensorShape shape
Tensor shape.
Class describing the value of a pixel for any image format.
static NodeID add_split_node(Graph &g, NodeParams params, NodeIdxPair input, unsigned int num_splits, unsigned int axis=0)
Adds a split node to the graph.
InterpolationPolicy
Interpolation method.
static NodeID add_quantization_node(Graph &g, NodeParams params, NodeIdxPair input, const QuantizationInfo &out_quant_info)
Adds a quantization layer node to the graph.
static NodeID add_batch_normalization_node(Graph &g, NodeParams params, NodeIdxPair input, float epsilon, ITensorAccessorUPtr mean_accessor=nullptr, ITensorAccessorUPtr var_accessor=nullptr, ITensorAccessorUPtr beta_accessor=nullptr, ITensorAccessorUPtr gamma_accessor=nullptr)
Adds a batch normalization layer node to the graph.
Deconvolution layer descriptor.
Generate Proposals Information class.
EltwiseOperation
Supported Element-wise operations.
Batch Normalization Layer node.
static NodeID add_input_node(Graph &g, NodeParams params, const TensorDescriptor &desc, ITensorAccessorUPtr accessor=nullptr)
Adds an input layer node to the graph.
size_t get_dimension_size(const TensorDescriptor &descriptor, const DataLayoutDimension data_layout_dimension)
Get size of a tensor's given dimension depending on its layout.
std::vector< PaddingInfo > PaddingList
List of padding information.
ReductionOperation
Available reduction operations.
static NodeID add_prelu_node(Graph &g, NodeParams params, NodeIdxPair input, NodeIdxPair alpha)
Adds a prelu layer node to the graph.
NodeID add_node(Ts &&... args)
Adds a node to the graph.
static NodeID add_resize_node(Graph &g, NodeParams params, NodeIdxPair input, InterpolationPolicy policy, float width_scale, float height_scale)
Adds a resize layer node to the graph.
static NodeID add_activation_node(Graph &g, NodeParams params, NodeIdxPair input, ActivationLayerInfo act_info, const QuantizationInfo &out_quant_info=QuantizationInfo())
Adds an activation layer node to the graph.
static NodeID add_normalization_node(Graph &g, NodeParams params, NodeIdxPair input, NormalizationLayerInfo norm_info)
Adds a normalization layer node to the graph.
static NodeID add_permute_node(Graph &g, NodeParams params, NodeIdxPair input, PermutationVector perm, DataLayout layout=DataLayout::UNKNOWN)
Adds a permute layer node to the graph.
Normalization Layer Information class.
Batch Normalization Layer node.
static NodeID add_yolo_node(Graph &g, NodeParams params, NodeIdxPair input, ActivationLayerInfo act_info)
Adds a yolo layer to the graph.
#define ARM_COMPUTE_ERROR_ON(cond)
If the condition is true then an error message is printed and an exception thrown.
Fully connected layer info.
std::unique_ptr< ITensorAccessor > ITensorAccessorUPtr
static NodeID add_bounding_box_transform_node(Graph &g, NodeParams params, NodeIdxPair input, NodeIdxPair deltas, BoundingBoxTransformInfo info)
Adds a bounding box transform layer node to the graph.
static NodeID add_reshape_node(Graph &g, NodeParams params, NodeIdxPair input, TensorShape shape)
Adds a reshape layer node to the graph.
#define ARM_COMPUTE_RETURN_ERROR_ON(cond)
If the condition is true, an error is returned.
Activation Layer Information class.
static NodeID add_priorbox_node(Graph &g, NodeParams params, NodeIdxPair input0, NodeIdxPair input1, const PriorBoxLayerInfo &prior_info)
Adds a priorbox layer node to the graph.
Interface for CPU tensor.
static NodeID add_concatenate_node(Graph &g, NodeParams params, const std::vector< NodeIdxPair > &inputs, const descriptors::ConcatLayerDescriptor &concat_descriptor)
Adds a depth concatenate node to the graph.
static NodeID add_generate_proposals_node(Graph &g, NodeParams params, NodeIdxPair scores, NodeIdxPair deltas, NodeIdxPair anchors, GenerateProposalsInfo info)
Adds a generate proposals layer node to the graph.
static NodeID add_slice_node(Graph &g, NodeParams params, NodeIdxPair input, Coordinates &starts, Coordinates &ends)
Adds a slice node to the graph.
static NodeID add_deconvolution_node(Graph &g, NodeParams params, NodeIdxPair input, Size2D kernel_spatial_extend, unsigned int depth, PadStrideInfo deconv_info, ITensorAccessorUPtr weights_accessor=nullptr, ITensorAccessorUPtr bias_accessor=nullptr)
Adds a deconvolution layer node to the graph.
static NodeID add_convolution_node(Graph &g, NodeParams params, NodeIdxPair input, Size2D kernel_spatial_extend, unsigned int depth, PadStrideInfo conv_info, unsigned int num_groups=1, ConvolutionMethod method=ConvolutionMethod::Default, FastMathHint fast_math_hint=FastMathHint::Disabled, ITensorAccessorUPtr weights_accessor=nullptr, ITensorAccessorUPtr bias_accessor=nullptr, const QuantizationInfo &weights_quant_info=QuantizationInfo(), const QuantizationInfo &out_quant_info=QuantizationInfo())
Adds a convolution layer node to the graph.
static NodeID add_depth_to_space_node(Graph &g, NodeParams params, NodeIdxPair input, int32_t block_shape)
Adds an depth to space layer node to the graph.
Copyright (c) 2017-2021 Arm Limited.
size_t height
Height of the image region or rectangle.
static NodeID add_detection_output_node(Graph &g, NodeParams params, NodeIdxPair input_loc, NodeIdxPair input_conf, NodeIdxPair input_priorbox, const DetectionOutputLayerInfo &detect_info)
Adds a detection output layer node to the graph.
static NodeID add_pad_node(Graph &g, NodeParams params, NodeIdxPair input, const PaddingList &paddings, PixelValue pad_value=PixelValue())
Adds a pad layer node to the graph.
1 channel, 1 S32 per channel
Quantization information.
QuantizationInfo quant_info
Quantization info.
static NodeID add_print_node(Graph &g, NodeParams params, NodeIdxPair input, std::ostream &stream, const IOFormatInfo &format_info=IOFormatInfo(), const std::function< ITensor *(ITensor *)> transform=nullptr)
Adds a print layer node to the graph.
static NodeID add_stack_node(Graph &g, NodeParams params, const std::vector< NodeIdxPair > &inputs, int axis)
Adds a stack layer node to the graph.
#define ARM_COMPUTE_UNUSED(...)
To avoid unused variables warnings.
static NodeID add_elementwise_node(Graph &g, NodeParams params, NodeIdxPair input0, NodeIdxPair input1, EltwiseOperation operation)
Adds an element-wise layer node to the graph.
static NodeID add_reorg_node(Graph &g, NodeParams params, NodeIdxPair input, int stride)
Adds a reorg layer node to the graph.
const unsigned int num_groups
DepthwiseConvolutionMethod
Supported Depthwise Convolution layer methods.
Pooling Layer Information struct.
static NodeID add_roi_align_node(Graph &g, NodeParams params, NodeIdxPair input, NodeIdxPair rois, ROIPoolingLayerInfo pool_info)
Adds a ROI align layer node to the graph.
Elementwise layer descriptor.
static NodeID add_l2_normalize_node(Graph &g, NodeParams params, NodeIdxPair input, int axis, float epsilon)
Adds a L2 Normalize layer node to the graph.
Padding and stride information class.
Concatenation Layer node.
const std::vector< TensorID > & outputs() const
Returns outputs of the node.
EdgeID add_connection(NodeID source, size_t source_idx, NodeID sink, size_t sink_idx)
Adds a connection between two nodes.
static NodeID add_dummy_node(Graph &g, NodeParams params, NodeIdxPair input, TensorShape shape)
Adds a Dummy node to the graph.
static NodeID add_dequantization_node(Graph &g, NodeParams params, NodeIdxPair input)
Adds a dequantization node to the graph.
static NodeID add_normalize_planar_yuv_node(Graph &g, NodeParams params, NodeIdxPair input, ITensorAccessorUPtr mean_accessor=nullptr, ITensorAccessorUPtr std_accessor=nullptr)
Adds a normalize planar YUV layer node to the graph.
FastMathHint
Enable or disable fast math for Convolution layer.
bool is_data_type_quantized_asymmetric(DataType dt)
Check if a given data type is of asymmetric quantized type.
static NodeID add_channel_shuffle_node(Graph &g, NodeParams params, NodeIdxPair input, unsigned int num_groups)
Adds an channel shuffle layer node to the graph.
Strides of an item in bytes.
Detection Output layer info.
DetectionPostProcess Layer node.
static NodeID add_detection_post_process_node(Graph &g, NodeParams params, NodeIdxPair input_box_encoding, NodeIdxPair input_class_prediction, const DetectionPostProcessLayerInfo &detect_info, ITensorAccessorUPtr anchors_accessor=nullptr, const QuantizationInfo &anchor_quant_info=QuantizationInfo())
Adds a detection post process layer node to the graph.
ScaleKernelInfo info(interpolation_policy, default_border_mode, PixelValue(), sampling_policy, false)
static NodeID add_softmax_node(Graph &g, NodeParams params, NodeIdxPair input, float beta=1.f)
Adds a softmax node to the graph.
DetectionOutput Layer node.
bool empty() const
Indicates whether this QuantizationInfo has valid settings or not.
size_t width
Width of the image region or rectangle.
static NodeID add_fully_connected_layer(Graph &g, NodeParams params, NodeIdxPair input, unsigned int num_outputs, NodeID weights_nid, NodeID bias_nid=EmptyNodeID, const FullyConnectedLayerInfo fc_info=FullyConnectedLayerInfo(), const QuantizationInfo &out_quant_info=QuantizationInfo())
Adds a fully connected layer node to the graph.
ROI Pooling Layer Information class.
constexpr NodeID EmptyNodeID
Constant EdgeID specifying an equivalent of null edge.
const INode * node(NodeID id) const
Get node object given its id.
Class for specifying the size of an image or rectangle.
static NodeID add_scale_layer(Graph &g, const NodeParams ¶ms, NodeIdxPair input, ITensorAccessorUPtr mul_accessor=nullptr, ITensorAccessorUPtr add_accessor=nullptr)
Adds a scale layer node to the graph This layer computes a product of the input with a scale (read fr...
Num samples, height, width, channels.
ConvolutionMethod
Supported Convolution layer methods.
Detection Output layer info.
Concatenate layer descriptor.
Generate Proposals Layer node.
Deconvolution Layer node.
Fully Connected Layer node.
Depthwise Convolution Layer node.
JoinDataset< T, U > concat(T &&dataset1, U &&dataset2)
Helper function to create a JoinDataset.
static TensorDescriptor compute_weights_descriptor(const TensorDescriptor &input_descriptor, unsigned int num_outputs, FullyConnectedLayerInfo fc_info=FullyConnectedLayerInfo(), const QuantizationInfo &weights_quant_info=QuantizationInfo())
Computes weights descriptor.
static NodeID add_const_node(Graph &g, NodeParams params, const TensorDescriptor &desc, ITensorAccessorUPtr accessor=nullptr)
Adds a Const node to the graph.
Arithmetic multiplication.
static NodeID add_flatten_node(Graph &g, NodeParams params, NodeIdxPair input)
Adds a flatten layer node to the graph.
static NodeID add_pooling_node(Graph &g, NodeParams params, NodeIdxPair input, PoolingLayerInfo pool_info)
Adds a pooling layer node to the graph.
DataLayout layout
Data layout.
DataType
Available data types.
static NodeID add_strided_slice_node(Graph &g, NodeParams params, NodeIdxPair input, Coordinates &starts, Coordinates &ends, BiStrides &strides, StridedSliceLayerInfo info)
Adds a strided slice node to the graph.
DataLayout
[DataLayout enum definition]
TensorShape & set(size_t dimension, size_t value, bool apply_dim_correction=true, bool increase_dim_unit=true)
Accessor to set the value of one of the dimensions.
size_t get_dimension_idx(DataLayout data_layout, const DataLayoutDimension data_layout_dimension)
Get index of a tensor's given dimension depending on its layout.
static NodeID add_arg_min_max_node(Graph &g, NodeParams params, NodeIdxPair input, ReductionOperation op, unsigned int axis, DataType out_data_type=DataType::UNKNOWN, const QuantizationInfo &out_quant_info=QuantizationInfo())
Adds an activation layer node to the graph.
static NodeID add_output_node(Graph &g, NodeParams params, NodeIdxPair input, ITensorAccessorUPtr accessor=nullptr)
Adds an output layer node to the graph.
static NodeID add_depthwise_convolution_node(Graph &g, NodeParams params, NodeIdxPair input, Size2D kernel_spatial_extend, PadStrideInfo conv_info, int depth_multiplier=1, DepthwiseConvolutionMethod method=DepthwiseConvolutionMethod::Default, ITensorAccessorUPtr weights_accessor=nullptr, ITensorAccessorUPtr bias_accessor=nullptr, const QuantizationInfo &quant_info=QuantizationInfo(), const QuantizationInfo &out_quant_info=QuantizationInfo())
Adds a depth-wise convolution layer node to the graph.