This is the official implementation of YADO, a denoiser for real-world brain MR images, as described in the paper: Rethinking Real-World MRI Denoising: Learning from Physical Noise (preprint, to be presented at ECCV 2026).
Our main contributions are:
- We introduce, physical Noise2Noise (pN2N) training leveraing real pairs of acquisition for denoiser training.
- We genenerlize pN2N to single-noisy datasets via generating pairs from a re-noising (ReN) diffusion model, introducing as ReN2N.
- We introduce guidance (g) from co-acquired contrasts to improve denoising performance.
YADO shows SOTA performance over 17 baselines in a comprehensive (14 test conditions, T1w/T2w/FLAIR, >650 participants) evaluation on real-world brain MR images.
This code heavily builds on YODA and uses the MONAI framework.
The weights are available at zenodo.
YADO denoiser model zoo
| Checkpoint | Denoised Contrast |
Resolution | Training Dataset |
Guidance Contrast(s) |
Comment |
|---|---|---|---|---|---|
| oasis_t1w_1p0_g-pN2N | T1w | 1.0 mm | OASIS-3 | T2w | - |
| oasis_t1w_1p0_u-pN2N | T1w | 1.0 mm | OASIS-3 | - | - |
| oasis_t1w_1p0_g-ReN2N | T1w | 1.0 mm | OASIS-3 (ReN) | T2w | - |
| oasis_t1w_1p0_u-ReN2N | T1w | 1.0 mm | OASIS-3 (ReN) | - | - |
| hcp_t1w_0p8_g-pN2N | T1w | 0.8 mm | HCP | T2w | - |
| hcp_t1w_0p8_u-pN2N | T1w | 0.8 mm | HCP | - | - |
| hcp_t1w_0p8_g-ReN2N | T1w | 0.8 mm | HCP (ReN) | T2w | - |
| hcp_t1w_0p8_u-ReN2N | T1w | 0.8 mm | HCP (ReN) | - | - |
| rs_t2w_0p8_g-pN2N | T2w | 0.8 mm | RS | T1w | - |
| rs_t2w_0p8_u-pN2N | T2w | 0.8 mm | RS | - | - |
| rs_t2w_0p8_g-ReN2N | T2w | 0.8 mm | RS (ReN) | T1w | - |
| rs_t2w_0p8_g-ReN2N+unpaired | T2w | 0.8 mm | RS (ReN) | T1w | 300 additional ReN images |
| rs_t2w_0p8_u-ReN2N | T2w | 0.8 mm | RS (ReN) | - | - |
| rs_flair_0p8_g-pN2N | FLAIR | 0.8 mm | RS | T1w,T2w | - |
| rs_flair_0p8_u-pN2N | FLAIR | 0.8 mm | RS | - | - |
| rs_flair_0p8_g-ReN2N | FLAIR | 0.8 mm | RS (ReN) | T1w,T2w | - |
| rs_flair_0p8_u-ReN2N | FLAIR | 0.8 mm | RS (ReN) | - | - |
YODA Renoiser (ReN) model zoo
| Checkpoint | Denoised Contrast |
Resolution | Training Dataset |
Guidance Contrast(s) |
Comment |
|---|---|---|---|---|---|
| rs_t1w_0p8_ReN | T1w | 0.8 mm | RS | T2w | - |
| rs_t1w_1p0_ReN | T1w | 1.0 mm | RS | T2w | - |
| rs_t1w_1p0_uReN | T1w | 1.0 mm | RS | - | - |
| rs_t2w_0p8_ReN | T2w | 0.8 mm | RS | T1w | - |
| rs_flair_0p8_ReN | FLAIR | 0.8 mm | RS | T1w,T2w | - |
From the repo root, run single-subject denoising with the wrapper.py entrypoint (it will scale the input intensities and run prediction):
python wrapper.py \
-r output/<RUN_NAME> \
-c ckpt/last.pth \
-o /path/to/save/pred.nii.gz \
/path/to/noisy.nii.gz /path/to/guidance_1.nii.gz /path/to/guidance_2.nii.gz \
--mask /path/to/mask.nii.gzNotes:
-rmust point to a run folder that containsconfig.ymlandckpt/last.pth(or manually define with-cflag).- Input order matters: for YADO it’s (denoised sequence) first, then guidance sequences alphabetically (must match
config.data.guidance_sequences).- (if used), the
guidancemust be registered to the noisy target image (preferably with FreeSurfer'sbbregister, faster but experimental:neuroreg)
- (if used), the
--maskis optional; if omitted, the wrapper builds a dummy center mask based onconfig.data.img_size.
See also YODA for an exemplary, easy-to-run single-command setup script on the RS (using docker or apptainer/singularity).
Note that YADO, per default, crops to the center/brain mask of the images and only outputs the predicted region. Thus, the output might have a different shape than in the input, which is accounted for the nifti header (i.e. in reasonable viewers like Freeview the prediction will be at the right location).
Also, YADO is trained to run on any (cubic interpolated) image in arbitrary spaces. Thus, it makes sense to YADO denoise the images in the final space of interest (e.g. LIA conform for FreeSurfer/FastSurfer) to avoid additional interpolation steps after denoising.
We provide pre-build docker and singularity images.
See requirements.txt to build your own environment.
Training uses the same general dataset-json + config-driven training setup as inference.
torchrun --nproc_per_node 8 train/train_yado.py -n <RUN_NAME> \
<CONFIG.yml> --data.batch_size 6 --trainer.gradient_accumulation_steps 2 # more --argsThe default config defining all options is provided in configs/regression/defaults.yml.
A conceptual dataset JSON (both training and batch inference) is provided in [example_ds.json](configs/example_ds.json).
See YODA for details on (regular) batch inference.
See bash/oasis_t1_gYADO.sh, bash/hcp_t1_uYADO_ME-mprage.sh, ... for example training scripts.
Expected dataset JSON / keys (as in the script):
target_sequence: "t1_tar"guidance_sequences: ["t1_src", "t2"]
Renoiser training is similar to the above, but with a different entrypoint and config:
torchrun --nproc_per_node 8 train/train_dm.py -n <RUN_NAME> \
<CONFIG.yml> --data.batch_size 6 --trainer.gradient_accumulation_steps 2The default config defining all options is provided in configs/dm/defaults.yml.
See bash/rs_t1_renoising_dm.sh for an example training script.
Inference can be parallelized via e.g. SLURM as demonstrated in bash/ReN_inference_oasis.sh.
Main YADO paper:
@inproceedings{rassmann2026rethinking,
title={{R}ethinking {R}eal-{W}orld {MRI} {D}enoising: {L}earning from {P}hysical {N}oise},
author={Rassmann, Sebastian and K{\"u}gler, David and Brunheim, Sascha and Ehses Philipp and Reuter, Martin},
booktitle={ECCV},
year={2026}
}YODA paper:
@article{rassmann2026regression,
title={Regression is all you need for {M}edical {I}mage {T}ranslation},
author={Rassmann, Sebastian and K{\"u}gler, David and Ewert, Christian and Reuter, Martin},
journal={IEEE Transactions on Medical Imaging},
year={2026},
publisher={IEEE}
}