47 using TensorConcreteType = CLTensor;
54 struct CLConvolutionLayerFunctions
56 using GenericConvolutionLayer = CLConvolutionLayer;
57 using GEMMConvolutionLayer = CLGEMMConvolutionLayer;
58 using DirectConvolutionLayer = CLDirectConvolutionLayer;
59 using WinogradConvolutionLayer = CLWinogradConvolutionLayer;
63 struct CLEltwiseFunctions
65 using Addition = CLArithmeticAddition;
66 using Subtraction = CLArithmeticSubtraction;
67 using Multiplication = CLPixelWiseMultiplication;
68 using Maximum = CLElementwiseMax;
69 using Division = CLArithmeticDivision;
73 struct CLUnaryEltwiseFunctions
75 using Exp = CLExpLayer;
79 struct CLFusedLayerTypes
83 using FuseBatchNormalization = CLFuseBatchNormalization;
84 using GEMMConvolutionLayer = CLGEMMConvolutionLayer;
88 class CPPWrapperFunction :
public IFunction
93 : _tensors(), _func(nullptr)
99 for(
auto &
tensor : _tensors)
105 for(
auto &
tensor : _tensors)
111 void register_tensor(ICLTensor *
tensor)
113 _tensors.push_back(tensor);
116 void register_function(std::unique_ptr<IFunction>
function)
118 _func = std::move(
function);
122 std::vector<arm_compute::ICLTensor *> _tensors;
123 std::unique_ptr<IFunction> _func;
132 validate_node<CLTargetInfo>(node, 3 , 1 );
147 auto func = std::make_unique<CPPDetectionOutputLayer>();
148 func->configure(input0, input1, input2, output, detect_info);
153 <<
" Type: " << node.type()
154 <<
" Target: " << CLTargetInfo::TargetType
155 <<
" Data Type: " << input0->info()->data_type()
156 <<
" Input0 shape: " << input0->info()->tensor_shape()
157 <<
" Input1 shape: " << input1->info()->tensor_shape()
158 <<
" Input2 shape: " << input2->info()->tensor_shape()
159 <<
" Output shape: " << output->info()->tensor_shape()
160 <<
" DetectionOutputLayer info: " << detect_info
163 auto wrap_function = std::make_unique<CPPWrapperFunction>();
165 wrap_function->register_function(std::move(func));
166 wrap_function->register_tensor(input0);
167 wrap_function->register_tensor(input1);
168 wrap_function->register_tensor(input2);
169 wrap_function->register_tensor(output);
171 return std::move(wrap_function);
176 validate_node<CLTargetInfo>(node, 3 , 4 );
197 auto func = std::make_unique<CPPDetectionPostProcessLayer>();
198 func->configure(input0, input1, input2, output0, output1, output2, output3, detect_info);
203 <<
" Type: " << node.type()
204 <<
" Target: " << CLTargetInfo::TargetType
205 <<
" Data Type: " << input0->info()->data_type()
206 <<
" Input0 shape: " << input0->info()->tensor_shape()
207 <<
" Input1 shape: " << input1->info()->tensor_shape()
208 <<
" Input2 shape: " << input2->info()->tensor_shape()
209 <<
" Output0 shape: " << output0->info()->tensor_shape()
210 <<
" Output1 shape: " << output1->info()->tensor_shape()
211 <<
" Output2 shape: " << output2->info()->tensor_shape()
212 <<
" Output3 shape: " << output3->info()->tensor_shape()
213 <<
" DetectionPostProcessLayer info: " << detect_info
216 auto wrap_function = std::make_unique<CPPWrapperFunction>();
218 wrap_function->register_function(std::move(func));
219 wrap_function->register_tensor(input0);
220 wrap_function->register_tensor(input1);
221 wrap_function->register_tensor(input2);
222 wrap_function->register_tensor(output0);
223 wrap_function->register_tensor(output1);
224 wrap_function->register_tensor(output2);
225 wrap_function->register_tensor(output3);
227 return std::move(wrap_function);
241 case NodeType::ActivationLayer:
242 return detail::create_activation_layer<CLActivationLayer, CLTargetInfo>(*polymorphic_downcast<ActivationLayerNode *>(node));
243 case NodeType::ArgMinMaxLayer:
244 return detail::create_arg_min_max_layer<CLArgMinMaxLayer, CLTargetInfo>(*polymorphic_downcast<ArgMinMaxLayerNode *>(node));
245 case NodeType::BatchNormalizationLayer:
246 return detail::create_batch_normalization_layer<CLBatchNormalizationLayer, CLTargetInfo>(*polymorphic_downcast<BatchNormalizationLayerNode *>(node));
247 case NodeType::BoundingBoxTransformLayer:
248 return detail::create_bounding_box_transform_layer<CLBoundingBoxTransform, CLTargetInfo>(*polymorphic_downcast<BoundingBoxTransformLayerNode *>(node));
249 case NodeType::ChannelShuffleLayer:
250 return detail::create_channel_shuffle_layer<CLChannelShuffleLayer, CLTargetInfo>(*polymorphic_downcast<ChannelShuffleLayerNode *>(node));
251 case NodeType::ConvolutionLayer:
252 return detail::create_convolution_layer<CLConvolutionLayerFunctions, CLTargetInfo>(*polymorphic_downcast<ConvolutionLayerNode *>(node), ctx);
253 case NodeType::DeconvolutionLayer:
254 return detail::create_deconvolution_layer<CLDeconvolutionLayer, CLTargetInfo>(*polymorphic_downcast<DeconvolutionLayerNode *>(node), ctx);
255 case NodeType::ConcatenateLayer:
256 return detail::create_concatenate_layer<CLConcatenateLayer, CLTargetInfo>(*polymorphic_downcast<ConcatenateLayerNode *>(node));
257 case NodeType::DepthToSpaceLayer:
258 return detail::create_depth_to_space_layer<CLDepthToSpaceLayer, CLTargetInfo>(*polymorphic_downcast<DepthToSpaceLayerNode *>(node));
259 case NodeType::DepthwiseConvolutionLayer:
260 return detail::create_depthwise_convolution_layer<CLDepthwiseConvolutionLayer, CLTargetInfo>(*polymorphic_downcast<DepthwiseConvolutionLayerNode *>(node));
261 case NodeType::DequantizationLayer:
262 return detail::create_dequantization_layer<CLDequantizationLayer, CLTargetInfo>(*polymorphic_downcast<DequantizationLayerNode *>(node));
263 case NodeType::DetectionOutputLayer:
265 case NodeType::DetectionPostProcessLayer:
267 case NodeType::EltwiseLayer:
268 return detail::create_eltwise_layer<CLEltwiseFunctions, CLTargetInfo>(*polymorphic_downcast<EltwiseLayerNode *>(node));
269 case NodeType::UnaryEltwiseLayer:
270 return detail::create_unary_eltwise_layer<CLUnaryEltwiseFunctions, CLTargetInfo>(*polymorphic_downcast<UnaryEltwiseLayerNode *>(node));
271 case NodeType::FlattenLayer:
272 return detail::create_flatten_layer<CLFlattenLayer, CLTargetInfo>(*polymorphic_downcast<FlattenLayerNode *>(node));
273 case NodeType::FullyConnectedLayer:
274 return detail::create_fully_connected_layer<CLFullyConnectedLayer, CLTargetInfo>(*polymorphic_downcast<FullyConnectedLayerNode *>(node), ctx);
275 case NodeType::FusedConvolutionBatchNormalizationLayer:
276 return detail::create_fused_convolution_batch_normalization_layer<CLFusedLayerTypes, CLTargetInfo>(*polymorphic_downcast<FusedConvolutionBatchNormalizationNode *>(node), ctx);
277 case NodeType::FusedConvolutionWithPostOp:
278 return detail::create_fused_convolution_with_post_op<CLFusedLayerTypes, CLTargetInfo>(*polymorphic_downcast<FusedConvolutionWithPostOpNode *>(node), ctx);
279 case NodeType::FusedDepthwiseConvolutionBatchNormalizationLayer:
280 return detail::create_fused_depthwise_convolution_batch_normalization_layer<CLFusedLayerTypes, CLTargetInfo>(*polymorphic_downcast<FusedDepthwiseConvolutionBatchNormalizationNode *>(node), ctx);
281 case NodeType::GenerateProposalsLayer:
282 return detail::create_generate_proposals_layer<CLGenerateProposalsLayer, CLTargetInfo>(*polymorphic_downcast<GenerateProposalsLayerNode *>(node), ctx);
283 case NodeType::L2NormalizeLayer:
284 return detail::create_l2_normalize_layer<CLL2NormalizeLayer, CLTargetInfo>(*polymorphic_downcast<L2NormalizeLayerNode *>(node), ctx);
285 case NodeType::NormalizationLayer:
286 return detail::create_normalization_layer<CLNormalizationLayer, CLTargetInfo>(*polymorphic_downcast<NormalizationLayerNode *>(node), ctx);
287 case NodeType::NormalizePlanarYUVLayer:
288 return detail::create_normalize_planar_yuv_layer<CLNormalizePlanarYUVLayer, CLTargetInfo>(*polymorphic_downcast<NormalizePlanarYUVLayerNode *>(node));
289 case NodeType::PadLayer:
290 return detail::create_pad_layer<CLPadLayer, CLTargetInfo>(*polymorphic_downcast<PadLayerNode *>(node));
291 case NodeType::PermuteLayer:
292 return detail::create_permute_layer<CLPermute, CLTargetInfo>(*polymorphic_downcast<PermuteLayerNode *>(node));
293 case NodeType::PoolingLayer:
294 return detail::create_pooling_layer<CLPoolingLayer, CLTargetInfo>(*polymorphic_downcast<PoolingLayerNode *>(node));
295 case NodeType::PReluLayer:
296 return detail::create_prelu_layer<CLPReluLayer, CLTargetInfo>(*polymorphic_downcast<PReluLayerNode *>(node));
297 case NodeType::PrintLayer:
298 return detail::create_print_layer<CLTargetInfo>(*polymorphic_downcast<PrintLayerNode *>(node));
299 case NodeType::PriorBoxLayer:
300 return detail::create_priorbox_layer<CLPriorBoxLayer, CLTargetInfo>(*polymorphic_downcast<PriorBoxLayerNode *>(node));
301 case NodeType::QuantizationLayer:
302 return detail::create_quantization_layer<CLQuantizationLayer, CLTargetInfo>(*polymorphic_downcast<QuantizationLayerNode *>(node));
303 case NodeType::ReductionOperationLayer:
304 return detail::create_reduction_operation_layer<CLReductionOperation, CLTargetInfo>(*polymorphic_downcast<ReductionLayerNode *>(node), ctx);
305 case NodeType::ReorgLayer:
306 return detail::create_reorg_layer<CLReorgLayer, CLTargetInfo>(*polymorphic_downcast<ReorgLayerNode *>(node));
307 case NodeType::ReshapeLayer:
308 return detail::create_reshape_layer<CLReshapeLayer, CLTargetInfo>(*polymorphic_downcast<ReshapeLayerNode *>(node));
309 case NodeType::ResizeLayer:
310 return detail::create_resize_layer<CLScale, CLTargetInfo>(*polymorphic_downcast<ResizeLayerNode *>(node));
311 case NodeType::ROIAlignLayer:
312 return detail::create_roi_align_layer<CLROIAlignLayer, CLTargetInfo>(*polymorphic_downcast<ROIAlignLayerNode *>(node));
313 case NodeType::SliceLayer:
314 return detail::create_slice_layer<CLSlice, CLTargetInfo>(*polymorphic_downcast<SliceLayerNode *>(node));
315 case NodeType::SoftmaxLayer:
316 return detail::create_softmax_layer<CLSoftmaxLayer, CLTargetInfo>(*polymorphic_downcast<SoftmaxLayerNode *>(node), ctx);
317 case NodeType::StackLayer:
318 return detail::create_stack_layer<CLStackLayer, CLTargetInfo>(*polymorphic_downcast<StackLayerNode *>(node));
319 case NodeType::StridedSliceLayer:
320 return detail::create_strided_slice_layer<CLStridedSlice, CLTargetInfo>(*polymorphic_downcast<StridedSliceLayerNode *>(node));
321 case NodeType::FusedConvolutionBatchNormalizationLayerWithPostOpsLayer:
322 return detail::create_fused_convolution_batch_normalization_with_post_op<CLFusedLayerTypes, CLTargetInfo>(*polymorphic_downcast<FusedConvolutionBatchNormalizationWithPostOpsNode *>(node), ctx);
std::unique_ptr< IFunction > create_detection_output_layer< CPPDetectionOutputLayer, CLTargetInfo >(DetectionOutputLayerNode &node)
static CLScheduler & get()
Access the scheduler singleton.
#define ARM_COMPUTE_ERROR_ON(cond)
If the condition is true then an error message is printed and an exception thrown.
decltype(strategy::transforms) typedef type
#define ARM_COMPUTE_LOG_GRAPH_INFO(x)
Copyright (c) 2017-2023 Arm Limited.
std::unique_ptr< IFunction > create_detection_post_process_layer< CPPDetectionPostProcessLayer, CLTargetInfo >(DetectionPostProcessLayerNode &node)
Detection Output layer info.
DetectionPostProcess Layer node.
DetectionOutput Layer node.
Interface for OpenCL tensor.
Detection Output layer info.
CLTensor * tensor
Pointer to the auxiliary tensor.
virtual NodeType type() const =0
Returns node's type.
Includes all the OpenCL functions at once.