blob: 481e950953352741d9e62fdd78fea157ccb96e72 [file] [log] [blame]
Derek Lamberti6a5e5e82019-12-05 14:41:20 +00001//
2// Copyright © 2019 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "NeonDetectionPostProcessWorkload.hpp"
7
8#include "NeonWorkloadUtils.hpp"
9
10#include <aclCommon/ArmComputeTensorHandle.hpp>
11#include <aclCommon/ArmComputeTensorUtils.hpp>
12
13#include <boost/cast.hpp>
14
15namespace armnn
16{
17
18arm_compute::DetectionPostProcessLayerInfo MakeInfo(const DetectionPostProcessDescriptor& desc)
19{
20 return arm_compute::DetectionPostProcessLayerInfo(desc.m_MaxDetections,
21 desc.m_MaxClassesPerDetection,
22 desc.m_NmsScoreThreshold,
23 desc.m_NmsIouThreshold,
24 desc.m_NumClasses,
25 { desc.m_ScaleX,
26 desc.m_ScaleY,
27 desc.m_ScaleW,
28 desc.m_ScaleH },
29 desc.m_UseRegularNms,
30 desc.m_DetectionsPerClass);
31}
32
33arm_compute::Status NeonDetectionPostProcessValidate(const TensorInfo& boxEncodings,
34 const TensorInfo& scores,
35 const TensorInfo& anchors,
36 const TensorInfo& detectionBoxes,
37 const TensorInfo& detectionClasses,
38 const TensorInfo& detectionScores,
39 const TensorInfo& numDetections,
40 const DetectionPostProcessDescriptor &desc)
41{
42 arm_compute::DetectionPostProcessLayerInfo info = MakeInfo(desc);
43
44 const arm_compute::TensorInfo aclBoxEncodings =
45 armcomputetensorutils::BuildArmComputeTensorInfo(boxEncodings);
46
47 const arm_compute::TensorInfo aclScores =
48 armcomputetensorutils::BuildArmComputeTensorInfo(scores);
49
50 const arm_compute::TensorInfo aclAnchors =
51 armcomputetensorutils::BuildArmComputeTensorInfo(anchors);
52
53 arm_compute::TensorInfo aclDetectionBoxes =
54 armcomputetensorutils::BuildArmComputeTensorInfo(detectionBoxes);
55
56 arm_compute::TensorInfo aclDetectionClasses =
57 armcomputetensorutils::BuildArmComputeTensorInfo(detectionClasses);
58
59 arm_compute::TensorInfo aclDetectionScores =
60 armcomputetensorutils::BuildArmComputeTensorInfo(detectionScores);
61
62 arm_compute::TensorInfo aclNumDetections =
63 armcomputetensorutils::BuildArmComputeTensorInfo(numDetections);
64
65 return arm_compute::CPPDetectionPostProcessLayer::validate(
66 &aclBoxEncodings,
67 &aclScores,
68 &aclAnchors,
69 &aclDetectionBoxes,
70 &aclDetectionClasses,
71 &aclDetectionScores,
72 &aclNumDetections,
73 info);
74}
75
76NeonDetectionPostProcessWorkload::NeonDetectionPostProcessWorkload(
77 const DetectionPostProcessQueueDescriptor& descriptor,
78 const WorkloadInfo& info)
79 : BaseWorkload<DetectionPostProcessQueueDescriptor>(descriptor, info)
80{
81 m_Anchors = std::make_unique<arm_compute::Tensor>();
82 BuildArmComputeTensor(*m_Anchors, descriptor.m_Anchors->GetTensorInfo());
83
84 arm_compute::DetectionPostProcessLayerInfo di = MakeInfo(m_Data.m_Parameters);
85
86 auto AclTensorRef = [](ITensorHandle* tensor) -> arm_compute::ITensor&
87 {
88 return boost::polymorphic_downcast<IAclTensorHandle*>(tensor)->GetTensor();
89 };
90
91 arm_compute::ITensor& boxEncodings = AclTensorRef(m_Data.m_Inputs[0]);
92 arm_compute::ITensor& scores = AclTensorRef(m_Data.m_Inputs[1]);
93
94 arm_compute::ITensor& detectionBoxes = AclTensorRef(m_Data.m_Outputs[0]);
95 arm_compute::ITensor& detectionClasses = AclTensorRef(m_Data.m_Outputs[1]);
96 arm_compute::ITensor& detectionScores = AclTensorRef(m_Data.m_Outputs[2]);
97 arm_compute::ITensor& numDetections = AclTensorRef(m_Data.m_Outputs[3]);
98
99 m_Func.configure(&boxEncodings, &scores, m_Anchors.get(),
100 &detectionBoxes, &detectionClasses, &detectionScores, &numDetections,
101 di);
102
103 InitializeArmComputeTensorData(*m_Anchors, m_Data.m_Anchors);
104}
105
106void NeonDetectionPostProcessWorkload::Execute() const
107{
108 ARMNN_SCOPED_PROFILING_EVENT_NEON("NeonDetectionPostProcessWorkload_Execute");
109 m_Func.run();
110}
111
112} // namespace armnn