40 lines
1.7 KiB
C++
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;
|
|
}
|