RDDM: A Residual-Driven Drifting Model for High-Fidelity Low-Dose CT Denoising
Official code release for RDDM: A Residual-Driven Drifting Model for High-Fidelity Low-Dose CT Denoising by Jianxu Wang, Qing Lyu, and Ge Wang.
Our Team: WANG-AXIS Lab
Introduction
RDDM is an efficient and high-fidelity LDCT denoising method based on a residual-driven drifting model. It incorporates the multi-step evolution from the generated residual distribution to the real residual distribution into the training dynamics through a residual drifting field, thereby enabling one-step denoising at inference time. Experiments on clinical datasets show that RDDM achieves state-of-the-art denoising performance among supervised baselines.
Fig. 1. Overview of RDDM. The top panel shows the training framework: the denoiser generates residual samples, while the objective is computed from the full generated residual batch and real residual batch. The bottom panels illustrate training-time drifting toward the real residual distribution and summarize the three RDDM variants.
RDDM Variants
The paper reports three RDDM variants, providing practical choices from fine-detail fidelity to stronger noise suppression. They share the same RDDM framework; only the drifting temperatures and optional pixel-level L1 supervision differ.
| Variant | --temperatures |
--lambda_l1 |
Intended use | Pretrained weights |
|---|---|---|---|---|
| RDDM-Fine | 1.0,1.5 |
0 |
Best fidelity; preserves realistic anatomical texture and noise characteristics. | Download |
| RDDM-Balanced | 0.2,1.0 |
0 |
Default trade-off between noise suppression and detail preservation. | Download |
| RDDM-Smooth | 1.0 |
0.01 |
Stronger noise suppression with smoother reconstructions. | Download |
- The training and test sets strictly follow the split described in the paper and are kept independent throughout model training and inference.
- Place the downloaded pretrained weights under the corresponding subfolders in
checkpoints/.
Installation
Tested environment:
- Python
3.10.20 - PyTorch
2.6.0+cu124 - CUDA
12.4
Create a clean environment first:
conda create -n rddm python=3.10 -y
conda activate rddm
python -m pip install -U pip
Install a PyTorch build matching your CUDA version. For example, for CUDA 12.4:
pip install torch==2.6.0 torchvision==0.21.0 --index-url https://download.pytorch.org/whl/cu124
For other CUDA/CPU targets, use the official PyTorch instructions.
RDDM computes FID during dataset evaluation by default. Install torch and torchvision before installing RDDM so the CUDA/CPU-specific PyTorch build is controlled explicitly.
Option 1: Install from source
git clone https://github.com/Jayx-Wang/RDDM.git
cd RDDM
pip install -e .
Option 2: Install the RDDM CLI
pip install rddm
After installation, the following commands are available:
rddm-train --help
rddm-infer-single --help
rddm-evaluate --help
Data Preparation
The clinical dataset used in this work can be obtained from the official AAPM Low Dose CT Grand Challenge page. We use the subset reconstructed with the B30 kernel and a slice thickness of 1 mm.
The expected directory layout is:
path/to/the/dataset/
├── train/
│ ├── ldct/
│ │ ├── *.IMA
│ │ └── ...
│ └── ndct/
│ ├── *.IMA
│ └── ...
└── test/
├── ldct/
│ ├── *.IMA
│ └── ...
└── ndct/
├── *.IMA
└── ...
Use --data_dir /path/to/the/dataset to specify your own dataset. Please ensure that LDCT and NDCT files are paired by matching filenames under the corresponding ldct/ and ndct/ folders.
Quick Start
The commands below are for installation from source and should be run inside the cloned repository. If you use the CLI installation, check rddm-train --help, rddm-infer-single --help, and rddm-evaluate --help for the corresponding usage.
Train RDDM-Fine
The following example trains RDDM-Fine with --temperatures 1.0,1.5 and --lambda_l1 0. To train RDDM-Balanced or RDDM-Smooth manually, keep the same command structure and change the variant-specific arguments shown in the table above.
CUDA_VISIBLE_DEVICES=0 python train.py \
--data_dir /path/to/the/dataset \
--split_train train \
--batch_size 24 \
--ncpus 20 \
--lr 1e-4 \
--lr_decay_mode step \
--lr_decay_step 10000 \
--lr_decay_gamma 0.5 \
--max_steps 50000 \
--save_interval 10000 \
--use_fp16 false \
--max_norm 1.0 \
--temperatures 1.0,1.5 \
--lambda_l1 0 \
--checkpointdir checkpoints/Custom/RDDM-Fine
-
Replace
/path/to/the/datasetwith the path to your prepared dataset. -
Please adjust settings such as
--batch_size,--ncpus, and precision according to your own GPU memory and hardware setup. -
For multi-GPU training, launch with
torchrunand keep the same script arguments.
Easily Reproduce Our RDDM Variants
DATA_DIR=/path/to/the/dataset GPU=0 bash scripts/train_rddm_fine.sh
DATA_DIR=/path/to/the/dataset GPU=0 bash scripts/train_rddm_balanced.sh
DATA_DIR=/path/to/the/dataset GPU=0 bash scripts/train_rddm_smooth.sh
- Replace
/path/to/the/datasetwith the path to your prepared dataset. - The default training parameters are configured for a single H100 80GB GPU.
Single-Slice Inference
CUDA_VISIBLE_DEVICES=0 python infer_single.py \
--ldct_path test_sample/ldct/L506_0081.IMA \
--ndct_path test_sample/ndct/L506_0081.IMA \
--checkpoint checkpoints/RDDM-Fine/rddm_fine_050000.pth \
--hu_min -1024 \
--hu_max 3072 \
--window_center 40 \
--window_width 400 \
--use_fp16 false \
--save_images true \
--out_dir outputs/single_L506_0081
Dataset Evaluation
CUDA_VISIBLE_DEVICES=0 python evaluate.py \
--data_dir /path/to/the/dataset \
--split test \
--checkpoint checkpoints/RDDM-Fine/rddm_fine_050000.pth \
--hu_min -1024 \
--hu_max 3072 \
--use_fp16 false \
--num_test_samples 1 \
--compute_fid true \
--fid_batch_size 50 \
--fid_dims 2048 \
--fid_num_workers 8 \
--save_npy true \
--out_dir outputs/evaluate_rddm_fine
- Replace
/path/to/the/datasetwith the path to your prepared dataset.
Citation
If you use this code, please cite the paper below.
@article{wang2026rddm,
title={RDDM: A Residual-Driven Drifting Model for High-Fidelity Low-Dose CT Denoising},
author={Wang, Jianxu and Lyu, Qing and Wang, Ge},
journal={arXiv preprint arXiv:2605.17188},
year={2026}
}
Metadata
Release files for rddm 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| rddm-0.1.2.tar.gz | 40.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| rddm-0.1.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 84.3 kB
Release files / rddm-0.1.2.tar.gz
| Download URL | rddm-0.1.2.tar.gz |
|---|---|
| Size | 40.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
fb05c61121e30f2c1367d1cac3be15b655fd393247cbb790da126f34f46f1ec5
|
|
BLAKE2b-256 checksum How to use checksums |
927ca7831623789e6e92a47049eddb5abf792d9b02e9bec0d72cf59934249406
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 28, 2026.
Transparency logRelease files / rddm-0.1.2-py3-none-any.whl
| Download URL | rddm-0.1.2-py3-none-any.whl |
|---|---|
| Size | 44.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f1881d953059b4fdebdf5e3b6772cafecc570adee4f41dbae0fc4be139224ca0
|
|
BLAKE2b-256 checksum How to use checksums |
c759a65185e381fb08db873e612c90826cbb9d169a54f248d136759ab9568473
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 28, 2026.
Transparency log