pub struct EvalGrid {
pub eval_imgs: Vec<Option<Box<PerImageEval>>>,
pub eval_imgs_meta: Vec<Option<Box<EvalImageMeta>>>,
pub n_categories: usize,
pub n_area_ranges: usize,
pub n_images: usize,
pub retained_ious: Option<RetainedIous>,
}Expand description
Output of evaluate_bbox / evaluate_segm / evaluate_boundary
— the flat (K, A, I) grid of
PerImageEval cells the accumulator consumes, plus the dimensions
needed to construct crate::accumulate::AccumulateParams.
Fields§
§eval_imgs: Vec<Option<Box<PerImageEval>>>Some(cell) per (k, a, i) triple where the cell ran; None
where pycocotools would emit None (image absent from
detections, no GTs and no DTs in the cell). Layout is K-major,
then A, then I — eval_imgs[k * A * I + a * I + i].
Cells are heap-boxed: Option<Box<PerImageEval>> is 8 bytes
(Box’s NonNull niche absorbs the discriminant), so the dense
n_categories * n_area_ranges * n_images grid only pays for a
pointer per slot at zero-init time. On val2017 (1.6M slots,
14k populated) this drops the upfront alloc from 268 MB to
12.8 MB and the zero-init from ~120 ms to ~5 ms — see
docs/engineering/benchmarking/2026-05-bbox-cdf.md.
eval_imgs_meta: Vec<Option<Box<EvalImageMeta>>>Pycocotools-shaped bookkeeping for each populated cell (same
[k][a][i] layout as eval_imgs; None wherever eval_imgs is
None). Boxed for the same reason as eval_imgs.
n_categories: usizeK axis size: the number of categories used for evaluation, or
1 when use_cats=false.
n_area_ranges: usizeA axis size: equal to params.area_ranges.len().
n_images: usizeI axis size: number of images iterated over (every image in the
GT dataset, in deterministic id-ascending order).
retained_ious: Option<RetainedIous>Per-(category, image) IoU matrices retained when the caller
passed EvaluateParams::retain_iou = true. None on the
default no-retention path; one discriminant byte wide there.
Implementations§
Source§impl EvalGrid
impl EvalGrid
Sourcepub fn cell(&self, k: usize, a: usize, i: usize) -> Option<&PerImageEval>
pub fn cell(&self, k: usize, a: usize, i: usize) -> Option<&PerImageEval>
Cell at (category_index, area_index, image_index). Returns
None when the indices are in bounds but no cell ran (image
absent from detections, or no GTs and no DTs in the cell);
returns None for out-of-bounds indices as well.
Sourcepub fn cell_meta(&self, k: usize, a: usize, i: usize) -> Option<&EvalImageMeta>
pub fn cell_meta(&self, k: usize, a: usize, i: usize) -> Option<&EvalImageMeta>
Pycocotools-shaped bookkeeping at (category_index, area_index, image_index). None exactly when EvalGrid::cell is None.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for EvalGrid
impl RefUnwindSafe for EvalGrid
impl Send for EvalGrid
impl Sync for EvalGrid
impl Unpin for EvalGrid
impl UnsafeUnpin for EvalGrid
impl UnwindSafe for EvalGrid
Blanket Implementations§
Source§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
Source§type ArchivedMetadata = ()
type ArchivedMetadata = ()
Source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
Source§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
Source§impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
Source§unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
Source§fn resolve_niched(out: Place<NichedOption<T, N1>>)
fn resolve_niched(out: Place<NichedOption<T, N1>>)
out indicating that a T is niched.