Downloads · 30 days
0
zimmeryWo/MRI-sCT_converter-DoseRAD2026
MRI-sCT_converter-DoseRAD2026 is a machine learning model from zimmeryWo. Use it for the machine learning task on the model card, and read the license before you ship it in a product. The card lists the license as apache-2.0.
A 3D regression model that generates synthetic CT (sCT) from MR images, trained for the DoseRAD2026 Grand Challenge proton dose on MRI task. It is the front end of team DoseHappens's MRI submission: the sCT it produce…
Downloads · 30 days
0
Access
Public
Updated Sep 7, 2026
Repo size
817 MB
Likes
0
Public
Click a slice to open those files.
.pt409 MB · 100%
From the Hugging Face model README
A 3D regression model that generates synthetic CT (sCT) from MR images, trained for the DoseRAD2026 Grand Challenge proton dose on MRI task. It is the front end of team DoseHappens's MRI submission: the sCT it produces is what the protonand photon dose engine then computes on. The data was registered using the existing deformation of Boussot et al..
The model is trained with an nnUNet regression pipeline (3D full-resolution) and exported to TorchScript, so no nnUNet installation is required to run it. The training code is a modified fork of nnUNet.
The trainer is nnUNetTrainerRegression_impact: deep-supervision MAE with an added
feature-space regularization term against the source MR
(loss = MAE_deep + 0.1 · IMPACT(prediction, source)). It subclasses
nnUNetTrainerRegression_mae_deep, so the IMPACT term is added to the MAE loss rather than
replacing it. Both are in the fork linked above.
The dose engine and correction network that consume this sCT are in the challenge code repository: https://github.com/LFetty/doserad2026-maalgo
| File | Description |
|---|---|
mrtoct_bundle/model.pt | TorchScript compiled model (409 MB) |
mrtoct_bundle/metadata.json | Patch size, normalization stats, inference config |
standalone_regression_inference.py | Self-contained inference class |
model.pt is a TorchScript module exported with torch.jit.save() and must be loaded
with torch.jit.load(). The folder is named mrtoct_bundle/ so it drops straight into the
challenge container, which expects it at model_mri/mrtoct_bundle/.
torch
scipy
numpy
import numpy as np
from standalone_regression_inference import StandaloneRegressionInference
model = StandaloneRegressionInference(
model_path="mrtoct_bundle/",
device="cuda", # or "cpu"
inference_amp=True, # fp16 autocast for the network forwards
patch_batch_size=2, # patches per model call
)
# mr_volume: 3D numpy array, shape (D, H, W)
mr_volume = np.load("your_mr_volume.npy")
sct = np.asarray(model.predict(mr_volume)).squeeze()
sct = np.clip(sct, -1024, 3071) # see "Important" below
predict() handles internally:
predict() returns unclipped denormalized HU. The submitted pipeline clips to
[-1024, 3071] before the sCT is used for density/material conversion. Without that clip,
out-of-range predictions propagate into the dose calculation. The clip is applied outside
this class, so you must apply it yourself.
| Field | Value |
|---|---|
| Trainer | nnUNetTrainerRegression_impact |
| Loss | deep-supervision MAE + 0.1 × IMPACT feature loss |
| Dataset | Dataset038_DoseRAD2026_proton_MR_CT_regression |
| Configuration | 3d_fullres |
| Fold | all |
| Patch size | 48 × 192 × 192 |
| Tile step size | 0.5 (Gaussian blending) |
| Input normalization | Z-score, mean 35.569, std 77.806 |
| Output normalization | Global, mean −786.090, std 429.910 |
| Output range | −1024 to 3071 HU |
On the DoseRAD2026 MRI task the synthetic CT is the accuracy bottleneck, not the dose engine. Improvements that gave ~12.5% on the CT task returned only ~2% through the MRI path, which places the remaining error in the MR→sCT step rather than in dose computation. Body-region CT MAE measured on one held-out case during precision verification was ≈24.75 HU; this is a single-case figure from a precision comparison, not a validation study.
If you use this model, please cite the DoseRAD2026 challenge and link this repository.