yscv-eval 0.1.8

Evaluation metrics (mAP, MOTA, HOTA) and dataset adapters
Documentation
mod coco;
mod helpers;
mod jsonl;
mod kitti;
mod mot;
mod openimages;
mod types;
mod voc;
mod widerface;
mod yolo;

use std::fs;
use std::path::Path;

use crate::{DetectionDatasetFrame, EvalError, TrackingDatasetFrame};

use self::coco::build_detection_dataset_from_coco;
use self::jsonl::parse_dataset_jsonl;
use self::mot::parse_and_build_mot;
use self::openimages::parse_and_build_openimages;
use self::types::{
    CocoGroundTruthWire, CocoPredictionWire, DetectionDatasetFrameWire, TrackingDatasetFrameWire,
};
use self::widerface::parse_and_build_widerface;

pub fn load_detection_dataset_coco_files(
    ground_truth_path: &Path,
    predictions_path: &Path,
) -> Result<Vec<DetectionDatasetFrame>, EvalError> {
    let ground_truth_text =
        fs::read_to_string(ground_truth_path).map_err(|err| EvalError::DatasetIo {
            path: ground_truth_path.display().to_string(),
            message: err.to_string(),
        })?;
    let predictions_text =
        fs::read_to_string(predictions_path).map_err(|err| EvalError::DatasetIo {
            path: predictions_path.display().to_string(),
            message: err.to_string(),
        })?;
    parse_detection_dataset_coco(&ground_truth_text, &predictions_text)
}

pub fn parse_detection_dataset_coco(
    ground_truth_json: &str,
    predictions_json: &str,
) -> Result<Vec<DetectionDatasetFrame>, EvalError> {
    let ground_truth: CocoGroundTruthWire =
        serde_json::from_str(ground_truth_json).map_err(|err| EvalError::InvalidDatasetFormat {
            format: "coco-ground-truth",
            message: err.to_string(),
        })?;
    let predictions: Vec<CocoPredictionWire> =
        serde_json::from_str(predictions_json).map_err(|err| EvalError::InvalidDatasetFormat {
            format: "coco-predictions",
            message: err.to_string(),
        })?;
    build_detection_dataset_from_coco(ground_truth, predictions)
}

pub fn load_detection_dataset_openimages_csv_files(
    ground_truth_path: &Path,
    predictions_path: &Path,
) -> Result<Vec<DetectionDatasetFrame>, EvalError> {
    let ground_truth_text =
        fs::read_to_string(ground_truth_path).map_err(|err| EvalError::DatasetIo {
            path: ground_truth_path.display().to_string(),
            message: err.to_string(),
        })?;
    let predictions_text =
        fs::read_to_string(predictions_path).map_err(|err| EvalError::DatasetIo {
            path: predictions_path.display().to_string(),
            message: err.to_string(),
        })?;
    parse_detection_dataset_openimages_csv(&ground_truth_text, &predictions_text)
}

pub fn parse_detection_dataset_openimages_csv(
    ground_truth_csv: &str,
    predictions_csv: &str,
) -> Result<Vec<DetectionDatasetFrame>, EvalError> {
    parse_and_build_openimages(ground_truth_csv, predictions_csv)
}

pub fn load_detection_dataset_yolo_label_dirs(
    manifest_path: &Path,
    ground_truth_labels_dir: &Path,
    prediction_labels_dir: &Path,
) -> Result<Vec<DetectionDatasetFrame>, EvalError> {
    let manifest_text = fs::read_to_string(manifest_path).map_err(|err| EvalError::DatasetIo {
        path: manifest_path.display().to_string(),
        message: err.to_string(),
    })?;
    yolo::load_yolo_label_dirs(
        &manifest_text,
        ground_truth_labels_dir,
        prediction_labels_dir,
    )
}

pub fn load_detection_dataset_voc_xml_dirs(
    manifest_path: &Path,
    ground_truth_xml_dir: &Path,
    prediction_xml_dir: &Path,
) -> Result<Vec<DetectionDatasetFrame>, EvalError> {
    let manifest_text = fs::read_to_string(manifest_path).map_err(|err| EvalError::DatasetIo {
        path: manifest_path.display().to_string(),
        message: err.to_string(),
    })?;
    voc::load_voc_xml_dirs(&manifest_text, ground_truth_xml_dir, prediction_xml_dir)
}

