Clean release workspace for FAF-CD: Frequency-Aware Fusion for Change Detection under Imperfect Multimodal Remote Sensing, accepted to MONTI 2026.
Paper: arXiv:2606.03114v1
This repository contains the FAF-CD model, training/evaluation entrypoints, final paper configs, the local DINOv3 runtime, and the VMamba/selective-scan sources needed by the released model. It intentionally excludes datasets, logs, paper build artifacts, generated analysis outputs, and unrelated experiments. Checkpoint files are ignored by git; distribute released weights separately, for example as GitHub Release assets.
train.py,train_runner.py: training entrypoint.eval.py: evaluation entrypoint for LEVIR-CD, WHU-CD, and BRIGHT; includes optional BRIGHT submission export.configs/faf_cd/: final paper configs for LEVIR-CD, WHU-CD, and BRIGHT.models/: FAF-CD DINOv3 encoder wrapper, frequency-aware fusion modules, Mamba decoder, and selective-scan extension source.dataloader/,engine/,utils/: runtime support used by the released configs.dinov3/: minimal local DINOv3 code used to instantiate ConvNeXt-L/Base backbones and deformable-attention ops.
The following setup instructions were tested on Ubuntu 24.04.
The clean FAF-CD release includes the needed DINOv3 and selective-scan source files directly, so no git submodule initialization is required.
Create and activate the conda environment:
conda create -n faf-cd python=3.12
conda activate faf-cdInstall PyTorch, CUDA toolkit, and Python dependencies:
pip install torch torchvision
conda install nvidia::cuda-toolkit=12.8
pip install -r requirements.txtSet CUDA-related environment variables inside the conda environment:
conda env config vars set CUDA_HOME="$CONDA_PREFIX"
conda env config vars set LD_LIBRARY_PATH="$CONDA_PREFIX/lib64"
conda deactivate
conda activate faf-cdBuild the CUDA extensions required by FAF-CD:
export TORCH_CUDA_ARCH_LIST="12.0"
cd models/encoders/selective_scan
pip install . --no-build-isolation
cd ../../..
pushd dinov3/dinov3/eval/segmentation/models/utils/ops
pip install . --no-build-isolation
popdFor TORCH_CUDA_ARCH_LIST, use "12.0" for RTX 5090 and "8.6" for A6000. If you use system CUDA instead of the conda CUDA toolkit, make sure CUDA_HOME points to a CUDA installation that includes nvcc.
Set dataset roots with .env or environment variables:
cp .env.example .env
# edit DATASETS_ROOT if your datasets are elsewhereExpected dataset folders under DATASETS_ROOT:
LEVIR-CD256WHU-CD-256BRIGHT-1024
DINOv3 pretrained weights are not included in git. Place them at:
pretrained/DINOv3/dinov3_convnext_large_pretrain_lvd1689m-61fa432d.pthfor LEVIR-CD and WHU-CD.pretrained/DINOv3/dinov3_convnext_base_pretrain_lvd1689m-801f2ba9.pthfor BRIGHT.
FAF-CD paper checkpoints are also ignored by git. Download the released checkpoints from Google Drive, put them under checkpoints/, and pass them to evaluation with --checkpoint_path.
Currently verified checkpoint artifacts:
checkpoints/FAF-CD_LEVIR_best_test.pth: LEVIR-CD test checkpoint.checkpoints/FAF-CD_WHU_best_test.pth: WHU-CD test checkpoint.checkpoints/FAF-CD_BRIGHT_best_val.pth: BRIGHT validation checkpoint.
python train.py -n faf_cd.levir_dinov3_convnext_large
python train.py -n faf_cd.whu_dinov3_convnext_large
python train.py -n faf_cd.bright_dinov3_convnext_baseTraining logs default to TensorBoard/local files. W&B is optional: install wandb and set C.log_backend = 'wandb' plus your own entity/project in a private config if needed.
python eval.py -n faf_cd.levir_dinov3_convnext_large --split test --checkpoint_path checkpoints/FAF-CD_LEVIR_best_test.pth --legacy_eval_compat
python eval.py -n faf_cd.whu_dinov3_convnext_large --split test --checkpoint_path checkpoints/FAF-CD_WHU_best_test.pth --legacy_eval_compat
python eval.py -n faf_cd.bright_dinov3_convnext_base --split val --checkpoint_path checkpoints/FAF-CD_BRIGHT_best_val.pthUse --legacy_eval_compat for the released LEVIR-CD and WHU-CD paper checkpoints. It preserves the input/color and score aggregation semantics used by the original training/evaluation runs.
Using the current release code and the checkpoints above:
| Dataset | Split | Change IoU | mIoU / Target mIoU | F1 | mAP | Pixel Acc. |
|---|---|---|---|---|---|---|
| LEVIR-CD | test | 85.882 | 92.539 | 92.405 | 89.509 | 99.233 |
| WHU-CD | test | 91.383 | 95.506 | 95.497 | 94.078 | 99.642 |
| BRIGHT | val | - | 58.464 | - | 76.906 | 96.652 |
Per-target-class IoU for BRIGHT: intact 80.049, damaged 35.240, destroyed 60.103.
FAF-CD builds on our previous work NeXt2Former-CD and is adapted from M-CD, which in turn builds on Sigma. We thank the authors of these projects for their valuable contributions and for open-sourcing their implementations. The dataset links referenced above are sourced from DDPM-CD, and we thank the authors for making the processed splits easily accessible.
This material is based upon work supported by the National Science Foundation under NSF EIR Grant No. 2401835, entitled "Mapping of Natural Disasters by Deep Subspace Learning in Multi-band and Multi-spectral Satellite Images."
@misc{wang2026fafcdfrequencyawarefusionchange,
title={FAF-CD: Frequency-Aware Fusion for Change Detection under Imperfect Multimodal Remote Sensing},
author={Yufan Wang and Sokratis Makrogiannis and Chandra Kambhamettu},
year={2026},
eprint={2606.03114},
archivePrefix={arXiv},
primaryClass={cs.CV},
url={https://arxiv.org/abs/2606.03114},
}