1 // 2 // Copyright © 2020 Arm Ltd and Contributors. All rights reserved. 3 // SPDX-License-Identifier: MIT 4 // 5 6 #include <catch.hpp> 7 8 #include "NonMaxSuppression.hpp" 9 10 TEST_CASE("Non_Max_Suppression_1") 11 { 12 // Box with iou exactly 0.5. 13 od::DetectedObject detectedObject1; 14 detectedObject1.SetLabel("2"); 15 detectedObject1.SetScore(171); 16 detectedObject1.SetBoundingBox({0, 0, 150, 150}); 17 18 // Strongest detection. 19 od::DetectedObject detectedObject2; 20 detectedObject2.SetLabel("2"); 21 detectedObject2.SetScore(230); 22 detectedObject2.SetBoundingBox({0, 75, 150, 75}); 23 24 // Weaker detection with same coordinates of strongest. 25 od::DetectedObject detectedObject3; 26 detectedObject3.SetLabel("2"); 27 detectedObject3.SetScore(20); 28 detectedObject3.SetBoundingBox({0, 75, 150, 75}); 29 30 // Detection not overlapping strongest. 31 od::DetectedObject detectedObject4; 32 detectedObject4.SetLabel("2"); 33 detectedObject4.SetScore(222); 34 detectedObject4.SetBoundingBox({0, 0, 50, 50}); 35 36 // Small detection inside strongest. 37 od::DetectedObject detectedObject5; 38 detectedObject5.SetLabel("2"); 39 detectedObject5.SetScore(201); 40 detectedObject5.SetBoundingBox({100, 100, 20, 20}); 41 42 // Box with iou exactly 0.5 but different label. 43 od::DetectedObject detectedObject6; 44 detectedObject6.SetLabel("1"); 45 detectedObject6.SetScore(75); 46 detectedObject6.SetBoundingBox({0, 0, 150, 150}); 47 48 od::DetectedObjects expectedResults {detectedObject1, 49 detectedObject2, 50 detectedObject3, 51 detectedObject4, 52 detectedObject5, 53 detectedObject6}; 54 55 auto sorted = od::NonMaxSuppression(expectedResults, 0.49); 56 57 // 1st and 3rd detection should be suppressed. 58 REQUIRE(sorted.size() == 4); 59 60 // Final detects should be ordered strongest to weakest. 61 REQUIRE(sorted[0] == 1); 62 REQUIRE(sorted[1] == 3); 63 REQUIRE(sorted[2] == 4); 64 REQUIRE(sorted[3] == 5); 65 } 66 67 TEST_CASE("Non_Max_Suppression_2") 68 { 69 // Real box examples. 70 od::DetectedObject detectedObject1; 71 detectedObject1.SetLabel("2"); 72 detectedObject1.SetScore(220); 73 detectedObject1.SetBoundingBox({430, 158, 68, 68}); 74 75 od::DetectedObject detectedObject2; 76 detectedObject2.SetLabel("2"); 77 detectedObject2.SetScore(171); 78 detectedObject2.SetBoundingBox({438, 158, 68, 68}); 79 80 od::DetectedObjects expectedResults {detectedObject1, 81 detectedObject2}; 82 83 auto sorted = od::NonMaxSuppression(expectedResults, 0.5); 84 85 // 2nd detect should be suppressed. 86 REQUIRE(sorted.size() == 1); 87 88 // First detect should be strongest and kept. 89 REQUIRE(sorted[0] == 0); 90 } 91