pub fn load_detection_dataset_kitti_label_dirs(
    manifest_path: &Path,
    ground_truth_labels_dir: &Path,
    prediction_labels_dir: &Path,
) -> Result<Vec<DetectionDatasetFrame>, EvalError> {
    let manifest_text = fs::read_to_string(manifest_path).map_err(|err| EvalError::DatasetIo {
        path: manifest_path.display().to_string(),
        message: err.to_string(),
    })?;
    kitti::load_kitti_label_dirs(
        &manifest_text,
        ground_truth_labels_dir,
        prediction_labels_dir,
    )
}

pub fn load_detection_dataset_widerface_files(
    ground_truth_path: &Path,
    predictions_path: &Path,
) -> Result<Vec<DetectionDatasetFrame>, EvalError> {
    let ground_truth_text =
        fs::read_to_string(ground_truth_path).map_err(|err| EvalError::DatasetIo {
            path: ground_truth_path.display().to_string(),
            message: err.to_string(),
        })?;
    let predictions_text =
        fs::read_to_string(predictions_path).map_err(|err| EvalError::DatasetIo {
            path: predictions_path.display().to_string(),
            message: err.to_string(),
        })?;
    parse_detection_dataset_widerface(&ground_truth_text, &predictions_text)
}

pub fn parse_detection_dataset_widerface(
    ground_truth_text: &str,
    predictions_text: &str,
) -> Result<Vec<DetectionDatasetFrame>, EvalError> {
    parse_and_build_widerface(ground_truth_text, predictions_text)
}

pub fn load_detection_dataset_jsonl_file(
    path: &Path,
) -> Result<Vec<DetectionDatasetFrame>, EvalError> {
    let text = fs::read_to_string(path).map_err(|err| EvalError::DatasetIo {
        path: path.display().to_string(),
        message: err.to_string(),
    })?;
    parse_detection_dataset_jsonl(&text)
}

pub fn parse_detection_dataset_jsonl(text: &str) -> Result<Vec<DetectionDatasetFrame>, EvalError> {
    parse_dataset_jsonl(text, |line, line_no| {
        let wire = serde_json::from_str::<DetectionDatasetFrameWire>(line).map_err(|err| {
            EvalError::InvalidDatasetEntry {
                line: line_no,
                message: err.to_string(),
            }
        })?;
        Ok(wire.into_runtime())
    })
}

pub fn load_tracking_dataset_jsonl_file(
    path: &Path,
) -> Result<Vec<TrackingDatasetFrame>, EvalError> {
    let text = fs::read_to_string(path).map_err(|err| EvalError::DatasetIo {
        path: path.display().to_string(),
        message: err.to_string(),
    })?;
    parse_tracking_dataset_jsonl(&text)
}

pub fn parse_tracking_dataset_jsonl(text: &str) -> Result<Vec<TrackingDatasetFrame>, EvalError> {
    parse_dataset_jsonl(text, |line, line_no| {
        let wire = serde_json::from_str::<TrackingDatasetFrameWire>(line).map_err(|err| {
            EvalError::InvalidDatasetEntry {
                line: line_no,
                message: err.to_string(),
            }
        })?;
        Ok(wire.into_runtime())
    })
}

pub fn load_tracking_dataset_mot_txt_files(
    ground_truth_path: &Path,
    predictions_path: &Path,
) -> Result<Vec<TrackingDatasetFrame>, EvalError> {
    let ground_truth_text =
        fs::read_to_string(ground_truth_path).map_err(|err| EvalError::DatasetIo {
            path: ground_truth_path.display().to_string(),
            message: err.to_string(),
        })?;
    let predictions_text =
        fs::read_to_string(predictions_path).map_err(|err| EvalError::DatasetIo {
            path: predictions_path.display().to_string(),
            message: err.to_string(),
        })?;
    parse_tracking_dataset_mot(&ground_truth_text, &predictions_text)
}

pub fn parse_tracking_dataset_mot(
    ground_truth_text: &str,
    predictions_text: &str,
) -> Result<Vec<TrackingDatasetFrame>, EvalError> {
    parse_and_build_mot(ground_truth_text, predictions_text)
}