Skip to content

modosaic.providers.adapters.local_folder

modosaic.providers.adapters.local_folder

LocalFolderAdapter

LocalFolderAdapter(root, recursive=True, extensions=None)

Bases: DatasetAdapter

Dataset adapter that streams images from a local folder.

Initialize the adapter.

Parameters:

Name Type Description Default
root str | Path

Folder containing image files.

required
recursive bool

Whether to scan subdirectories.

True
extensions Sequence[str] | None

Optional accepted extensions. Values may be passed with or without a leading dot.

None
Source code in modosaic/providers/adapters/local_folder.py
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
def __init__(
        self,
        root: str | Path,
        recursive: bool = True,
        extensions: Sequence[str] | None = None,
):
    """Initialize the adapter.

    Args:
        root: Folder containing image files.
        recursive: Whether to scan subdirectories.
        extensions: Optional accepted extensions. Values may be passed with
            or without a leading dot.
    """
    self.root = Path(root)
    normalized = extensions or tuple(DEFAULT_IMAGE_EXTENSIONS)
    self.extensions = {ext.lower() if ext.startswith(".") else f".{ext.lower()}" for ext in normalized}
    self.recursive = recursive

iter_samples

iter_samples()

Yield image records in stable path order.

Returns:

Type Description
Iterator[ImageRecord]

Iterator of local image records.

Raises:

Type Description
FileNotFoundError

If the configured root does not exist.

Source code in modosaic/providers/adapters/local_folder.py
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
@override
def iter_samples(self) -> Iterator[ImageRecord]:
    """Yield image records in stable path order.

    Returns:
        Iterator of local image records.

    Raises:
        FileNotFoundError: If the configured root does not exist.
    """
    if not self.root.exists():
        raise FileNotFoundError(f"Local dataset folder not found: {self.root}")

    logger.debug(f"Scanning local dataset folder {self.root}")
    iterator = self.root.rglob("*") if self.recursive else self.root.glob("*")
    sorted_paths = sorted(iterator, key=lambda path: path.as_posix())
    for image_path in sorted_paths:
        if not image_path.is_file() or image_path.suffix.lower() not in self.extensions:
            continue
        relative = image_path.relative_to(self.root)
        sample_id = "_".join(relative.with_suffix("").parts)
        logger.debug(f"Loading local image sample {sample_id} from {image_path}")
        yield ImageRecord(
            sample_id=sample_id,
            image_bytes=image_path.read_bytes(),
            extension=image_path.suffix.lower(),
            metadata={"source_path": str(image_path)},
        )