MLECO-1252 ASR sample application using the public ArmNN C++ API.

Change-Id: I98cd505b8772a8c8fa88308121bc94135bb45068
Signed-off-by: Éanna Ó Catháin <eanna.ocathain@arm.com>
diff --git a/samples/ObjectDetection/include/ObjectDetectionPipeline.hpp b/samples/ObjectDetection/include/ObjectDetectionPipeline.hpp
new file mode 100644
index 0000000..38de65b
--- /dev/null
+++ b/samples/ObjectDetection/include/ObjectDetectionPipeline.hpp
@@ -0,0 +1,148 @@
+//
+// Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#pragma once
+
+#include "ArmnnNetworkExecutor.hpp"
+#include "YoloResultDecoder.hpp"
+#include "SSDResultDecoder.hpp"
+# include "ImageUtils.hpp"
+
+#include <opencv2/opencv.hpp>
+
+namespace od
+{
+/**
+ * Generic object detection pipeline with 3 steps: data pre-processing, inference execution and inference
+ * result post-processing.
+ *
+ */
+class ObjDetectionPipeline {
+public:
+
+    /**
+     * Creates object detection pipeline with given network executor and decoder.
+     * @param executor - unique pointer to inference runner
+     * @param decoder - unique pointer to inference results decoder
+     */
+    ObjDetectionPipeline(std::unique_ptr<common::ArmnnNetworkExecutor<float>> executor,
+                         std::unique_ptr<IDetectionResultDecoder> decoder);
+
+    /**
+     * @brief Standard image pre-processing implementation.
+     *
+     * Re-sizes an image keeping aspect ratio, pads if necessary to fit the network input layer dimensions.
+
+     * @param[in] frame - input image, expected data type is uint8.
+     * @param[out] processed - output image, data type is preserved.
+     */
+    virtual void PreProcessing(const cv::Mat& frame, cv::Mat& processed);
+
+    /**
+     * @brief Executes inference
+     *
+     * Calls inference runner provided during instance construction.
+     *
+     * @param[in] processed - input inference data. Data type should be aligned with input tensor.
+     * @param[out] result - raw floating point inference results.
+     */
+    virtual void Inference(const cv::Mat& processed, common::InferenceResults<float>& result);
+
+    /**
+     * @brief Standard inference results post-processing implementation.
+     *
+     * Decodes inference results using decoder provided during construction.
+     *
+     * @param[in] inferenceResult - inference results to be decoded.
+     * @param[in] callback - a function to be called after successful inference results decoding.
+     */
+    virtual void PostProcessing(common::InferenceResults<float>& inferenceResult,
+                                const std::function<void (DetectedObjects)>& callback);
+
+protected:
+    std::unique_ptr<common::ArmnnNetworkExecutor<float>> m_executor;
+    std::unique_ptr<IDetectionResultDecoder> m_decoder;
+    common::Size m_inputImageSize{};
+    cv::Mat m_processedFrame;
+};
+
+/**
+ * Specific to Yolo v3 tiny object detection pipeline implementation.
+ */
+class YoloV3Tiny: public ObjDetectionPipeline{
+public:
+
+    /**
+     * Constructs object detection pipeline for Yolo v3 tiny network.
+     *
+     * Network input is expected to be uint8 or fp32. Data range [0, 255].
+     * Network output is FP32.
+     *
+     * @param executor[in] - unique pointer to inference runner
+     * @param NMSThreshold[in] - non max suppression threshold for decoding step
+     * @param ClsThreshold[in] -  class probability threshold for decoding step
+     * @param ObjectThreshold[in] - detected object score threshold for decoding step
+     */
+    YoloV3Tiny(std::unique_ptr<common::ArmnnNetworkExecutor<float>> executor,
+               float NMSThreshold, float ClsThreshold, float ObjectThreshold);
+
+    /**
+     * @brief Yolo v3 tiny image pre-processing implementation.
+     *
+     * On top of the standard pre-processing, converts input data type according to the network input tensor data type.
+     * Supported data types: uint8 and float32.
+     *
+     * @param[in] original - input image data
+     * @param[out] processed - image data ready to be used for inference.
+     */
+    void PreProcessing(const cv::Mat& original, cv::Mat& processed);
+
+};
+
+/**
+ * Specific to MobileNet SSD v1 object detection pipeline implementation.
+ */
+class MobileNetSSDv1: public ObjDetectionPipeline {
+
+public:
+    /**
+     * Constructs object detection pipeline for MobileNet SSD network.
+     *
+     * Network input is expected to be uint8 or fp32. Data range [-1, 1].
+     * Network output is FP32.
+     *
+     * @param[in] - unique pointer to inference runner
+     * @paramp[in] objectThreshold - detected object score threshold for decoding step
+     */
+    MobileNetSSDv1(std::unique_ptr<common::ArmnnNetworkExecutor<float>> executor,
+                   float objectThreshold);
+
+    /**
+     * @brief MobileNet SSD image pre-processing implementation.
+     *
+     * On top of the standard pre-processing, converts input data type according to the network input tensor data type
+     * and scales input data from [0, 255] to [-1, 1] for FP32 input.
+     *
+     * Supported input data types: uint8 and float32.
+     *
+     * @param[in] original - input image data
+     * @param processed[out] - image data ready to be used for inference.
+     */
+    void PreProcessing(const cv::Mat& original, cv::Mat& processed);
+
+};
+
+using IPipelinePtr = std::unique_ptr<od::ObjDetectionPipeline>;
+
+/**
+ * Constructs object detection pipeline based on configuration provided.
+ *
+ * @param[in] config - object detection pipeline configuration.
+ *
+ * @return unique pointer to object detection pipeline.
+ */
+IPipelinePtr CreatePipeline(common::PipelineOptions& config);
+
+}// namespace od
\ No newline at end of file