Add FORCE-Interior and baseline checkpoints
Browse files- README.md +110 -0
- checkpoints/dds_pretrained/lodochallenge_pixel_diffusion/README.md +90 -0
- checkpoints/dds_pretrained/lodochallenge_pixel_diffusion/model_index.json +12 -0
- checkpoints/dds_pretrained/lodochallenge_pixel_diffusion/scheduler/scheduler_config.json +19 -0
- checkpoints/dds_pretrained/lodochallenge_pixel_diffusion/unet/config.json +53 -0
- checkpoints/dds_pretrained/lodochallenge_pixel_diffusion/unet/diffusion_pytorch_model.safetensors +3 -0
- checkpoints/drunet/drunet_mayo.pth +3 -0
- checkpoints/model_028.pth +3 -0
- checkpoints/roi_ct_cnn/net-epoch-200.pth +3 -0
README.md
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
license: cc-by-nc-4.0
|
| 3 |
+
library_name: pytorch
|
| 4 |
+
pipeline_tag: image-to-image
|
| 5 |
+
tags:
|
| 6 |
+
- computed-tomography
|
| 7 |
+
- interior-tomography
|
| 8 |
+
- ct-reconstruction
|
| 9 |
+
- pfgm++
|
| 10 |
+
- diffusion-model
|
| 11 |
+
- medical-imaging
|
| 12 |
+
---
|
| 13 |
+
|
| 14 |
+
# FORCE-Interior checkpoints
|
| 15 |
+
|
| 16 |
+
Pretrained weights for **FORCE-Interior: Measurement-Consistent Adaptation of a
|
| 17 |
+
Poisson-Flow Generative Prior for Interior CT**, together with the learned baselines
|
| 18 |
+
it is compared against.
|
| 19 |
+
|
| 20 |
+
Code: <https://github.com/Peteroos/FORCE-Interior>
|
| 21 |
+
|
| 22 |
+
## Files
|
| 23 |
+
|
| 24 |
+
| Path | Size | Model | Used by |
|
| 25 |
+
|---|---|---|---|
|
| 26 |
+
| `checkpoints/model_028.pth` | 2.3 GB | PFGM++ prior of FORCE-Interior | `run_force.py` |
|
| 27 |
+
| `checkpoints/roi_ct_cnn/net-epoch-200.pth` | 62 MB | ROI-CT-CNN U-Net | `run_roicnn.py` |
|
| 28 |
+
| `checkpoints/dds_pretrained/lodochallenge_pixel_diffusion/` | 455 MB | DDS pixel-diffusion prior (third-party, mirrored) | `run_dds.py` |
|
| 29 |
+
| `checkpoints/drunet/drunet_mayo.pth` | 131 MB | DRUNet denoiser for the PnP-ADMM / PnP-HQS baselines | PnP baselines |
|
| 30 |
+
|
| 31 |
+
## Download
|
| 32 |
+
|
| 33 |
+
This repository mirrors the `checkpoints/` layout that `config.py` expects. Download
|
| 34 |
+
it into the root of the code repository. Keep `--include`; without it this model
|
| 35 |
+
card overwrites the code repository's `README.md`.
|
| 36 |
+
|
| 37 |
+
```bash
|
| 38 |
+
git clone https://github.com/Peteroos/FORCE-Interior.git
|
| 39 |
+
cd FORCE-Interior
|
| 40 |
+
hf download Peteroos/FORCE-Interior --include "checkpoints/*" --local-dir .
|
| 41 |
+
```
|
| 42 |
+
|
| 43 |
+
## Model details
|
| 44 |
+
|
| 45 |
+
### PFGM++ prior — `checkpoints/model_028.pth`
|
| 46 |
+
|
| 47 |
+
- Unconditional PFGM++ prior on 512 × 512 full-dose CT slices from 8 patients of the
|
| 48 |
+
2016 AAPM/Mayo Low Dose CT Grand Challenge: L067, L096, L109, L143, L192, L286,
|
| 49 |
+
L291, L310. The test patients L333 and L506 were not used for training.
|
| 50 |
+
- Pixel domain: HU clipped to [-1024, 3071] and mapped linearly to [-1, 1].
|
| 51 |
+
- Architecture: the U-Net in `model/` with `num_res_blocks=3`,
|
| 52 |
+
`channel_mult=1,2,4,8,16` (290 M parameters).
|
| 53 |
+
- Contents: `{"model": state_dict, "ema": [tensors in model.parameters() order]}`.
|
| 54 |
+
Sample with the **EMA** weights; `load_checkpoint()` in `run_force.py` does this.
|
| 55 |
+
|
| 56 |
+
### ROI-CT-CNN — `checkpoints/roi_ct_cnn/net-epoch-200.pth`
|
| 57 |
+
|
| 58 |
+
- U-Net post-processing of the truncated FBP (Han & Ye, *Med. Phys.* 2019),
|
| 59 |
+
trained by us on full-dose Mayo CT at an ROI radius of 128 px for 200 epochs.
|
| 60 |
+
- Network: `baselines/roi_ct_cnn/unet.py` (`net_type="type1"`, 64 base channels);
|
| 61 |
+
attenuation is scaled so that water = 1.0.
|
| 62 |
+
- Contents: `{"state_dict", "opt", "epoch", "net_type"}`.
|
| 63 |
+
- The training/validation patient split of this checkpoint was not recorded.
|
| 64 |
+
|
| 65 |
+
### DDS prior — `checkpoints/dds_pretrained/lodochallenge_pixel_diffusion/`
|
| 66 |
+
|
| 67 |
+
- Unmodified copy of
|
| 68 |
+
[`jiayangshi/lodochallenge_pixel_diffusion`](https://huggingface.co/jiayangshi/lodochallenge_pixel_diffusion)
|
| 69 |
+
(revision `b7e291c2`, sha256 of the U-Net weights verified), released under the MIT
|
| 70 |
+
license with [DM4CT](https://github.com/DM4CT/DM4CT) (ICLR 2026). It is mirrored
|
| 71 |
+
here only so that all baselines can be fetched from one place; the upstream model
|
| 72 |
+
card is kept in the folder. Please cite DM4CT when using it.
|
| 73 |
+
- According to the DM4CT split, L333 is in this prior's training set and L506 in
|
| 74 |
+
its test set.
|
| 75 |
+
- Intensity normalisation used by our adapter: `baselines/dds/dm4ct_norm.json`.
|
| 76 |
+
|
| 77 |
+
### DRUNet — `checkpoints/drunet/drunet_mayo.pth`
|
| 78 |
+
|
| 79 |
+
- DRUNet (Zhang et al., DPIR, *TPAMI* 2021) with a noise-level map as second input;
|
| 80 |
+
channels (64, 128, 256, 512), 4 residual blocks per level, 32.6 M parameters.
|
| 81 |
+
- Trained on 1369 full-dose slices from 6 patients (L109, L143, L192, L286, L291,
|
| 82 |
+
L310). The validation patients (L067, L096) and test patients (L333, L506) were
|
| 83 |
+
excluded.
|
| 84 |
+
- Same [-1, 1] pixel domain as the PFGM++ prior; additive Gaussian noise with
|
| 85 |
+
σ ~ U[0, 0.08] (0–164 HU); 30 000 iterations.
|
| 86 |
+
- Contents: `{"state_dict", "iters", "patients", "sigma_max"}`.
|
| 87 |
+
|
| 88 |
+
## Training data
|
| 89 |
+
|
| 90 |
+
All models were trained on the 2016 AAPM/Mayo Low Dose CT Grand Challenge data.
|
| 91 |
+
No CT images or data derived from them are distributed in this repository.
|
| 92 |
+
|
| 93 |
+
## License
|
| 94 |
+
|
| 95 |
+
The PFGM++ prior, ROI-CT-CNN and DRUNet weights are released under
|
| 96 |
+
[CC BY-NC 4.0](https://creativecommons.org/licenses/by-nc/4.0/). The mirrored DDS prior in
|
| 97 |
+
`checkpoints/dds_pretrained/` keeps its upstream MIT license.
|
| 98 |
+
|
| 99 |
+
## Citation
|
| 100 |
+
|
| 101 |
+
```bibtex
|
| 102 |
+
@article{chen2026forceinterior,
|
| 103 |
+
title = {{FORCE-Interior}: Measurement-Consistent Adaptation of a Poisson-Flow
|
| 104 |
+
Generative Prior for Interior {CT}},
|
| 105 |
+
author = {Chen, Kang and Xia, Wenjun and Wang, Jianxu and Nafee, Mahmud Wasif
|
| 106 |
+
and Wang, Ge},
|
| 107 |
+
note = {Manuscript under review},
|
| 108 |
+
year = {2026}
|
| 109 |
+
}
|
| 110 |
+
```
|
checkpoints/dds_pretrained/lodochallenge_pixel_diffusion/README.md
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
library_name: diffusers
|
| 3 |
+
license: mit
|
| 4 |
+
pipeline_tag: image-to-image
|
| 5 |
+
tags:
|
| 6 |
+
- computed-tomography
|
| 7 |
+
- ct-reconstruction
|
| 8 |
+
- diffusion-model
|
| 9 |
+
- inverse-problems
|
| 10 |
+
- dm4ct
|
| 11 |
+
- sparse-view-ct
|
| 12 |
+
---
|
| 13 |
+
|
| 14 |
+
# Pixel Diffusion UNet – LoDoChallenge (DM4CT)
|
| 15 |
+
|
| 16 |
+
This repository contains the pretrained **pixel-space diffusion UNet** presented in the paper [DM4CT: Benchmarking Diffusion Models for Computed Tomography Reconstruction](https://huggingface.co/papers/2602.18589) (ICLR 2026).
|
| 17 |
+
|
| 18 |
+
- **Project Page:** [https://dm4ct.github.io/DM4CT/](https://dm4ct.github.io/DM4CT/)
|
| 19 |
+
- **Codebase:** [https://github.com/DM4CT/DM4CT](https://github.com/DM4CT/DM4CT)
|
| 20 |
+
- **Paper:** [DM4CT: Benchmarking Diffusion Models for Computed Tomography Reconstruction](https://huggingface.co/papers/2602.18589)
|
| 21 |
+
|
| 22 |
+
---
|
| 23 |
+
|
| 24 |
+
## 🔬 Model Overview
|
| 25 |
+
|
| 26 |
+
This model learns a **prior over CT reconstruction images** using a denoising diffusion probabilistic model (DDPM). It operates directly in **pixel space** (not latent space).
|
| 27 |
+
|
| 28 |
+
- **Architecture**: 2D UNet (Diffusers `UNet2DModel`)
|
| 29 |
+
- **Input resolution**: 512 × 512
|
| 30 |
+
- **Channels**: 1 (grayscale CT slice)
|
| 31 |
+
- **Training objective**: ε-prediction (standard DDPM formulation)
|
| 32 |
+
- **Noise schedule**: Linear beta schedule
|
| 33 |
+
- **Training dataset**: Low Dose Grand Challenge (LoDoChallenge)
|
| 34 |
+
- **Intensity normalization**: Rescaled to (-1, 1)
|
| 35 |
+
|
| 36 |
+
This model is intended to be combined with data-consistency correction for CT reconstruction tasks as detailed in the DM4CT benchmark.
|
| 37 |
+
|
| 38 |
+
---
|
| 39 |
+
|
| 40 |
+
## 📊 Dataset: Low Dose Grand Challenge
|
| 41 |
+
|
| 42 |
+
Source: [AAPM Low Dose CT Grand Challenge](https://www.aapm.org/grandchallenge/lowdosect/)
|
| 43 |
+
|
| 44 |
+
Preprocessing steps:
|
| 45 |
+
- Train/test split.
|
| 46 |
+
- Rescale reconstructed slices to (-1, 1).
|
| 47 |
+
- No geometry information is embedded in the model.
|
| 48 |
+
|
| 49 |
+
The model learns an unconditional image prior over medical CT slices.
|
| 50 |
+
|
| 51 |
+
---
|
| 52 |
+
|
| 53 |
+
## 🧠 Training Details
|
| 54 |
+
|
| 55 |
+
- **Optimizer**: AdamW
|
| 56 |
+
- **Learning rate**: 1e-4
|
| 57 |
+
- **Hardware**: NVIDIA A100 GPU
|
| 58 |
+
- **Training script**: [train_pixel.py](https://github.com/DM4CT/DM4CT/blob/main/train_pixel.py)
|
| 59 |
+
|
| 60 |
+
---
|
| 61 |
+
|
| 62 |
+
## 🚀 Usage
|
| 63 |
+
|
| 64 |
+
You can use this model with the `diffusers` library:
|
| 65 |
+
|
| 66 |
+
```python
|
| 67 |
+
from diffusers import DDPMPipeline
|
| 68 |
+
|
| 69 |
+
# Load the pretrained pipeline
|
| 70 |
+
pipeline = DDPMPipeline.from_pretrained("jiayangshi/lodochallenge_pixel_diffusion")
|
| 71 |
+
|
| 72 |
+
# Generate a sample (unconditional CT slice prior)
|
| 73 |
+
image = pipeline().images[0]
|
| 74 |
+
image.save("generated_ct_slice.png")
|
| 75 |
+
```
|
| 76 |
+
|
| 77 |
+
---
|
| 78 |
+
|
| 79 |
+
## Citation
|
| 80 |
+
|
| 81 |
+
```bibtex
|
| 82 |
+
@inproceedings{
|
| 83 |
+
shi2026dmct,
|
| 84 |
+
title={{DM}4{CT}: Benchmarking Diffusion Models for Computed Tomography Reconstruction},
|
| 85 |
+
author={Shi, Jiayang and Pelt, Dani{\"e}l M and Batenburg, K Joost},
|
| 86 |
+
booktitle={The Fourteenth International Conference on Learning Representations},
|
| 87 |
+
year={2026},
|
| 88 |
+
url={https://openreview.net/forum?id=YE5scJekg5}
|
| 89 |
+
}
|
| 90 |
+
```
|
checkpoints/dds_pretrained/lodochallenge_pixel_diffusion/model_index.json
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"_class_name": "DDPMPipeline",
|
| 3 |
+
"_diffusers_version": "0.32.2",
|
| 4 |
+
"scheduler": [
|
| 5 |
+
"diffusers",
|
| 6 |
+
"DDPMScheduler"
|
| 7 |
+
],
|
| 8 |
+
"unet": [
|
| 9 |
+
"diffusers",
|
| 10 |
+
"UNet2DModel"
|
| 11 |
+
]
|
| 12 |
+
}
|
checkpoints/dds_pretrained/lodochallenge_pixel_diffusion/scheduler/scheduler_config.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"_class_name": "DDPMScheduler",
|
| 3 |
+
"_diffusers_version": "0.32.2",
|
| 4 |
+
"beta_end": 0.02,
|
| 5 |
+
"beta_schedule": "linear",
|
| 6 |
+
"beta_start": 0.0001,
|
| 7 |
+
"clip_sample": true,
|
| 8 |
+
"clip_sample_range": 1.0,
|
| 9 |
+
"dynamic_thresholding_ratio": 0.995,
|
| 10 |
+
"num_train_timesteps": 1000,
|
| 11 |
+
"prediction_type": "epsilon",
|
| 12 |
+
"rescale_betas_zero_snr": false,
|
| 13 |
+
"sample_max_value": 1.0,
|
| 14 |
+
"steps_offset": 0,
|
| 15 |
+
"thresholding": false,
|
| 16 |
+
"timestep_spacing": "leading",
|
| 17 |
+
"trained_betas": null,
|
| 18 |
+
"variance_type": "fixed_small"
|
| 19 |
+
}
|
checkpoints/dds_pretrained/lodochallenge_pixel_diffusion/unet/config.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"_class_name": "UNet2DModel",
|
| 3 |
+
"_diffusers_version": "0.32.2",
|
| 4 |
+
"_name_or_path": "trained/lodochallenge/ddpm/unet",
|
| 5 |
+
"act_fn": "silu",
|
| 6 |
+
"add_attention": true,
|
| 7 |
+
"attention_head_dim": 8,
|
| 8 |
+
"attn_norm_num_groups": null,
|
| 9 |
+
"block_out_channels": [
|
| 10 |
+
128,
|
| 11 |
+
128,
|
| 12 |
+
256,
|
| 13 |
+
256,
|
| 14 |
+
512,
|
| 15 |
+
512
|
| 16 |
+
],
|
| 17 |
+
"center_input_sample": false,
|
| 18 |
+
"class_embed_type": null,
|
| 19 |
+
"down_block_types": [
|
| 20 |
+
"DownBlock2D",
|
| 21 |
+
"DownBlock2D",
|
| 22 |
+
"DownBlock2D",
|
| 23 |
+
"DownBlock2D",
|
| 24 |
+
"AttnDownBlock2D",
|
| 25 |
+
"DownBlock2D"
|
| 26 |
+
],
|
| 27 |
+
"downsample_padding": 1,
|
| 28 |
+
"downsample_type": "conv",
|
| 29 |
+
"dropout": 0.0,
|
| 30 |
+
"flip_sin_to_cos": true,
|
| 31 |
+
"freq_shift": 0,
|
| 32 |
+
"in_channels": 1,
|
| 33 |
+
"layers_per_block": 2,
|
| 34 |
+
"mid_block_scale_factor": 1,
|
| 35 |
+
"norm_eps": 1e-05,
|
| 36 |
+
"norm_num_groups": 32,
|
| 37 |
+
"num_class_embeds": null,
|
| 38 |
+
"num_train_timesteps": null,
|
| 39 |
+
"out_channels": 1,
|
| 40 |
+
"resnet_time_scale_shift": "default",
|
| 41 |
+
"sample_size": 512,
|
| 42 |
+
"time_embedding_dim": null,
|
| 43 |
+
"time_embedding_type": "positional",
|
| 44 |
+
"up_block_types": [
|
| 45 |
+
"UpBlock2D",
|
| 46 |
+
"AttnUpBlock2D",
|
| 47 |
+
"UpBlock2D",
|
| 48 |
+
"UpBlock2D",
|
| 49 |
+
"UpBlock2D",
|
| 50 |
+
"UpBlock2D"
|
| 51 |
+
],
|
| 52 |
+
"upsample_type": "conv"
|
| 53 |
+
}
|
checkpoints/dds_pretrained/lodochallenge_pixel_diffusion/unet/diffusion_pytorch_model.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:12a59a05edcebd9121b522345d6d82cbf2135d8e3523e2ebc52937078e9e7e53
|
| 3 |
+
size 454722660
|
checkpoints/drunet/drunet_mayo.pth
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:c7e837c179cccedba4e3b2bd757a26432e09ea46fc91a30796721e359812d53f
|
| 3 |
+
size 130580966
|
checkpoints/model_028.pth
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:1e5aa073b5f47ed7272fbaa068997ce54bdc76032975e752c2b56831e40cd82d
|
| 3 |
+
size 2322797498
|
checkpoints/roi_ct_cnn/net-epoch-200.pth
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:09e1d39e0dbd5536eee569fa7d5eae57b65255edd1bfdfdbd94213efa8cbc7ff
|
| 3 |
+
size 61694514
|