metadata
license: mit
tags:
- diffusers
- ddpm-cd
- change-detection
- remote-sensing
we do not have a full checkpoint conversion validation, if you encounter pipeline loading failure and unsidered output, please contact me via bili_sakura@zju.edu.cn
BiliSakura/ddpm-cd
Consolidated DDPM-CD change detection — Single repo with shared UNet backbone and multiple cd_head variants (trained on different datasets and timestep configs).
Model Structure
- Backbone: Shared SR3-style UNet (same across all variants)
- cd_head: Dataset-specific change detection heads in
cd_head/{variant}/
Available cd_head Variants
| Variant | Dataset | Timesteps | Path |
|---|---|---|---|
| cdd-50-100 | CDD | [50, 100] | cd_head/cdd-50-100/ |
| cdd-50-100-400 | CDD | [50, 100, 400] | cd_head/cdd-50-100-400/ |
| cdd-50-100-400-650 | CDD | [50, 100, 400, 650] | cd_head/cdd-50-100-400-650/ |
| dsifn-50-100 | DSIFN | [50, 100] | cd_head/dsifn-50-100/ |
| dsifn-50-100-400 | DSIFN | [50, 100, 400] | cd_head/dsifn-50-100-400/ |
| dsifn-50-100-400-650 | DSIFN | [50, 100, 400, 650] | cd_head/dsifn-50-100-400-650/ |
| levir-50-100 | LEVIR | [50, 100] | cd_head/levir-50-100/ |
| levir-50-100-400 | LEVIR | [50, 100, 400] | cd_head/levir-50-100-400/ |
| levir-50-100-400-650 | LEVIR | [50, 100, 400, 650] | cd_head/levir-50-100-400-650/ |
| whu-50-100 | WHU | [50, 100] | cd_head/whu-50-100/ |
| whu-50-100-400 | WHU | [50, 100, 400] | cd_head/whu-50-100-400/ |
| whu-50-100-400-650 | WHU | [50, 100, 400, 650] | cd_head/whu-50-100-400-650/ |
Usage
Load with explicit custom_pipeline (pipeline.py is in the repo, use relative path) and cd_head_subfolder:
from diffusers import DiffusionPipeline
pipe = DiffusionPipeline.from_pretrained(
"BiliSakura/ddpm-cd",
custom_pipeline="pipeline",
trust_remote_code=True,
cd_head_subfolder="levir-50-100",
).to("cuda")
# Images in [-1, 1], shape (B, 3, H, W)
change_map = pipe(image_A, image_B, timesteps=[50, 100])
pred = change_map.argmax(1) # (B, H, W), 0=no-change, 1=change
Important: Pass the same timesteps used during training for each variant (see table above).
Switching cd_head at Runtime
pipe = DiffusionPipeline.from_pretrained(
"BiliSakura/ddpm-cd",
custom_pipeline="pipeline",
trust_remote_code=True,
cd_head_subfolder="levir-50-100",
).to("cuda")
# Load different cd_head
pipe.load_cd_head(subfolder="whu-50-100-400")
change_map = pipe(image_A, image_B, timesteps=[50, 100, 400])
Citation
@inproceedings{bandaraDDPMCDDenoisingDiffusion2025,
title = {{{DDPM-CD}}: {{Denoising Diffusion Probabilistic Models}} as {{Feature Extractors}} for {{Remote Sensing Change Detection}}},
shorttitle = {{{DDPM-CD}}},
booktitle = {Proceedings of the {{Winter Conference}} on {{Applications}} of {{Computer Vision}}},
author = {Bandara, Wele Gedara Chaminda and Nair, Nithin Gopalakrishnan and Patel, Vishal},
year = 2025,
pages = {5250--5262},
urldate = {2025-12-28}
}