blob: d8b7c11ae1dcee9e222c3992238883acffa9809e [file] [log] [blame]
Éanna Ó Catháin919c14e2020-09-14 17:36:49 +01001//
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
10TEST_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
67TEST_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}