From 7f4a8191a0fff69ec6c819e8d785a2c780388feb Mon Sep 17 00:00:00 2001 From: John Richardson Date: Mon, 5 Feb 2018 15:12:22 +0000 Subject: COMPMID-597: Port HOGMultiDetection to new framework Change-Id: I4b31b7f052a06bea4154d04c9926a0e076e28d73 Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/126555 Tested-by: Jenkins Reviewed-by: John Richardson Reviewed-by: Gian Marco Iodice Reviewed-by: Anthony Barbier --- ...PPDetectionWindowNonMaximaSuppressionKernel.cpp | 29 ++++++++++++++++++---- src/core/NEON/kernels/NEHOGDescriptorKernel.cpp | 4 +-- 2 files changed, 26 insertions(+), 7 deletions(-) (limited to 'src/core') diff --git a/src/core/CPP/kernels/CPPDetectionWindowNonMaximaSuppressionKernel.cpp b/src/core/CPP/kernels/CPPDetectionWindowNonMaximaSuppressionKernel.cpp index 62a2477adf..5037ac55cb 100644 --- a/src/core/CPP/kernels/CPPDetectionWindowNonMaximaSuppressionKernel.cpp +++ b/src/core/CPP/kernels/CPPDetectionWindowNonMaximaSuppressionKernel.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 ARM Limited. + * Copyright (c) 2017-2018 ARM Limited. * * SPDX-License-Identifier: MIT * @@ -35,7 +35,26 @@ namespace { bool compare_detection_window(const DetectionWindow &lhs, const DetectionWindow &rhs) { - return lhs.score > rhs.score; + if(lhs.idx_class < rhs.idx_class) + { + return true; + } + if(rhs.idx_class < lhs.idx_class) + { + return false; + } + + // idx_classes are equal so compare by score + if(lhs.score > rhs.score) + { + return true; + } + if(rhs.score > lhs.score) + { + return false; + } + + return false; } } // namespace @@ -70,7 +89,7 @@ void CPPDetectionWindowNonMaximaSuppressionKernel::run(const Window &window, con const size_t num_candidates = _input_output->num_values(); size_t num_detections = 0; - // Sort list of candidates + // Sort list of candidates by idx_class and then score std::sort(_input_output->buffer(), _input_output->buffer() + num_candidates, compare_detection_window); const float min_distance_pow2 = _min_distance * _min_distance; @@ -96,7 +115,7 @@ void CPPDetectionWindowNonMaximaSuppressionKernel::run(const Window &window, con const float xc = cur.x + cur.width * 0.5f; const float yc = cur.y + cur.height * 0.5f; - for(size_t k = i + 1; k < num_candidates; ++k) + for(size_t k = i + 1; k < (num_candidates) && (cur.idx_class == _input_output->at(k).idx_class); ++k) { const float xn = _input_output->at(k).x + _input_output->at(k).width * 0.5f; const float yn = _input_output->at(k).y + _input_output->at(k).height * 0.5f; @@ -110,7 +129,7 @@ void CPPDetectionWindowNonMaximaSuppressionKernel::run(const Window &window, con if(d < min_distance_pow2) { - // Invalidate keypoint + // Invalidate detection window _input_output->at(k).score = 0.0f; } } diff --git a/src/core/NEON/kernels/NEHOGDescriptorKernel.cpp b/src/core/NEON/kernels/NEHOGDescriptorKernel.cpp index abe224e854..c204395586 100644 --- a/src/core/NEON/kernels/NEHOGDescriptorKernel.cpp +++ b/src/core/NEON/kernels/NEHOGDescriptorKernel.cpp @@ -786,7 +786,7 @@ void NEHOGBlockNormalizationKernel::run(const Window &window, const ThreadInfo & Window win_in(window); win_in.set_dimension_step(Window::DimX, _num_cells_per_block_stride.width); - win_in.set_dimension_step(Window::DimY, _num_cells_per_block_stride.height); + win_in.set(Window::DimY, Window::Dimension(0, 0, 0)); Iterator in(_input, win_in); Iterator out(_output, window); @@ -794,7 +794,7 @@ void NEHOGBlockNormalizationKernel::run(const Window &window, const ThreadInfo & // Normalises blocks execute_window_loop(window, [&](const Coordinates & id) { - const auto input_row_ptr = reinterpret_cast(in.ptr()); + const auto input_row_ptr = reinterpret_cast(in.ptr() + id.y() * _num_cells_per_block_stride.height * _input->info()->strides_in_bytes()[Window::DimY]); const auto out_row_ptr = reinterpret_cast(out.ptr()); // Execute normalization function -- cgit v1.2.1