aboutsummaryrefslogtreecommitdiff
path: root/arm_compute
diff options
context:
space:
mode:
authorMichalis Spyrou <michalis.spyrou@arm.com>2018-08-29 16:28:11 +0100
committerMichalis Spyrou <michalis.spyrou@arm.com>2018-11-14 15:42:37 +0000
commit6c7c38e70c795077ba727aadeefc670888bec089 (patch)
tree7969d7976b22b881f2c08e97a772a4537e203629 /arm_compute
parentd8e340d2fef39c78a9afda93b210a8640145df87 (diff)
downloadComputeLibrary-6c7c38e70c795077ba727aadeefc670888bec089.tar.gz
COMPMID-1462 SSD support: Create CL PriorBox
Change-Id: I5bf5d751ec7c02d96c26a769f49d03ea23a248b7
Diffstat (limited to 'arm_compute')
-rw-r--r--arm_compute/core/CL/CLKernels.h1
-rw-r--r--arm_compute/core/CL/kernels/CLPriorBoxLayerKernel.h86
-rw-r--r--arm_compute/core/Types.h122
-rw-r--r--arm_compute/core/utils/misc/ShapeCalculator.h14
-rw-r--r--arm_compute/runtime/CL/CLFunctions.h1
-rw-r--r--arm_compute/runtime/CL/functions/CLPriorBoxLayer.h68
6 files changed, 292 insertions, 0 deletions
diff --git a/arm_compute/core/CL/CLKernels.h b/arm_compute/core/CL/CLKernels.h
index df76366a4b..12700192e6 100644
--- a/arm_compute/core/CL/CLKernels.h
+++ b/arm_compute/core/CL/CLKernels.h
@@ -105,6 +105,7 @@
#include "arm_compute/core/CL/kernels/CLPermuteKernel.h"
#include "arm_compute/core/CL/kernels/CLPixelWiseMultiplicationKernel.h"
#include "arm_compute/core/CL/kernels/CLPoolingLayerKernel.h"
+#include "arm_compute/core/CL/kernels/CLPriorBoxLayerKernel.h"
#include "arm_compute/core/CL/kernels/CLQuantizationLayerKernel.h"
#include "arm_compute/core/CL/kernels/CLROIAlignLayerKernel.h"
#include "arm_compute/core/CL/kernels/CLROIPoolingLayerKernel.h"
diff --git a/arm_compute/core/CL/kernels/CLPriorBoxLayerKernel.h b/arm_compute/core/CL/kernels/CLPriorBoxLayerKernel.h
new file mode 100644
index 0000000000..a5423e4af0
--- /dev/null
+++ b/arm_compute/core/CL/kernels/CLPriorBoxLayerKernel.h
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2018 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef __ARM_COMPUTE_CLPRIORBOXLAYERKERNEL_H__
+#define __ARM_COMPUTE_CLPRIORBOXLAYERKERNEL_H__
+
+#include "arm_compute/core/CL/ICLKernel.h"
+
+namespace arm_compute
+{
+class ICLTensor;
+
+/** Interface for the PriorBox layer kernel. */
+class CLPriorBoxLayerKernel : public ICLKernel
+{
+public:
+ /** Constructor */
+ CLPriorBoxLayerKernel();
+ /** Prevent instances of this class from being copied (As this class contains pointers) */
+ CLPriorBoxLayerKernel(const CLPriorBoxLayerKernel &) = delete;
+ /** Prevent instances of this class from being copied (As this class contains pointers) */
+ CLPriorBoxLayerKernel &operator=(const CLPriorBoxLayerKernel &) = delete;
+ /** Default Move Constructor. */
+ CLPriorBoxLayerKernel(CLPriorBoxLayerKernel &&) = default;
+ /** Default move assignment operator */
+ CLPriorBoxLayerKernel &operator=(CLPriorBoxLayerKernel &&) = default;
+ /** Default destructor */
+ ~CLPriorBoxLayerKernel() = default;
+
+ /** Set the input and output tensors.
+ *
+ * @param[in] input1 First source tensor. Data types supported: F32. Data layouts supported: NCHW/NHWC.
+ * @param[in] input2 Second source tensor. Data types and layouts supported: same as @p input1
+ * @param[out] output Destination tensor. Output dimensions are [W * H * num_priors * 4, 2]. Data types and layouts supported: same as @p input1
+ * @param[in] info Prior box layer info.
+ * @param[in] min Minimum prior box values
+ * @param[in] max Maximum prior box values
+ * @param[in] aspect_ratios Aspect ratio values
+ */
+ void configure(const ICLTensor *input1, const ICLTensor *input2, ICLTensor *output, const PriorBoxLayerInfo &info, cl::Buffer *min, cl::Buffer *max, cl::Buffer *aspect_ratios);
+ /** Static function to check if given info will lead to a valid configuration of @ref CLPriorBoxLayerKernel
+ *
+ * @param[in] input1 First source tensor info. Data types supported: F32. Data layouts supported: NCHW/NHWC.
+ * @param[in] input2 Second source tensor info. Data types and layouts supported: same as @p input1
+ * @param[in] output Destination tensor info. Output dimensions are [W * H * num_priors * 4, 2]. Data type supported: same as @p input1
+ * @param[in] info Prior box layer info.
+ *
+ * @return a status
+ */
+ static Status validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const PriorBoxLayerInfo &info);
+
+ // Inherited methods overridden:
+ void run(const Window &window, cl::CommandQueue &queue) override;
+
+private:
+ const ICLTensor *_input1;
+ const ICLTensor *_input2;
+ ICLTensor *_output;
+ PriorBoxLayerInfo _info;
+ int _num_priors;
+ cl::Buffer *_min;
+ cl::Buffer *_max;
+ cl::Buffer *_aspect_ratios;
+};
+} // namespace arm_compute
+#endif /*__ARM_COMPUTE_CLPRIORBOXLAYERKERNEL_H__ */
diff --git a/arm_compute/core/Types.h b/arm_compute/core/Types.h
index 8df5c65e1e..03f195f7da 100644
--- a/arm_compute/core/Types.h
+++ b/arm_compute/core/Types.h
@@ -799,6 +799,128 @@ struct FullyConnectedLayerInfo
}
};
+/** PriorBox layer info */
+class PriorBoxLayerInfo final
+{
+public:
+ /** Default Constructor */
+ PriorBoxLayerInfo()
+ : _min_sizes(),
+ _variances(),
+ _offset(),
+ _flip(true),
+ _clip(false),
+ _max_sizes(),
+ _aspect_ratios(),
+ _img_size(),
+ _steps()
+ {
+ }
+ /** Constructor
+ *
+ * @param[in] min_sizes Min sizes vector.
+ * @param[in] variances Variances vector. Size must be equal to 4.
+ * @param[in] offset Offset value.
+ * @param[in] flip (Optional) Flip the aspect ratios.
+ * @param[in] clip (Optional) Clip coordinates so that they're within [0,1].
+ * @param[in] max_sizes (Optional) Max sizes vector.
+ * @param[in] aspect_ratios (Optional) Aspect ratios of the boxes.
+ * @param[in] img_size (Optional) Image size.
+ * @param[in] steps (Optional) Step values.
+ */
+ PriorBoxLayerInfo(const std::vector<float> &min_sizes, const std::vector<float> &variances, float offset, bool flip = true, bool clip = false,
+ const std::vector<float> &max_sizes = {}, const std::vector<float> &aspect_ratios = {}, const Coordinates2D &img_size = Coordinates2D{ 0, 0 }, const std::array<float, 2> &steps = { { 0.f, 0.f } })
+ : _min_sizes(min_sizes),
+ _variances(variances),
+ _offset(offset),
+ _flip(flip),
+ _clip(clip),
+ _max_sizes(max_sizes),
+ _aspect_ratios(aspect_ratios),
+ _img_size(img_size),
+ _steps(steps)
+ {
+ _aspect_ratios.push_back(1.);
+ for(unsigned int i = 0; i < aspect_ratios.size(); ++i)
+ {
+ float ar = aspect_ratios[i];
+ bool already_exist = false;
+ for(auto ar_new : _aspect_ratios)
+ {
+ if(fabs(ar - ar_new) < 1e-6)
+ {
+ already_exist = true;
+ break;
+ }
+ }
+ if(!already_exist)
+ {
+ _aspect_ratios.push_back(ar);
+ if(flip)
+ {
+ _aspect_ratios.push_back(1.f / ar);
+ }
+ }
+ }
+ }
+ /** Get min sizes. */
+ std::vector<float> min_sizes() const
+ {
+ return _min_sizes;
+ }
+ /** Get min variances. */
+ std::vector<float> variances() const
+ {
+ return _variances;
+ }
+ /** Get the step coordinates */
+ std::array<float, 2> steps() const
+ {
+ return _steps;
+ }
+ /** Get the image size coordinates */
+ Coordinates2D img_size() const
+ {
+ return _img_size;
+ }
+ /** Get the offset */
+ float offset() const
+ {
+ return _offset;
+ }
+ /** Get the flip value */
+ bool flip() const
+ {
+ return _flip;
+ }
+ /** Get the clip value */
+ bool clip() const
+ {
+ return _clip;
+ }
+ /** Get max sizes. */
+ std::vector<float> max_sizes() const
+ {
+ return _max_sizes;
+ }
+ /** Get aspect ratios. */
+ std::vector<float> aspect_ratios() const
+ {
+ return _aspect_ratios;
+ }
+
+private:
+ std::vector<float> _min_sizes;
+ std::vector<float> _variances;
+ float _offset;
+ bool _flip;
+ bool _clip;
+ std::vector<float> _max_sizes;
+ std::vector<float> _aspect_ratios;
+ Coordinates2D _img_size;
+ std::array<float, 2> _steps;
+};
+
/** Pooling Layer Information class */
class PoolingLayerInfo
{
diff --git a/arm_compute/core/utils/misc/ShapeCalculator.h b/arm_compute/core/utils/misc/ShapeCalculator.h
index 1f532ca31e..5c9457ed6b 100644
--- a/arm_compute/core/utils/misc/ShapeCalculator.h
+++ b/arm_compute/core/utils/misc/ShapeCalculator.h
@@ -646,6 +646,20 @@ inline TensorShape compute_space_to_batch_shape(const ITensorInfo *input, const
return output_shape;
}
+inline TensorShape compute_prior_box_shape(const ITensorInfo &input, const PriorBoxLayerInfo &info)
+{
+ DataLayout data_layout = input.data_layout();
+ const size_t idx_w = get_data_layout_dimension_index(data_layout, DataLayoutDimension::WIDTH);
+ const size_t idx_h = get_data_layout_dimension_index(data_layout, DataLayoutDimension::HEIGHT);
+
+ const int num_priors = info.aspect_ratios().size() * info.min_sizes().size() + info.max_sizes().size();
+
+ TensorShape output_shape{};
+ output_shape.set(0, input.dimension(idx_w) * input.dimension(idx_h) * num_priors * 4);
+ output_shape.set(1, 2);
+
+ return output_shape;
+}
inline TensorShape compute_padded_shape(const TensorShape &input_shape, const PaddingList &padding)
{
diff --git a/arm_compute/runtime/CL/CLFunctions.h b/arm_compute/runtime/CL/CLFunctions.h
index 7e36afd6f1..694e818788 100644
--- a/arm_compute/runtime/CL/CLFunctions.h
+++ b/arm_compute/runtime/CL/CLFunctions.h
@@ -102,6 +102,7 @@
#include "arm_compute/runtime/CL/functions/CLPhase.h"
#include "arm_compute/runtime/CL/functions/CLPixelWiseMultiplication.h"
#include "arm_compute/runtime/CL/functions/CLPoolingLayer.h"
+#include "arm_compute/runtime/CL/functions/CLPriorBoxLayer.h"
#include "arm_compute/runtime/CL/functions/CLQuantizationLayer.h"
#include "arm_compute/runtime/CL/functions/CLRNNLayer.h"
#include "arm_compute/runtime/CL/functions/CLROIAlignLayer.h"
diff --git a/arm_compute/runtime/CL/functions/CLPriorBoxLayer.h b/arm_compute/runtime/CL/functions/CLPriorBoxLayer.h
new file mode 100644
index 0000000000..2376cd3fc6
--- /dev/null
+++ b/arm_compute/runtime/CL/functions/CLPriorBoxLayer.h
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2018 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef __ARM_COMPUTE_CLPRIORBOXLAYER_H__
+#define __ARM_COMPUTE_CLPRIORBOXLAYER_H__
+
+#include "arm_compute/runtime/IFunction.h"
+
+#include "arm_compute/core/CL/kernels/CLPriorBoxLayerKernel.h"
+#include "arm_compute/core/Types.h"
+#include "arm_compute/runtime/CL/ICLSimpleFunction.h"
+
+namespace arm_compute
+{
+class ICLTensor;
+
+/** Basic function to run @ref CLPriorBoxLayerKernel. */
+class CLPriorBoxLayer : public ICLSimpleFunction
+{
+public:
+ /** Constructor */
+ CLPriorBoxLayer();
+ /** Set the input and output tensors.
+ *
+ * @param[in] input1 First source tensor. Data types supported: F32. Data layouts supported: NCHW/NHWC.
+ * @param[in] input2 Second source tensor. Data types and layouts supported: same as @p input1
+ * @param[out] output Destination tensor. Output dimensions are [W * H * num_priors * 4, 2]. Data types and layouts supported: same as @p input1
+ * @param[in] info Prior box layer info.
+ */
+ void configure(const ICLTensor *input1, const ICLTensor *input2, ICLTensor *output, const PriorBoxLayerInfo &info);
+ /** Static function to check if given info will lead to a valid configuration of @ref CLPriorBoxLayer
+ *
+ * @param[in] input1 First source tensor info. Data types supported: F32. Data layouts supported: NCHW/NHWC.
+ * @param[in] input2 Second source tensor info. Data types and layouts supported: same as @p input1
+ * @param[in] output Destination tensor info. Output dimensions are [W * H * num_priors * 4, 2]. Data types and layouts supported: same as @p input1
+ * @param[in] info Prior box layer info.
+ *
+ * @return a status
+ */
+ static Status validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const PriorBoxLayerInfo &info);
+
+private:
+ cl::Buffer _min;
+ cl::Buffer _max;
+ cl::Buffer _aspect_ratios;
+};
+} // arm_compute
+#endif /* __ARM_COMPUTE_CLPRIORBOXLAYER_H__ */