Lucchi++ (Semantic Segmentation)¶
Mitochondria are the primary energy providers for cell activities. Quantification of their size and geometry is important to basic neuroscience and to clinical studies of diseases including bipolar disorder and diabetes.
This section covers two benchmarks:
Lucchi++ — the small isotropic Lucchi et al. benchmark, used as a pixel-wise semantic segmentation task.
MitoEM — the large-scale Wei et al. benchmark for instance segmentation of individual mitochondrion masks.
This tutorial reproduces binary mitochondria segmentation on the Lucchi++
EM benchmark using tutorials/mito_lucchi++.yaml. The task is treated
as semantic segmentation — predict the mitochondria foreground mask
with an encoder-decoder network. Evaluation is the Jaccard / IoU score.
The dataset was released by Lucchi et al. and is isotropic at 5 nm across all three axes, so the recipe uses a fully-3D MedNeXt with isotropic 112³ patches.
Goal¶
The pipeline pins the following setup:
Input
[112, 112, 112]patches, isotropic 5 × 5 × 5 nm.Model MedNeXt-S, kernel size 3, 3D, no deep supervision.
Pipeline
pipeline_profile: binary(single foreground channel).Dataloader cached profile, batch size 8,
aug_strongaugmentation profile.Optimization
warmup_cosine_lrprofile, AdamW @lr=1e-3,weight_decay=0.01, 150 epochs × 1000 steps,precision=16-mixed, gradient clip 1.0.Inference sliding window 112³ with 50 % overlap, bump blending,
sw_batch_size=8, TTA enabled with all-axis flips.Metric
jaccard.
Each of these is encoded directly in tutorials/mito_lucchi++.yaml;
do not change them in passing.
1 - Get the data¶
Lucchi++ is the relabeled version of the original Lucchi 2012 dataset released by Casser et al.; download from the EPFL CVLab page or your local mirror. After unpacking you should have HDF5 volumes:
datasets/lucchi++/
train_im.h5
train_mito.h5
test_im.h5
test_mito.h5
The config reads from datasets/lucchi++/ relative to the repo
root. Edit the train.data.train and test.data.test blocks in
tutorials/mito_lucchi++.yaml if you stage data elsewhere.
For the upstream description see the EPFL CVLab page.
2 - Run training¶
conda activate pytc
python scripts/main.py --config tutorials/mito_lucchi++.yaml
The config sets system.profile: all-gpu-cpu, so PyTC fans out
across every visible GPU. Override at the CLI if needed:
python scripts/main.py --config tutorials/mito_lucchi++.yaml \
system.num_gpus=4 data.dataloader.batch_size=4
Training schedule:
Epoch-based: 150 epochs × 1000 steps = 150 k optimizer steps.
warmup_cosine_lrprofile: linear warmup, then cosine decay.checkpoint.monitor=train_loss_total_epoch(no held-out validation split — Lucchi++ is small and the public test split is used for final reporting).Image previews logged every 10 epochs to TensorBoard.
Outputs land in outputs/mito_lucchi++/<timestamp>/ (the
save_path baked into train.monitor.checkpoint).
Monitor with TensorBoard:
just tensorboard mito_lucchi++
3 - Inference, decoding, evaluation¶
Run the combined test mode against the trained checkpoint:
python scripts/main.py --config tutorials/mito_lucchi++.yaml \
--mode test \
--checkpoint outputs/mito_lucchi++/<timestamp>/checkpoints/last.ckpt
What happens, in order:
Inference. Sliding window 112³ with 50 % overlap, bump blending,
sw_batch_size=8. TTA is on by default (flip_axes: all), so Lucchi++ is predicted with 8× flip augmentations averaged. Saves the raw foreground probability astest_im_prediction.h5inoutputs/mito_lucchi++/<timestamp>/results_step=<N>/.Decoding. The
binarypipeline profile keeps the probability map without further post-processing (foreground mask is thresholded inside evaluation).Evaluation. Jaccard / IoU against
datasets/lucchi++/test_mito.h5; the result is written next to the prediction.
To disable TTA (faster but slightly weaker), override:
python scripts/main.py --config tutorials/mito_lucchi++.yaml \
--mode test --checkpoint <ckpt> \
inference.test_time_augmentation.enabled=false
4 - Reference behavior¶
A few sanity-check signals:
Training loss drops sharply through the warmup (~5 epochs), then descends slowly through cosine decay. With MedNeXt-S on 112³ isotropic patches the loss usually plateaus after epoch ~80.
Inference is fast on Lucchi++ (165 × 1024 × 768 test volume) with TTA: tens of seconds on an A100/H100, low single-digit minutes on an L40S.
Jaccard / IoU lands in the same ballpark as the published benchmarks for this dataset; the dominant lever beyond training duration is whether TTA is enabled.
For a multi-task variant that adds a signed distance transform head,
see the sibling configs under tutorials/ (mito_betaseg.yaml and
mito_betaseg_banis_v{0,1,2}.yaml use this style on a different
dataset).