aboutsummaryrefslogtreecommitdiff
path: root/samples/ObjectDetection/test/NMSTests.cpp
blob: d8b7c11ae1dcee9e222c3992238883acffa9809e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
//
// 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);
}