pub mod classification;
pub mod coco;
pub mod pascal_voc;
pub mod yolo;
use std::path::{Path, PathBuf};
use crate::core::Detections;
pub(crate) fn is_image_file(path: &Path) -> bool {
matches!(
path.extension()
.and_then(|e| e.to_str())
.map(|e| e.to_ascii_lowercase())
.as_deref(),
Some("jpg") | Some("jpeg") | Some("png") | Some("bmp") | Some("gif") | Some("tiff")
)
}
#[derive(Debug, Clone, PartialEq)]
pub struct DatasetImage {
pub path: PathBuf,
pub width: u32,
pub height: u32,
pub detections: Detections,
}
#[derive(Debug, Clone, Default, PartialEq)]
pub struct DetectionDataset {
pub classes: Vec<String>,
pub images: Vec<DatasetImage>,
}
impl DetectionDataset {
pub fn new(classes: Vec<String>, images: Vec<DatasetImage>) -> Self {
Self { classes, images }
}
pub fn empty() -> Self {
Self::default()
}
pub fn len(&self) -> usize {
self.images.len()
}
pub fn is_empty(&self) -> bool {
self.images.is_empty()
}
pub fn num_annotations(&self) -> usize {
self.images.iter().map(|image| image.detections.len()).sum()
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct ClassificationImage {
pub path: PathBuf,
pub class_id: usize,
}
#[derive(Debug, Clone, Default, PartialEq)]
pub struct ClassificationDataset {
pub classes: Vec<String>,
pub images: Vec<ClassificationImage>,
}
impl ClassificationDataset {
pub fn new(classes: Vec<String>, images: Vec<ClassificationImage>) -> Self {
Self { classes, images }
}
pub fn empty() -> Self {
Self::default()
}
pub fn len(&self) -> usize {
self.images.len()
}
pub fn is_empty(&self) -> bool {
self.images.is_empty()
}
}