forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
2.6 KiB
90 lines
2.6 KiB
// |
|
// Copyright © 2020 Arm Ltd and Contributors. All rights reserved. |
|
// SPDX-License-Identifier: MIT |
|
// |
|
|
|
#include <catch.hpp> |
|
|
|
#include "NonMaxSuppression.hpp" |
|
|
|
TEST_CASE("Non_Max_Suppression_1") |
|
{ |
|
// Box with iou exactly 0.5. |
|
od::DetectedObject detectedObject1; |
|
detectedObject1.SetLabel("2"); |
|
detectedObject1.SetScore(171); |
|
detectedObject1.SetBoundingBox({0, 0, 150, 150}); |
|
|
|
// Strongest detection. |
|
od::DetectedObject detectedObject2; |
|
detectedObject2.SetLabel("2"); |
|
detectedObject2.SetScore(230); |
|
detectedObject2.SetBoundingBox({0, 75, 150, 75}); |
|
|
|
// Weaker detection with same coordinates of strongest. |
|
od::DetectedObject detectedObject3; |
|
detectedObject3.SetLabel("2"); |
|
detectedObject3.SetScore(20); |
|
detectedObject3.SetBoundingBox({0, 75, 150, 75}); |
|
|
|
// Detection not overlapping strongest. |
|
od::DetectedObject detectedObject4; |
|
detectedObject4.SetLabel("2"); |
|
detectedObject4.SetScore(222); |
|
detectedObject4.SetBoundingBox({0, 0, 50, 50}); |
|
|
|
// Small detection inside strongest. |
|
od::DetectedObject detectedObject5; |
|
detectedObject5.SetLabel("2"); |
|
detectedObject5.SetScore(201); |
|
detectedObject5.SetBoundingBox({100, 100, 20, 20}); |
|
|
|
// Box with iou exactly 0.5 but different label. |
|
od::DetectedObject detectedObject6; |
|
detectedObject6.SetLabel("1"); |
|
detectedObject6.SetScore(75); |
|
detectedObject6.SetBoundingBox({0, 0, 150, 150}); |
|
|
|
od::DetectedObjects expectedResults {detectedObject1, |
|
detectedObject2, |
|
detectedObject3, |
|
detectedObject4, |
|
detectedObject5, |
|
detectedObject6}; |
|
|
|
auto sorted = od::NonMaxSuppression(expectedResults, 0.49); |
|
|
|
// 1st and 3rd detection should be suppressed. |
|
REQUIRE(sorted.size() == 4); |
|
|
|
// Final detects should be ordered strongest to weakest. |
|
REQUIRE(sorted[0] == 1); |
|
REQUIRE(sorted[1] == 3); |
|
REQUIRE(sorted[2] == 4); |
|
REQUIRE(sorted[3] == 5); |
|
} |
|
|
|
TEST_CASE("Non_Max_Suppression_2") |
|
{ |
|
// Real box examples. |
|
od::DetectedObject detectedObject1; |
|
detectedObject1.SetLabel("2"); |
|
detectedObject1.SetScore(220); |
|
detectedObject1.SetBoundingBox({430, 158, 68, 68}); |
|
|
|
od::DetectedObject detectedObject2; |
|
detectedObject2.SetLabel("2"); |
|
detectedObject2.SetScore(171); |
|
detectedObject2.SetBoundingBox({438, 158, 68, 68}); |
|
|
|
od::DetectedObjects expectedResults {detectedObject1, |
|
detectedObject2}; |
|
|
|
auto sorted = od::NonMaxSuppression(expectedResults, 0.5); |
|
|
|
// 2nd detect should be suppressed. |
|
REQUIRE(sorted.size() == 1); |
|
|
|
// First detect should be strongest and kept. |
|
REQUIRE(sorted[0] == 0); |
|
}
|
|
|