CommonLibraries/YoloRuntime/tests/obb_nms_iou_test.cpp

40 lines
1.7 KiB
C++

#include "yolo_nms_iou.h"
#include <cmath>
#include <iostream>
int main() {
constexpr float half_pi = 1.57079632679f;
constexpr float nms_threshold = 0.4f;
const yolo_nms::box first{300.0f, 1100.0f, 300.0f, 50.0f, half_pi};
const yolo_nms::box adjacent{350.0f, 1100.0f, 300.0f, 50.0f, half_pi};
const float detect_overlap = yolo_nms::overlap_iou(YOLO_TASK_DETECT, first, adjacent);
const float obb_overlap = yolo_nms::overlap_iou(YOLO_TASK_OBB, first, adjacent);
if (detect_overlap <= nms_threshold || obb_overlap >= 0.01f) {
std::cerr << "Adjacent vertical OBB overlap dispatch failed: axis=" << detect_overlap
<< " rotated=" << obb_overlap << '\n';
return 1;
}
const float identical_overlap = yolo_nms::rotated_iou(first, first);
if (std::abs(identical_overlap - 1.0f) > 1e-5f) {
std::cerr << "Identical rotated boxes must have IoU 1, got " << identical_overlap << '\n';
return 2;
}
const yolo_nms::box axis_first{10.0f, 20.0f, 100.0f, 80.0f, 0.0f};
const yolo_nms::box axis_second{30.0f, 40.0f, 100.0f, 80.0f, 0.0f};
const float axis_overlap = yolo_nms::axis_aligned_iou(axis_first, axis_second);
const float zero_angle_rotated_overlap = yolo_nms::rotated_iou(axis_first, axis_second);
if (std::abs(axis_overlap - zero_angle_rotated_overlap) > 1e-5f) {
std::cerr << "Zero-angle rotated IoU diverged from axis IoU: axis=" << axis_overlap
<< " rotated=" << zero_angle_rotated_overlap << '\n';
return 3;
}
std::cout << "OBB_NMS_IOU_TEST_OK axis=" << detect_overlap
<< " rotated=" << obb_overlap << '\n';
return 0;
}