mirror of
https://github.com/Qortal/Brooklyn.git
synced 2025-02-15 03:35:55 +00:00
91 lines
2.6 KiB
C++
91 lines
2.6 KiB
C++
//
|
|
// 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);
|
|
}
|