aboutsummaryrefslogtreecommitdiff
path: root/src/backends/neon/workloads
diff options
context:
space:
mode:
Diffstat (limited to 'src/backends/neon/workloads')
-rw-r--r--src/backends/neon/workloads/CMakeLists.txt2
-rw-r--r--src/backends/neon/workloads/NeonDetectionPostProcessWorkload.cpp112
-rw-r--r--src/backends/neon/workloads/NeonDetectionPostProcessWorkload.hpp40
-rw-r--r--src/backends/neon/workloads/NeonWorkloads.hpp1
4 files changed, 155 insertions, 0 deletions
diff --git a/src/backends/neon/workloads/CMakeLists.txt b/src/backends/neon/workloads/CMakeLists.txt
index cf3789e5ac..44db6d263a 100644
--- a/src/backends/neon/workloads/CMakeLists.txt
+++ b/src/backends/neon/workloads/CMakeLists.txt
@@ -30,6 +30,8 @@ list(APPEND armnnNeonBackendWorkloads_sources
NeonDepthwiseConvolutionWorkload.hpp
NeonDequantizeWorkload.cpp
NeonDequantizeWorkload.hpp
+ NeonDetectionPostProcessWorkload.cpp
+ NeonDetectionPostProcessWorkload.hpp
NeonFloorFloatWorkload.cpp
NeonFloorFloatWorkload.hpp
NeonFullyConnectedWorkload.cpp
diff --git a/src/backends/neon/workloads/NeonDetectionPostProcessWorkload.cpp b/src/backends/neon/workloads/NeonDetectionPostProcessWorkload.cpp
new file mode 100644
index 0000000000..481e950953
--- /dev/null
+++ b/src/backends/neon/workloads/NeonDetectionPostProcessWorkload.cpp
@@ -0,0 +1,112 @@
+//
+// Copyright © 2019 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#include "NeonDetectionPostProcessWorkload.hpp"
+
+#include "NeonWorkloadUtils.hpp"
+
+#include <aclCommon/ArmComputeTensorHandle.hpp>
+#include <aclCommon/ArmComputeTensorUtils.hpp>
+
+#include <boost/cast.hpp>
+
+namespace armnn
+{
+
+arm_compute::DetectionPostProcessLayerInfo MakeInfo(const DetectionPostProcessDescriptor& desc)
+{
+ return arm_compute::DetectionPostProcessLayerInfo(desc.m_MaxDetections,
+ desc.m_MaxClassesPerDetection,
+ desc.m_NmsScoreThreshold,
+ desc.m_NmsIouThreshold,
+ desc.m_NumClasses,
+ { desc.m_ScaleX,
+ desc.m_ScaleY,
+ desc.m_ScaleW,
+ desc.m_ScaleH },
+ desc.m_UseRegularNms,
+ desc.m_DetectionsPerClass);
+}
+
+arm_compute::Status NeonDetectionPostProcessValidate(const TensorInfo& boxEncodings,
+ const TensorInfo& scores,
+ const TensorInfo& anchors,
+ const TensorInfo& detectionBoxes,
+ const TensorInfo& detectionClasses,
+ const TensorInfo& detectionScores,
+ const TensorInfo& numDetections,
+ const DetectionPostProcessDescriptor &desc)
+{
+ arm_compute::DetectionPostProcessLayerInfo info = MakeInfo(desc);
+
+ const arm_compute::TensorInfo aclBoxEncodings =
+ armcomputetensorutils::BuildArmComputeTensorInfo(boxEncodings);
+
+ const arm_compute::TensorInfo aclScores =
+ armcomputetensorutils::BuildArmComputeTensorInfo(scores);
+
+ const arm_compute::TensorInfo aclAnchors =
+ armcomputetensorutils::BuildArmComputeTensorInfo(anchors);
+
+ arm_compute::TensorInfo aclDetectionBoxes =
+ armcomputetensorutils::BuildArmComputeTensorInfo(detectionBoxes);
+
+ arm_compute::TensorInfo aclDetectionClasses =
+ armcomputetensorutils::BuildArmComputeTensorInfo(detectionClasses);
+
+ arm_compute::TensorInfo aclDetectionScores =
+ armcomputetensorutils::BuildArmComputeTensorInfo(detectionScores);
+
+ arm_compute::TensorInfo aclNumDetections =
+ armcomputetensorutils::BuildArmComputeTensorInfo(numDetections);
+
+ return arm_compute::CPPDetectionPostProcessLayer::validate(
+ &aclBoxEncodings,
+ &aclScores,
+ &aclAnchors,
+ &aclDetectionBoxes,
+ &aclDetectionClasses,
+ &aclDetectionScores,
+ &aclNumDetections,
+ info);
+}
+
+NeonDetectionPostProcessWorkload::NeonDetectionPostProcessWorkload(
+ const DetectionPostProcessQueueDescriptor& descriptor,
+ const WorkloadInfo& info)
+ : BaseWorkload<DetectionPostProcessQueueDescriptor>(descriptor, info)
+{
+ m_Anchors = std::make_unique<arm_compute::Tensor>();
+ BuildArmComputeTensor(*m_Anchors, descriptor.m_Anchors->GetTensorInfo());
+
+ arm_compute::DetectionPostProcessLayerInfo di = MakeInfo(m_Data.m_Parameters);
+
+ auto AclTensorRef = [](ITensorHandle* tensor) -> arm_compute::ITensor&
+ {
+ return boost::polymorphic_downcast<IAclTensorHandle*>(tensor)->GetTensor();
+ };
+
+ arm_compute::ITensor& boxEncodings = AclTensorRef(m_Data.m_Inputs[0]);
+ arm_compute::ITensor& scores = AclTensorRef(m_Data.m_Inputs[1]);
+
+ arm_compute::ITensor& detectionBoxes = AclTensorRef(m_Data.m_Outputs[0]);
+ arm_compute::ITensor& detectionClasses = AclTensorRef(m_Data.m_Outputs[1]);
+ arm_compute::ITensor& detectionScores = AclTensorRef(m_Data.m_Outputs[2]);
+ arm_compute::ITensor& numDetections = AclTensorRef(m_Data.m_Outputs[3]);
+
+ m_Func.configure(&boxEncodings, &scores, m_Anchors.get(),
+ &detectionBoxes, &detectionClasses, &detectionScores, &numDetections,
+ di);
+
+ InitializeArmComputeTensorData(*m_Anchors, m_Data.m_Anchors);
+}
+
+void NeonDetectionPostProcessWorkload::Execute() const
+{
+ ARMNN_SCOPED_PROFILING_EVENT_NEON("NeonDetectionPostProcessWorkload_Execute");
+ m_Func.run();
+}
+
+} // namespace armnn
diff --git a/src/backends/neon/workloads/NeonDetectionPostProcessWorkload.hpp b/src/backends/neon/workloads/NeonDetectionPostProcessWorkload.hpp
new file mode 100644
index 0000000000..f7f0ebffb9
--- /dev/null
+++ b/src/backends/neon/workloads/NeonDetectionPostProcessWorkload.hpp
@@ -0,0 +1,40 @@
+//
+// Copyright © 2019 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#pragma once
+
+#include <backendsCommon/Workload.hpp>
+
+#include <arm_compute/core/Error.h>
+#include <arm_compute/runtime/CPP/functions/CPPDetectionPostProcessLayer.h>
+
+namespace armnn
+{
+
+arm_compute::Status NeonDetectionPostProcessValidate(const TensorInfo& boxEncodings,
+ const TensorInfo& scores,
+ const TensorInfo& anchors,
+ const TensorInfo& detectionBoxes,
+ const TensorInfo& detectionClasses,
+ const TensorInfo& detectionScores,
+ const TensorInfo& numDetections,
+ const DetectionPostProcessDescriptor &desc);
+
+class NeonDetectionPostProcessWorkload : public BaseWorkload<DetectionPostProcessQueueDescriptor>
+{
+public:
+ NeonDetectionPostProcessWorkload(
+ const DetectionPostProcessQueueDescriptor& descriptor,
+ const WorkloadInfo& info);
+ virtual void Execute() const override;
+
+private:
+ mutable arm_compute::CPPDetectionPostProcessLayer m_Func;
+
+ std::unique_ptr<arm_compute::Tensor> m_Anchors;
+
+};
+
+} // namespace armnn \ No newline at end of file
diff --git a/src/backends/neon/workloads/NeonWorkloads.hpp b/src/backends/neon/workloads/NeonWorkloads.hpp
index 77d819e3ab..dc9bef31b2 100644
--- a/src/backends/neon/workloads/NeonWorkloads.hpp
+++ b/src/backends/neon/workloads/NeonWorkloads.hpp
@@ -16,6 +16,7 @@
#include "NeonDepthToSpaceWorkload.hpp"
#include "NeonDepthwiseConvolutionWorkload.hpp"
#include "NeonDequantizeWorkload.hpp"
+#include "NeonDetectionPostProcessWorkload.hpp"
#include "NeonFloorFloatWorkload.hpp"
#include "NeonFullyConnectedWorkload.hpp"
#include "NeonGreaterWorkload.hpp"