diff --git a/powerboxesrs/benches/bench_iou.rs b/powerboxesrs/benches/bench_iou.rs index 8cca8fa..adbb6e9 100644 --- a/powerboxesrs/benches/bench_iou.rs +++ b/powerboxesrs/benches/bench_iou.rs @@ -1,5 +1,7 @@ use codspeed_criterion_compat::{black_box, criterion_group, criterion_main, Criterion}; use ndarray::Array2; +use powerboxesrs::ciou::ciou_distance; +use powerboxesrs::diou::diou_distance; use powerboxesrs::giou::{ giou_distance, parallel_giou_distance, parallel_rotated_giou_distance, rotated_giou_distance, }; @@ -80,6 +82,34 @@ pub fn parallel_giou_distance_benchmark(c: &mut Criterion) { }); } +pub fn ciou_distance_benchmark(c: &mut Criterion) { + let mut boxes1 = Array2::::zeros((100, 4)); + for i in 0..100 { + for j in 2..4 { + boxes1[[i, j]] = 10.0; + } + } + let boxes2 = boxes1.clone(); + + c.bench_function("ciou distance benchmark", |b| { + b.iter(|| ciou_distance(black_box(&boxes1), black_box(&boxes2))) + }); +} + +pub fn diou_distance_benchmark(c: &mut Criterion) { + let mut boxes1 = Array2::::zeros((100, 4)); + for i in 0..100 { + for j in 2..4 { + boxes1[[i, j]] = 10.0; + } + } + let boxes2 = boxes1.clone(); + + c.bench_function("diou distance benchmark", |b| { + b.iter(|| diou_distance(black_box(&boxes1), black_box(&boxes2))) + }); +} + /// Generate 100x5 rotated boxes with varied angles for benchmarking fn make_rotated_boxes(n: usize) -> Array2 { let mut boxes = Array2::::zeros((n, 5)); @@ -154,6 +184,8 @@ criterion_group!( parallel_iou_distance_benchmark, giou_distance_benchmark, parallel_giou_distance_benchmark, + ciou_distance_benchmark, + diou_distance_benchmark, rotated_iou_distance_benchmark, parallel_rotated_iou_distance_benchmark, rotated_giou_distance_benchmark, diff --git a/powerboxesrs/src/ciou.rs b/powerboxesrs/src/ciou.rs index e702bfc..03560c6 100644 --- a/powerboxesrs/src/ciou.rs +++ b/powerboxesrs/src/ciou.rs @@ -28,7 +28,7 @@ where { let two = N::one() + N::one(); let four_over_pi_sq: f64 = 4.0 / (std::f64::consts::PI * std::f64::consts::PI); - let mut result = vec![0.0f64; n1 * n2]; + let mut result = vec![utils::ONE; n1 * n2]; let areas1 = boxes::box_areas_slice(boxes1, n1); let areas2 = boxes::box_areas_slice(boxes2, n2); @@ -44,7 +44,6 @@ where let x2 = utils::min(a1_x2, a2_x2); let y2 = utils::min(a1_y2, a2_y2); if x2 < x1 || y2 < y1 { - result[i * n2 + j] = utils::ONE; continue; } let intersection = (x2 - x1) * (y2 - y1); diff --git a/powerboxesrs/src/diou.rs b/powerboxesrs/src/diou.rs index f907276..01acf78 100644 --- a/powerboxesrs/src/diou.rs +++ b/powerboxesrs/src/diou.rs @@ -24,7 +24,7 @@ where N: Num + PartialOrd + ToPrimitive + Float, { let two = N::one() + N::one(); - let mut result = vec![0.0f64; n1 * n2]; + let mut result = vec![utils::ONE; n1 * n2]; let areas1 = boxes::box_areas_slice(boxes1, n1); let areas2 = boxes::box_areas_slice(boxes2, n2); @@ -40,7 +40,6 @@ where let x2 = utils::min(a1_x2, a2_x2); let y2 = utils::min(a1_y2, a2_y2); if x2 < x1 || y2 < y1 { - result[i * n2 + j] = utils::ONE; continue; } let intersection = (x2 - x1) * (y2 - y1);