| // | |
| // 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); | |
| } |