24.02.1
|
Go to the documentation of this file.
35 void dequantize_tensor(
const ITensor *
input, ITensor *output)
37 const UniformQuantizationInfo
qinfo =
input->info()->quantization_info().uniform();
41 window.use_tensor_dimensions(
input->info()->tensor_shape());
42 Iterator input_it(
input, window);
43 Iterator output_it(output, window);
50 [&](
const Coordinates &)
52 *
reinterpret_cast<float *
>(output_it.ptr()) =
60 [&](
const Coordinates &)
62 *
reinterpret_cast<float *
>(output_it.ptr()) =
70 [&](
const Coordinates &)
72 *
reinterpret_cast<float *
>(output_it.ptr()) =
82 void quantize_tensor(
const ITensor *
input, ITensor *output)
84 const UniformQuantizationInfo
qinfo = output->info()->quantization_info().
uniform();
88 window.use_tensor_dimensions(
input->info()->tensor_shape());
89 Iterator input_it(
input, window);
90 Iterator output_it(output, window);
97 [&](
const Coordinates &)
99 *
reinterpret_cast<uint8_t *
>(output_it.ptr()) =
102 input_it, output_it);
107 [&](
const Coordinates &)
109 *
reinterpret_cast<int8_t *
>(output_it.ptr()) =
112 input_it, output_it);
117 [&](
const Coordinates &)
119 *
reinterpret_cast<uint16_t *
>(output_it.ptr()) =
122 input_it, output_it);
131 : _memory_group(std::move(memory_manager)),
132 _box_with_nms_limit_kernel(),
143 _batch_splits_in_f32(),
147 _batch_splits_out_f32(),
155 const ITensor *batch_splits_in,
165 ARM_COMPUTE_LOG_PARAMS(scores_in, boxes_in, batch_splits_in, scores_out, boxes_out, classes, batch_splits_out,
166 keeps, keeps_size,
info);
171 _scores_in = scores_in;
172 _boxes_in = boxes_in;
173 _batch_splits_in = batch_splits_in;
174 _scores_out = scores_out;
175 _boxes_out = boxes_out;
177 _batch_splits_out = batch_splits_out;
183 _memory_group.
manage(&_scores_in_f32);
184 _memory_group.
manage(&_boxes_in_f32);
185 _memory_group.
manage(&_scores_out_f32);
186 _memory_group.
manage(&_boxes_out_f32);
187 _memory_group.
manage(&_classes_f32);
190 if (batch_splits_in !=
nullptr)
192 _memory_group.
manage(&_batch_splits_in_f32);
198 if (batch_splits_out !=
nullptr)
200 _memory_group.
manage(&_batch_splits_out_f32);
203 if (keeps !=
nullptr)
205 _memory_group.
manage(&_keeps_f32);
209 _box_with_nms_limit_kernel.
configure(&_scores_in_f32, &_boxes_in_f32,
210 (batch_splits_in !=
nullptr) ? &_batch_splits_in_f32 :
nullptr,
211 &_scores_out_f32, &_boxes_out_f32, &_classes_f32,
212 (batch_splits_out !=
nullptr) ? &_batch_splits_out_f32 :
nullptr,
213 (keeps !=
nullptr) ? &_keeps_f32 :
nullptr, keeps_size,
info);
217 _box_with_nms_limit_kernel.
configure(scores_in, boxes_in, batch_splits_in, scores_out, boxes_out, classes,
218 batch_splits_out, keeps, keeps_size,
info);
225 if (_batch_splits_in !=
nullptr)
232 if (batch_splits_out !=
nullptr)
236 if (keeps !=
nullptr)
259 const bool is_qasymm8 =
281 dequantize_tensor(_scores_in, &_scores_in_f32);
282 dequantize_tensor(_boxes_in, &_boxes_in_f32);
283 if (_batch_splits_in !=
nullptr)
285 dequantize_tensor(_batch_splits_in, &_batch_splits_in_f32);
293 quantize_tensor(&_scores_out_f32, _scores_out);
294 quantize_tensor(&_boxes_out_f32, _boxes_out);
295 quantize_tensor(&_classes_f32, _classes);
296 if (_batch_splits_out !=
nullptr)
298 quantize_tensor(&_batch_splits_out_f32, _batch_splits_out);
300 if (_keeps !=
nullptr)
302 quantize_tensor(&_keeps_f32, _keeps);
@ QASYMM16
quantized, asymmetric fixed-point 16-bit number
void manage(IMemoryManageable *obj) override
Sets a object to be managed by the given memory group.
void init(const TensorAllocator &allocator, const Coordinates &coords, TensorInfo &sub_info)
Shares the same backing memory with another tensor allocator, while the tensor info might be differen...
@ QASYMM8
quantized, asymmetric fixed-point 8-bit number unsigned
uint8_t quantize_qasymm8(float value, const INFO_TYPE &qinfo, RoundingPolicy rounding_policy=RoundingPolicy::TO_NEAREST_UP)
Quantize a value given an unsigned 8-bit asymmetric quantization scheme.
#define ARM_COMPUTE_ERROR(msg)
Print the given message then throw an std::runtime_error.
Interface for CPU tensor.
BoxWithNonMaximaSuppressionLimit Information class.
CPPBoxWithNonMaximaSuppressionLimit(std::shared_ptr< IMemoryManager > memory_manager=nullptr)
Constructor.
#define ARM_COMPUTE_RETURN_ERROR_ON_MISMATCHING_DATA_TYPES(...)
void configure(const ITensor *scores_in, const ITensor *boxes_in, const ITensor *batch_splits_in, ITensor *scores_out, ITensor *boxes_out, ITensor *classes, ITensor *batch_splits_out=nullptr, ITensor *keeps=nullptr, ITensor *keeps_size=nullptr, const BoxNMSLimitInfo info=BoxNMSLimitInfo())
Configure the BoxWithNonMaximaSuppressionLimit CPP kernel.
#define ARM_COMPUTE_RETURN_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN(t, c,...)
void run() override
Run the kernels contained in the function.
#define ARM_COMPUTE_ERROR_ON_NULLPTR(...)
virtual ITensorInfo * info() const =0
Interface to be implemented by the child class to return the tensor's metadata.
TensorAllocator * allocator()
Return a pointer to the tensor's allocator.
void configure(const ITensor *scores_in, const ITensor *boxes_in, const ITensor *batch_splits_in, ITensor *scores_out, ITensor *boxes_out, ITensor *classes, ITensor *batch_splits_out=nullptr, ITensor *keeps=nullptr, ITensor *keeps_size=nullptr, const BoxNMSLimitInfo info=BoxNMSLimitInfo())
Initialise the kernel's input and output tensors.
void execute_window_loop(const Window &w, L &&lambda_function, Ts &&...iterators)
Iterate through the passed window, automatically adjusting the iterators and calling the lambda_funct...
int8_t quantize_qasymm8_signed(float value, const INFO_TYPE &qinfo, RoundingPolicy rounding_policy=RoundingPolicy::TO_NEAREST_UP)
Quantize a value given a signed 8-bit asymmetric quantization scheme.
#define ARM_COMPUTE_RETURN_ERROR_ON(cond)
If the condition is true, an error is returned.
static IScheduler & get()
Access the scheduler singleton.
const std::vector< float > & scale() const
Scale vector accessor.
@ QASYMM8_SIGNED
quantized, asymmetric fixed-point 8-bit number signed
virtual DataType data_type() const =0
Data type used for each element of the tensor.
UniformQuantizationInfo uniform() const
Return per layer quantization info.
#define ARM_COMPUTE_UNUSED(...)
To avoid unused variables warnings.
static constexpr size_t DimY
Alias for dimension 1 also known as Y dimension.
virtual QuantizationInfo quantization_info() const =0
Get the quantization settings (scale and offset) of the tensor.
#define ARM_COMPUTE_RETURN_ERROR_ON_MISMATCHING_QUANTIZATION_INFO(...)
virtual void schedule(ICPPKernel *kernel, const Hints &hints)=0
Runs the kernel in the same thread as the caller synchronously.
virtual std::unique_ptr< T > clone() const =0
Provide a clone of the current object of class T.
void allocate() override
Allocate size specified by TensorInfo of CPU memory.
float dequantize_qasymm8_signed(int8_t value, const INFO_TYPE &qinfo)
Dequantize a value given a signed 8-bit asymmetric quantization scheme.
Memory group resources scope handling class.
Copyright (c) 2017-2024 Arm Limited.
@ F16
16-bit floating-point number
float dequantize(uint8_t value, float scale, int32_t offset)
Dequantize a value given an 8-bit asymmetric quantization scheme.
uint16_t quantize_qasymm16(float value, const UniformQuantizationInfo &qinfo, RoundingPolicy rounding_policy=RoundingPolicy::TO_NEAREST_UP)
Quantize a value given a 16-bit asymmetric quantization scheme.
#define ARM_COMPUTE_RETURN_ERROR_ON_NULLPTR(...)
Status validate(const ITensorInfo *scores_in, const ITensorInfo *boxes_in, const ITensorInfo *batch_splits_in, const ITensorInfo *scores_out, const ITensorInfo *boxes_out, const ITensorInfo *classes, const ITensorInfo *batch_splits_out, const ITensorInfo *keeps, const ITensorInfo *keeps_size, const BoxNMSLimitInfo info)
Store the tensor's metadata.
@ F32
32-bit floating-point number
ScaleKernelInfo info(interpolation_policy, default_border_mode, PixelValue(), sampling_policy, false)
#define ARM_COMPUTE_LOG_PARAMS(...)
DataType
Available data types.
const QuantizationInfo qinfo
const std::vector< int32_t > & offset() const
Offset vector accessor.