A deep learning framework for 3D brain image processing.
Project description
Nobrainer
Nobrainer is a deep learning framework for 3D brain image processing built on PyTorch and MONAI. It provides segmentation models (deterministic and Bayesian), generative models, a MONAI-native data pipeline, block-based prediction with uncertainty quantification, and CLI tools for inference and automated hyperparameter search.
Pre-trained models for brain extraction, segmentation, and generation are available in the trained-models repository.
The Nobrainer project is supported by NIH RF1MH121885 and is distributed under the Apache 2.0 license.
Models
Segmentation
| Model | Backend | Application |
|---|---|---|
| UNet | MONAI | segmentation |
| VNet | MONAI | segmentation |
| Attention U-Net | MONAI | segmentation |
| UNETR | MONAI | segmentation |
| MeshNet | PyTorch | segmentation |
| HighResNet | PyTorch | segmentation |
Bayesian (uncertainty quantification)
| Model | Backend | Application |
|---|---|---|
| Bayesian VNet | Pyro | segmentation + uncertainty |
| Bayesian MeshNet | Pyro | segmentation + uncertainty |
Generative
| Model | Backend | Application |
|---|---|---|
| Progressive GAN | PyTorch Lightning | brain generation |
| DCGAN | PyTorch Lightning | brain generation |
Other
| Model | Application |
|---|---|
| Autoencoder | representation learning |
| SimSiam | self-supervised learning |
Custom layers
BernoulliDropout,ConcreteDropout,GaussianDropout— stochastic regularizationBayesianConv3d,BayesianLinear— Pyro-based weight uncertainty layersMaxPool4D— 4D max pooling via reshape
Losses and metrics
Losses: Dice, Generalized Dice, Jaccard, Tversky, ELBO (Bayesian), Wasserstein, Gradient Penalty
Metrics: Dice, Jaccard, Hausdorff distance (all via MONAI)
Installation
pip / uv
uv venv --python 3.14
source .venv/bin/activate
uv pip install nobrainer
For Bayesian and generative model support:
uv pip install "nobrainer[bayesian,generative]" monai pyro-ppl
Docker
GPU image (requires NVIDIA driver on host):
docker pull neuronets/nobrainer:latest-gpu-pt
docker run --gpus all --rm neuronets/nobrainer:latest-gpu-pt predict --help
CPU-only image:
docker pull neuronets/nobrainer:latest-cpu-pt
docker run --rm neuronets/nobrainer:latest-cpu-pt predict --help
Quick start
Tutorials
See the Nobrainer Book for 11 progressive tutorials — from installation to contributing.
sr-tests (somewhat realistic tests)
nobrainer/sr-tests/ contains pytest integration tests that exercise the
real API with real brain data. They run in CI on every push:
pytest nobrainer/sr-tests/ -v -m "not gpu" --tb=short
Simple API (3 lines)
from nobrainer.processing import Segmentation, Dataset
ds = Dataset.from_files(filepaths, block_shape=(128, 128, 128), n_classes=2).batch(2)
result = Segmentation("unet").fit(ds, epochs=5).predict("brain.nii.gz")
Models are saved with Croissant-ML metadata for reproducibility:
seg.save("my_model") # Creates model.pth + croissant.json
seg = Segmentation.load("my_model")
Brain segmentation (CLI)
nobrainer predict \
--model unet_brainmask.pth \
--model-type unet \
--n-classes 2 \
input_T1w.nii.gz output_mask.nii.gz
Brain segmentation (Python)
import torch
import nobrainer
from nobrainer.prediction import predict
model = nobrainer.models.unet(n_classes=2)
model.load_state_dict(torch.load("unet_brainmask.pth"))
model.eval()
result = predict(
inputs="input_T1w.nii.gz",
model=model,
block_shape=(128, 128, 128),
device="cuda",
)
result.to_filename("output_mask.nii.gz")
Bayesian inference with uncertainty maps
from nobrainer.prediction import predict_with_uncertainty
model = nobrainer.models.bayesian_vnet(n_classes=2)
model.load_state_dict(torch.load("bayesian_vnet.pth"))
label, variance, entropy = predict_with_uncertainty(
inputs="input_T1w.nii.gz",
model=model,
n_samples=10,
block_shape=(128, 128, 128),
device="cuda",
)
label.to_filename("label.nii.gz")
variance.to_filename("variance.nii.gz")
entropy.to_filename("entropy.nii.gz")
Brain generation
nobrainer generate \
--model progressivegan.ckpt \
--model-type progressivegan \
output_synthetic.nii.gz
Zarr v3 data pipeline
from nobrainer.io import nifti_to_zarr, zarr_to_nifti
# Convert NIfTI to sharded Zarr v3 with multi-resolution pyramid
nifti_to_zarr("brain_T1w.nii.gz", "brain.zarr", chunk_shape=(64, 64, 64), levels=3)
# Load Zarr stores directly in the training pipeline
from nobrainer.dataset import get_dataset
loader = get_dataset(
data=[{"image": "brain.zarr", "label": "label.zarr"}],
batch_size=2,
)
# Round-trip back to NIfTI
zarr_to_nifti("brain.zarr", "brain_roundtrip.nii.gz")
Training a model
import torch
from nobrainer.dataset import get_dataset
from nobrainer.losses import dice
data_files = [
{"image": f"sub-{i:03d}_T1w.nii.gz", "label": f"sub-{i:03d}_label.nii.gz"}
for i in range(1, 101)
]
loader = get_dataset(data=data_files, batch_size=2, augment=True, cache=True)
model = nobrainer.models.unet(n_classes=2).cuda()
optimizer = torch.optim.Adam(model.parameters(), lr=1e-4)
criterion = dice()
for epoch in range(50):
model.train()
for batch in loader:
images, labels = batch["image"].cuda(), batch["label"].cuda()
optimizer.zero_grad()
loss = criterion(model(images), labels)
loss.backward()
optimizer.step()
torch.save(model.state_dict(), "unet_trained.pth")
Automated research (autoresearch)
Nobrainer includes an automated hyperparameter search loop that uses an LLM to propose training modifications overnight:
nobrainer research run \
--working-dir ./research/bayesian_vnet \
--model-family bayesian_vnet \
--max-experiments 15 \
--budget-hours 8
Improved models are versioned via DataLad:
nobrainer research commit \
--run-dir ./research/bayesian_vnet \
--trained-models-path ~/trained-models \
--model-family bayesian_vnet
GPU test dispatch (nobrainer-runner)
nobrainer-runner submits GPU test suites to Slurm clusters or cloud instances (AWS Batch, GCP Batch):
nobrainer-runner submit --profile mycluster --gpus 1 "pytest tests/ -m gpu"
nobrainer-runner status $JOB_ID
nobrainer-runner results --format json $JOB_ID
Package layout
nobrainer.models— segmentation, Bayesian, and generativetorch.nn.Modulemodelsnobrainer.losses— Dice, Jaccard, Tversky, ELBO, Wasserstein (MONAI-backed)nobrainer.metrics— Dice, Jaccard, Hausdorff (MONAI-backed)nobrainer.dataset— MONAICacheDataset+DataLoaderpipelinenobrainer.prediction— block-basedpredict()andpredict_with_uncertainty()nobrainer.io—convert_tfrecords(),convert_weights()(TF → PyTorch migration)nobrainer.layers— dropout layers, Bayesian layers, MaxPool4Dnobrainer.research— autoresearch loop and DataLad model versioningnobrainer.cli— Click CLI (predict,generate,research,commit,info)
Development and releases
Nobrainer uses a two-branch release workflow:
| Branch | Purpose | PyPI version |
|---|---|---|
master |
Stable releases | uv pip install nobrainer |
alpha |
Pre-releases for testing | uv pip install --pre nobrainer |
Alpha workflow: Feature branches merge to alpha. Each merge triggers
book tutorial validation (using a matching branch on
nobrainer-book if available,
otherwise the book's alpha branch) followed by an automatic pre-release
tag (e.g., 0.5.0-alpha.0).
Stable workflow: When alpha is merged to master with the release
label, a stable version is tagged and published to PyPI.
GPU CI: PRs to master can request GPU testing on EC2 by adding the
gpu-test-approved label. Instance type and spot pricing are configurable
via gpu-instance:<type> and gpu-spot:true labels.
Citation
If you use this package, please cite it.
Questions or issues
Please submit a GitHub issue.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nobrainer-2.0.0a12.tar.gz.
File metadata
- Download URL: nobrainer-2.0.0a12.tar.gz
- Upload date:
- Size: 181.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
80694b38bcbe277a90ba5b99afb46137b925f308d1607d97caa20b8755a86e8f
|
|
| MD5 |
0274a5ab22beb886a539a200db5246d3
|
|
| BLAKE2b-256 |
2285a37c0659c8e9add94d3317007cdee9a46f5239c66f46118110b933d5e207
|
File details
Details for the file nobrainer-2.0.0a12-py3-none-any.whl.
File metadata
- Download URL: nobrainer-2.0.0a12-py3-none-any.whl
- Upload date:
- Size: 182.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
64802be002530ab6138a5de56ba463bda993fee3d9d44ba026044ce0f6125f21
|
|
| MD5 |
cdbb3e1ed14424d5f11d147b89919c21
|
|
| BLAKE2b-256 |
63abf7a86b8cb21cc74b4873eda2a89335c1d98ea0522858e7a1604d074e4f96
|