mod accumulate;
mod calibration;
mod catalog;
mod compare;
mod confusion;
mod diagnostics;
mod evaluate;
pub mod expand;
pub mod hierarchy;
mod iou;
mod matching;
mod mode;
mod report;
mod results;
pub mod slice;
mod summarize;
mod tide;
pub use accumulate::{AccumulatedEval, EvalShape};
pub use calibration::CalibrationResult;
pub use catalog::MetricDef;
pub use compare::{CategoryDelta, CompareOpts, ComparisonResult, compare};
pub use confusion::ConfusionMatrix;
pub use diagnostics::{
AnnotationIndex, DtStatus, ErrorProfile, GtStatus, ImageDiagnostics, ImageSummary, LabelError,
LabelErrorType,
};
pub use matching::EvalImg;
pub use mode::{EvalMode, FreqGroup};
pub use results::{EvalParams, EvalResults};
pub use slice::{SliceResult, SlicedResults};
pub use tide::TideErrors;
use std::borrow::Cow;
use std::collections::HashMap;
use crate::coco::COCO;
use crate::detection::hierarchy::Hierarchy;
use crate::params::{IouType, Params};
use mode::FreqGroups;
pub struct COCOeval {
pub coco_gt: COCO,
pub coco_dt: COCO,
pub params: Params,
pub(crate) eval_imgs: Vec<Option<EvalImg>>,
ious: HashMap<(u64, u64), matching::IouMatrix>,
segm_rles: Option<iou::SegmRles>,
pub(crate) eval: Option<AccumulatedEval>,
pub(crate) stats: Option<Vec<f64>>,
pub eval_mode: EvalMode,
freq_groups: FreqGroups,
pub hierarchy: Option<Hierarchy>,
}
impl COCOeval {
fn with_mode(
coco_gt: COCO,
coco_dt: COCO,
params: Params,
eval_mode: EvalMode,
hierarchy: Option<Hierarchy>,
) -> Self {
COCOeval {
coco_gt,
coco_dt,
params,
eval_imgs: Vec::new(),
ious: HashMap::new(),
segm_rles: None,
eval: None,
stats: None,
eval_mode,
freq_groups: FreqGroups::default(),
hierarchy,
}
}
pub fn new(coco_gt: COCO, coco_dt: COCO, iou_type: IouType) -> Self {
Self::with_mode(
coco_gt,
coco_dt,
Params::new(iou_type),
EvalMode::Coco,
None,
)
}
pub fn eval_imgs(&self) -> &[Option<EvalImg>] {
&self.eval_imgs
}
pub fn accumulated(&self) -> Option<&AccumulatedEval> {
self.eval.as_ref()
}
pub fn stats(&self) -> Option<&[f64]> {
self.stats.as_deref()
}
pub(in crate::detection) fn cell_ious(
&self,
img_id: u64,
cat_id: u64,
) -> Option<&matching::IouMatrix> {
self.ious.get(&(img_id, cat_id))
}
pub(in crate::detection) fn default_cells(&self) -> impl Iterator<Item = &EvalImg> {
let area_rng = self.params.all_area_range();
let max_det = self.params.max_det();
self.eval_imgs
.iter()
.flatten()
.filter(move |e| e.area_rng == area_rng && e.max_det == max_det)
}
pub(in crate::detection) fn resolved_ids(&self) -> (Cow<'_, [u64]>, Cow<'_, [u64]>) {
let img_ids = if self.params.img_ids.is_empty() {
Cow::Owned(self.coco_gt.get_img_ids(&[], &[]))
} else {
Cow::Borrowed(self.params.img_ids.as_slice())
};
let cat_ids = if self.params.cat_ids.is_empty() {
Cow::Owned(self.coco_gt.get_cat_ids(&[], &[], &[]))
} else {
Cow::Borrowed(self.params.cat_ids.as_slice())
};
(img_ids, cat_ids)
}
pub(in crate::detection) fn freq_groups(&self) -> &FreqGroups {
&self.freq_groups
}
pub fn new_lvis(coco_gt: COCO, coco_dt: COCO, iou_type: IouType) -> Self {
let mut params = Params::new(iou_type);
params.max_dets = vec![300];
Self::with_mode(coco_gt, coco_dt, params, EvalMode::Lvis, None)
}
pub fn run(&mut self) {
self.evaluate();
self.accumulate();
self.summarize();
}
pub fn new_oid(coco_gt: COCO, coco_dt: COCO, hierarchy: Option<Hierarchy>) -> Self {
let mut params = Params::new(IouType::Bbox);
params.iou_thrs = vec![0.5];
params.area_ranges = vec![crate::AreaRange {
label: "all".to_string(),
range: [0.0, 1e10],
}];
params.max_dets = vec![100];
Self::with_mode(coco_gt, coco_dt, params, EvalMode::OpenImages, hierarchy)
}
}