From 80127549c3fabc941e6dcb5e61136ecb20f9c735 Mon Sep 17 00:00:00 2001 From: John Richardson Date: Thu, 7 Jun 2018 11:07:00 +0100 Subject: COMPMID-761: Add CL/NEON HOGMultiDetection benchmark tests Change-Id: I5e38eccc2fb273e2fd196b0528f27058e7c7ba2e Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/135667 Reviewed-by: Anthony Barbier Tested-by: Jenkins Reviewed-by: Gian Marco Iodice --- tests/benchmark/CL/HOGMultiDetection.cpp | 77 +++++++++++ tests/benchmark/NEON/HOGMultiDetection.cpp | 77 +++++++++++ .../benchmark/fixtures/HOGMultiDetectionFixture.h | 148 +++++++++++++++++++++ 3 files changed, 302 insertions(+) create mode 100644 tests/benchmark/CL/HOGMultiDetection.cpp create mode 100644 tests/benchmark/NEON/HOGMultiDetection.cpp create mode 100644 tests/benchmark/fixtures/HOGMultiDetectionFixture.h (limited to 'tests/benchmark') diff --git a/tests/benchmark/CL/HOGMultiDetection.cpp b/tests/benchmark/CL/HOGMultiDetection.cpp new file mode 100644 index 0000000000..c2fbfec430 --- /dev/null +++ b/tests/benchmark/CL/HOGMultiDetection.cpp @@ -0,0 +1,77 @@ +/* + * 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. + */ +#include "arm_compute/core/Types.h" +#include "arm_compute/runtime/CL/CLMultiHOG.h" +#include "arm_compute/runtime/CL/CLTensor.h" +#include "arm_compute/runtime/CL/functions/CLHOGMultiDetection.h" +#include "tests/CL/CLAccessor.h" +#include "tests/CL/CLArrayAccessor.h" +#include "tests/CL/CLHOGAccessor.h" +#include "tests/benchmark/fixtures/HOGMultiDetectionFixture.h" +#include "tests/datasets/HOGMultiDetectionDataset.h" +#include "tests/framework/Macros.h" +#include "tests/framework/datasets/Datasets.h" +#include "utils/TypePrinter.h" + +namespace arm_compute +{ +namespace test +{ +namespace benchmark +{ +// *INDENT-OFF* +// clang-format off +using CLHOGMultiDetectionFixture = HOGMultiDetectionFixture>; +TEST_SUITE(CL) +TEST_SUITE(HOGMultiDetection) + +REGISTER_FIXTURE_DATA_TEST_CASE(RunSmall, CLHOGMultiDetectionFixture, framework::DatasetMode::PRECOMMIT, + combine(combine(combine( + datasets::SmallHOGMultiDetectionDataset(), + framework::dataset::make("Format", Format::U8)), + framework::dataset::make("BorderMode", {BorderMode::CONSTANT, BorderMode::REPLICATE})), + framework::dataset::make("NonMaximaSuppression", {false, true}))); + +REGISTER_FIXTURE_DATA_TEST_CASE(RunLarge, CLHOGMultiDetectionFixture, framework::DatasetMode::NIGHTLY, + combine(combine(combine( + datasets::LargeHOGMultiDetectionDataset(), + framework::dataset::make("Format", Format::U8)), + framework::dataset::make("BorderMode", {BorderMode::CONSTANT, BorderMode::REPLICATE})), + framework::dataset::make("NonMaximaSuppression", {false, true}))); +// clang-format on +// *INDENT-ON* + +TEST_SUITE_END() // HOGMultiDetection +TEST_SUITE_END() // CL +} // namespace benchmark +} // namespace test +} // namespace arm_compute diff --git a/tests/benchmark/NEON/HOGMultiDetection.cpp b/tests/benchmark/NEON/HOGMultiDetection.cpp new file mode 100644 index 0000000000..c0b9d1d8cf --- /dev/null +++ b/tests/benchmark/NEON/HOGMultiDetection.cpp @@ -0,0 +1,77 @@ +/* + * 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. + */ +#include "arm_compute/core/Types.h" +#include "arm_compute/runtime/MultiHOG.h" +#include "arm_compute/runtime/NEON/functions/NEHOGMultiDetection.h" +#include "arm_compute/runtime/Tensor.h" +#include "tests/NEON/Accessor.h" +#include "tests/NEON/ArrayAccessor.h" +#include "tests/NEON/HOGAccessor.h" +#include "tests/benchmark/fixtures/HOGMultiDetectionFixture.h" +#include "tests/datasets/HOGMultiDetectionDataset.h" +#include "tests/framework/Macros.h" +#include "tests/framework/datasets/Datasets.h" +#include "utils/TypePrinter.h" + +namespace arm_compute +{ +namespace test +{ +namespace benchmark +{ +// *INDENT-OFF* +// clang-format off +using NEHOGMultiDetectionFixture = HOGMultiDetectionFixture>; +TEST_SUITE(NEON) +TEST_SUITE(HOGMultiDetection) + +REGISTER_FIXTURE_DATA_TEST_CASE(RunSmall, NEHOGMultiDetectionFixture, framework::DatasetMode::PRECOMMIT, + combine(combine(combine( + datasets::SmallHOGMultiDetectionDataset(), + framework::dataset::make("Format", Format::U8)), + framework::dataset::make("BorderMode", {BorderMode::CONSTANT, BorderMode::REPLICATE})), + framework::dataset::make("NonMaximaSuppression", {false, true}))); + +REGISTER_FIXTURE_DATA_TEST_CASE(RunLarge, NEHOGMultiDetectionFixture, framework::DatasetMode::NIGHTLY, + combine(combine(combine( + datasets::LargeHOGMultiDetectionDataset(), + framework::dataset::make("Format", Format::U8)), + framework::dataset::make("BorderMode", {BorderMode::CONSTANT, BorderMode::REPLICATE})), + framework::dataset::make("NonMaximaSuppression", {false, true}))); +// clang-format on +// *INDENT-ON* + +TEST_SUITE_END() // HOGMultiDetection +TEST_SUITE_END() // NEON +} // namespace benchmark +} // namespace test +} // namespace arm_compute diff --git a/tests/benchmark/fixtures/HOGMultiDetectionFixture.h b/tests/benchmark/fixtures/HOGMultiDetectionFixture.h new file mode 100644 index 0000000000..947646cdfc --- /dev/null +++ b/tests/benchmark/fixtures/HOGMultiDetectionFixture.h @@ -0,0 +1,148 @@ +/* + * 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_TEST_HOG_MULTI_DETECTION_FIXTURE +#define ARM_COMPUTE_TEST_HOG_MULTI_DETECTION_FIXTURE + +#include "arm_compute/core/TensorShape.h" +#include "arm_compute/core/Types.h" +#include "tests/Globals.h" +#include "tests/Utils.h" +#include "tests/framework/Fixture.h" + +namespace arm_compute +{ +namespace test +{ +namespace benchmark +{ +template +class HOGMultiDetectionFixture : public framework::Fixture +{ +public: + template + void setup(std::string image, std::vector models, Format format, BorderMode border_mode, bool non_maxima_suppression) + { + // Only defined borders supported + ARM_COMPUTE_ERROR_ON(border_mode == BorderMode::UNDEFINED); + + std::mt19937 generator(library->seed()); + std::uniform_int_distribution distribution_u8(0, 255); + uint8_t constant_border_value = static_cast(distribution_u8(generator)); + + // Load the image (cached by the library if loaded before) + const RawTensor &raw = library->get(image, format); + + // Initialize descriptors vector + std::vector> descriptors(models.size()); + + // Resize detection window_strides for index access + detection_window_strides.resize(models.size()); + + // Initialiize MultiHOG and detection windows + initialize_batch(models, multi_hog, descriptors, detection_window_strides); + + // Create tensors + src = create_tensor(raw.shape(), format); + + // Use default values for threshold and min_distance + const float threshold = 0.f; + const float min_distance = 1.f; + + hog_multi_detection_func.configure(&src, + &multi_hog, + &detection_windows, + &detection_window_strides, + border_mode, + constant_border_value, + threshold, + non_maxima_suppression, + min_distance); + + // Reset detection windows + detection_windows.clear(); + + // Allocate tensor + src.allocator()->allocate(); + + library->fill(Accessor(src), raw); + } + + void run() + { + hog_multi_detection_func.run(); + } + + void sync() + { + sync_if_necessary(); + } + +private: + void initialize_batch(const std::vector &models, MultiHOGType &multi_hog, + std::vector> &descriptors, DetectionWindowStrideType &detection_window_strides) + { + for(unsigned i = 0; i < models.size(); ++i) + { + auto hog_model = reinterpret_cast(multi_hog.model(i)); + hog_model->init(models[i]); + + // Initialise descriptor (linear SVM coefficients). + std::random_device::result_type seed = 0; + descriptors.at(i) = generate_random_real(models[i].descriptor_size(), -0.505f, 0.495f, seed); + + // Copy HOG descriptor values to HOG memory + { + HOGAccessorType hog_accessor(*hog_model); + std::memcpy(hog_accessor.descriptor(), descriptors.at(i).data(), descriptors.at(i).size() * sizeof(float)); + } + + // Initialize detection window stride + Size2DArrayAccessorType accessor(detection_window_strides); + accessor.at(i) = models[i].block_stride(); + } + } + +private: + static const unsigned int model_size = 4; + static const unsigned int max_num_detection_windows = 100000; + + MultiHOGType multi_hog{ model_size }; + DetectionWindowStrideType detection_window_strides{ model_size }; + DetectionWindowArrayType detection_windows{ max_num_detection_windows }; + + TensorType src{}; + Function hog_multi_detection_func{}; +}; +} // namespace benchmark +} // namespace test +} // namespace arm_compute +#endif /* ARM_COMPUTE_TEST_HOG_MULTI_DETECTION_FIXTURE */ -- cgit v1.2.1