cyd0806's picture
Document batched waterz evaluation
d497c1e verified
|
Raw
History Blame Contribute Delete
6.13 kB
---
library_name: pytorch
pipeline_tag: image-segmentation
tags:
- neuron-segmentation
- electron-microscopy
- cremi
- unetr
- masked-image-modeling
- self-supervised-learning
license: other
---
# dbMiM Neuron Segmentation
[中文](README_zh.md) | [GitHub code](https://github.com/ydchen0806/dbMiM)
Official implementation for dbMiM pretraining and CREMI neuron segmentation.
The maintained workflow is:
1. prepare unlabeled EM volumes for self-supervised pretraining;
2. run dbMiM / MAE-style masked-image pretraining;
3. finetune an anisotropic 3D UNETR affinity model on CREMI;
4. evaluate full CREMI A/B/C volumes with VOI and adapted Rand error (ARAND);
5. decode instances with the reference waterz post-processing backend.
Learnable / differentiable post-processing is developed separately at
https://github.com/ydchen0806/nnEM-Seg-diff-postprocess.
## Method
The segmentation model is `UNETRAnisotropicAffinityNet`.
- Input crop: `32 x 160 x 160`
- Patch size: `(4, 16, 16)`
- Output: z/y/x nearest-neighbor affinity logits
- Backbone: ViT encoder initialized from dbMiM pretraining
- Decoder: UNETR-style staged upsampling with an anisotropic z transition
- Finetuning loss: MSE + membrane-aware spatial weighting (MAWS)
- Evaluation: full-volume CREMI A/B/C inference, `ignore_label=0`, boundary ignore `xy=1, z=0`
dbMiM pretraining masks 3D ViT patches and reconstructs EM voxels with
membrane-aware weighting and a lightweight structure-consistency term. Plain MAE
controls use the same data, model size, crop size, mask ratio, and schedule with
the dbMiM-specific terms disabled.
## Results
Lower is better for both VOI and ARAND.
| Run | Checkpoint | VOI | ARAND | Note |
|---|---|---:|---:|---|
| R48 | `weights/publicem_dbmim_r48_seed309_long20k/finetuned_latest.pt` | **0.962154** | 0.178252 | Best VOI |
| R57 | `weights/publicem_dbmim_r57_seed777_long20k/finetuned_latest.pt` | 0.964617 | **0.178248** | Best ARAND in repeat sweep |
| R33 | `weights/fullem_mixedmask_dbmim_r33/finetuned_latest.pt` | 1.039372 | 0.205380 | Best fullEM recipe |
Validation is run on public labeled CREMI A/B/C training volumes, not hidden
challenge labels.
## Weights
Weights are hosted on Hugging Face:
https://huggingface.co/cyd0806/dbmim-neuron-segmentation
| File | Use |
|---|---|
| `weights/publicem_dbmim_r48_seed309_long20k/finetuned_latest.pt` | Recommended segmentation checkpoint |
| `weights/publicem_dbmim_r57_seed777_long20k/finetuned_latest.pt` | ARAND-best repeat checkpoint |
| `weights/publicem_dbmim_r17/pretrained_latest.pt` | PublicEM dbMiM encoder pretraining checkpoint |
| `weights/publicem_dbmim_r17/finetuned_latest.pt` | Earlier publicEM finetuned checkpoint |
| `weights/fullem_mixedmask_dbmim_r33/pretrained_latest.pt` | FullEM mixed-mask pretraining checkpoint |
| `weights/fullem_mixedmask_dbmim_r33/finetuned_latest.pt` | FullEM mixed-mask finetuned checkpoint |
Download example:
```python
from huggingface_hub import snapshot_download
snapshot_download(
repo_id="cyd0806/dbmim-neuron-segmentation",
local_dir="weights/dbmim-neuron-segmentation",
)
```
## Setup
```bash
git clone https://github.com/ydchen0806/dbMiM.git
cd dbMiM
python -m pip install -r requirements-dbMIM.txt
```
The waterz reference backend is optional for training but required for the
reported instance-segmentation metrics.
## Data
CREMI finetuning/evaluation expects the public CREMI 2016 training files under:
```text
data/CREMI/sample_A_20160501.hdf
data/CREMI/sample_B_20160501.hdf
data/CREMI/sample_C_20160501.hdf
```
Prepare public EM pretraining data:
```bash
python scripts/prepare_public_em_pretrain_data.py \
--target-dir data/EM_pretrain_data
```
Prepare the larger fullEM pretraining set:
```bash
HF_TOKEN=<your_token> python scripts/prepare_em_pretrain_data.py \
--target-dir data/EM_pretrain_data
```
## Pretraining
PublicEM dbMiM pretraining:
```bash
python train_pretrain.py \
--config configs/pretrain_public_em_membrane_r16.yaml
```
FullEM mixed-mask pretraining:
```bash
python train_pretrain.py \
--config configs/pretrain_em_full_mixedmask_dbmim_r33.yaml
```
## Finetuning
Recommended R48 finetuning recipe:
```bash
python train_finetune.py \
--config configs/finetune_cremi_real_unetr_aniso_em_mse_maws_publicem_r16_seed309_long20k_r48q.yaml
```
The config points to the pretrained encoder checkpoint. Update the path if the
weights are stored outside `outputs/`.
## Evaluation
Run full-volume CREMI A/B/C waterz evaluation:
```bash
python scripts/evaluate_cremi_segmentation.py \
--config configs/finetune_cremi_real_unetr_aniso_em_mse_maws_publicem_r16_seed309_long20k_r48q.yaml \
--checkpoint outputs/finetune_cremi_real_unetr_aniso_em_mse_maws_publicem_r16_seed309_long20k_r48q/finetuned_latest.pt \
--data-dir data/CREMI \
--output-dir outputs/eval_r48_cremi_abc \
--crop-size 0 0 0 \
--stride 16 80 80 \
--backends waterz \
--thresholds 0.16 0.18 0.20 0.22 0.24 \
--calibration-biases -0.25 -0.50 -0.50 \
--seed-method maxima_distance \
--seed-distance 10 \
--boundary-threshold 0.5 \
--waterz-scoring hist_quantile \
--batched-waterz \
--metric-backend skimage \
--ignore-label 0 \
--cremi-boundary-ignore-distance-xy 1 \
--cremi-boundary-ignore-distance-z 0 \
--device cuda
```
`--batched-waterz` evaluates all waterz thresholds for each affinity variant in
one waterz hierarchy pass. It keeps the reported R48 VOI unchanged
(`0.962154`) and reduces threshold-sweep post-processing time from about
`75s` to about `17s` on CREMI A/B/C.
The summary is written to:
```text
outputs/eval_r48_cremi_abc/cremi_segmentation_summary.json
```
## Repository Layout
```text
dbmim/ Models, datasets, metrics, utilities
configs/ Pretraining and finetuning configs
scripts/prepare_*_data.py Data preparation
scripts/evaluate_*.py CREMI evaluation
train_pretrain.py dbMiM / MAE pretraining
train_finetune.py CREMI affinity finetuning
```
Large datasets, checkpoints, and generated outputs are not tracked in Git.