Skip to content

Add dataset validation contract (DataSpec) and nobrainer validate / nobrainer inspect CLI #374

Description

@dhritimandas

Issue:
As we migrate to PyTorch/MONAI and support larger Zarr/BIDS datasets, there's a risk of silent failures or deep-stack crashes if the data doesn't perfectly match what nobrainer.dataset.get_dataset() and MONAI's CacheDataset expect. Currently get_dataset() fails late — during training — when data has broken DataLad symlinks, inconsistent spacing, mismatched label classes, corrupt Zarr shards, or orientation mismatches.

Example: many neuroimaging datasets (including neuronets/trained-models) are DataLad/git-annex repositories where large files are symlinks to annex objects. Before datalad get is run, these symlinks exist on the filesystem but resolve to nothing. Attempting to read a NIfTI header from an un-fetched annex pointer produces a cryptic read error rather than a helpful message telling the user which files need to be downloaded.

Proposal:

Add nobrainer/data/spec.py with a DataSpec dataclass capturing the implicit contract that get_dataset() and predict() already assume:

Image/label path pairs exist and are readable (NIfTI or Zarr)
DataLad/git-annex awareness: detect symlinks pointing to annex objects and verify the content is locally present before attempting header reads. On failure, report the exact paths and suggest datalad get <path>
Spatial dimensions of image and label match per subject
Voxel spacing is within a declared range and consistent across subjects
Orientation codes are uniform (or explicitly declared mixed)
Label values are a subset of a declared class set
For Zarr: chunk shape, shard presence, and pyramid level count are valid

Add nobrainer validate <manifest> — exits non-zero on any violation, prints actionable errors
Add nobrainer inspect <manifest> — outputs human-readable summary + JSON
Wire preflight validation into train and predict entry points (skippable with --skip-validate)

No new external dependencies. Uses nibabel (already present) for NIfTI header reads and zarr/fsspec (already present) for Zarr inspection.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions