File size: 4,438 Bytes
3ce3d41
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
---
license: other
license_name: mixed-see-readme
tags:
  - sparse-view-ct
  - cbct
  - ct-reconstruction
  - medical-imaging
  - deepsparse
---

# DeepSparse — 25-view finetuned checkpoints

Finetuned checkpoints of [DeepSparse](https://github.com/xmed-lab/DeepSparse) for **25-view (180°) sparse-view CT reconstruction** on four anatomies. All models start from the official pretrained weights (`pretrain/ep_700.pth` from [HajihajihaJimmy/DeepSparse](https://huggingface.co/HajihajihaJimmy/DeepSparse)) and use the official two-stage finetuning protocol.

The folder layout matches the official repo, so the checkpoints drop into the codebase's `logs/` directory.

## Results (official test splits, 256³, 3D PSNR / SSIM)

| Checkpoint | Train cases | Test cases | PSNR (dB) | SSIM (×10⁻²) |
|---|---|---|---|---|
| `pelvis+25v+n250+s2` (PENGWIN) | 60 (all) | 30 | **30.96** ± 2.63 | **90.31** ± 3.20 |
| `luna+25v+n250+s2` (LUNA16) | 250 / 738 | 100 | **32.47** ± 1.05 | **92.33** ± 1.83 |
| `abdomen+25v+n250+s2` (PANORAMA) | 250 / 1244 | 600 | **29.79** ± 2.11 | **89.52** ± 3.21 |
| `tooth+25v+n250+s2` (ToothFairy) | 250 / 343 | 75 | **34.03** ± 1.15 | **94.29** ± 1.53 |

Mean ± std over test cases, from the official `code/evaluate.py`. Per-case results are in each folder's `results_1.0x.csv`.

For reference, paper Table III (10 views, full training sets): pelvis 29.03 / 90.27, LUNA16 31.86 / 91.41, abdomen 29.42 / 88.36, tooth 31.79 / 92.50. On the full LUNA16 test set, the official 10-view checkpoint gives 31.79 / 91.46 on our preprocessed data.

## Setup

- Code: xmed-lab/DeepSparse @ `a055aba3bcb5732a68f89cc0bf3ee6fbfbb1b1e4`
- Views: 25 input views, uniformly over 180°, taken from a 300-view projection cache
- Stage 1: `--num_views 30 --vq_w 0.1`, resumed from `pretrain/ep_700.pth`, 400 epochs
- Stage 2: `--num_views 30 --min_views 25 --random_views --vq_w 1.0 --safely_load --freeze_ft`, resumed from stage-1 `ep_400.pth`, 400 epochs
- Batch size 2, lr 1e-4, weight decay 1e-3, no LR schedule, 1 GPU per job
- Environment: PyTorch 2.7.1 + CUDA 12.8, TIGRE 3.1.3

## Differences from the paper protocol

1. **Training set size**: at most 250 training cases per dataset (the paper uses the full training sets). Test splits are the official ones. The exact case lists are in `splits/<DATASET>/meta_info.json`.
2. **Dense views**: `num_views=30` during training, so stage 2 has a teacher/student view ratio of 1.2× (official: 24 dense views vs 6/8/10).
3. **Environment**: newer PyTorch and TIGRE than the official (PyTorch 1.13, TIGRE 2.3), needed for Blackwell GPUs.
4. **ToothFairy config**: the official `meta_info.json` references an unreleased `config+new.yaml` / `processed+new/`. We use the repo's public `config.yaml`. The official tooth 10-view checkpoint reproduces the paper numbers with this config (31.89 / 92.74).

## Files

```
<dataset>+25v+n250+s2/
  ep_400.pth          final stage-2 checkpoint (use this)
  config.yaml         config saved by train.py (note: min_views stays 10 here)
  results_1.0x.csv    per-case test PSNR/SSIM + average
  train.log           stage-2 training log (args + val curve)
  train_s1.log        stage-1 training log
configs/
  finetune_s1_n250.yaml, finetune_s2_n250.yaml   training configs (root_dir ./data_n250)
  eval_25v_n250.yaml                             evaluation config (min_views: 25)
splits/<DATASET>/meta_info.json                  train/eval/test case lists used
```

## Usage

```bash
# inside a DeepSparse checkout with data prepared as in the official README
hf download Potestates/DeepSparse-25v --local-dir ./logs
cp logs/configs/eval_25v_n250.yaml configs/generated/   # set root_dir to your data root

python code/evaluate.py --name luna+25v+n250+s2 --epoch 400 --dst_name luna \
  --split test --num_views 25 --cfg_path configs/generated/eval_25v_n250.yaml \
  --out_res_scale 1.0
```

Evaluation must use `min_views: 25`. The `config.yaml` saved inside each checkpoint folder keeps `min_views: 10`, so use `configs/eval_25v_n250.yaml` instead.

## License

The DeepSparse code is MIT. These weights are derived from datasets with their own terms. Check each dataset's license before use:

- PANORAMA (abdomen): CC BY-NC 4.0 (**non-commercial**)
- PENGWIN (pelvis): CC BY 4.0
- LUNA16 (lung), ToothFairy (tooth): see the original dataset terms

Please cite the DeepSparse paper and the datasets if you use these checkpoints.