PeftCD: Leveraging Vision Foundation Models with Parameter-Efficient Fine-Tuning for Remote Sensing Change Detection
Official PyTorch implementation of PeftCD, a novel bitemporal change detection network that utilize the VFMs fintuning methods in remote sensing change detection. The paper has been accepted at IEEE JSTAR!!
Authors: Sijun Dong; Yuxuan Hu; Libo Wang; Geng Chen; Xiaoliang Meng*
School of Remote Sensing and Information Engineering, Wuhan University, Wuhan, China
Abstract:
To tackle the prevalence of spurious changes, the scarcity of annotations, and the difficulty of cross-domain transfer in multi-temporal and multi-source remote sensing imagery, we propose PeftCD, a change detection framework built upon Vision Foundation Models (VFMs) with Parameter-Efficient Fine-Tuning (PEFT). Specifically, PeftCD adopts a shared-weights Siamese encoder instantiated from a VFM, into which LoRA and Adapter modules are injected as fine-tuning strategies, so that only a small number of additional parameters need to be trained for task adaptation. To better explore the potential of VFMs in change detection, we investigate two representative backbones: the Segment Anything Model v2 (SAM2), which provides strong segmentation priors, and DINOv3, a state-of-the-art self-supervised representation learner. Meanwhile, PeftCD employs a deliberately minimal and efficient decoder to highlight the representational capacity of the backbone models. Extensive experiments demonstrate that PeftCD achieves state-of-the-art performance across multiple public datasets, including SYSU-CD (IoU 73.81%), WHUCD (92.05%), MSRSCD (64.07%), MLCD (76.89%), CDD (97.01%), S2Looking (52.25%) and LEVIR-CD (85.62%), with notably precise boundary delineation and strong suppression of pseudo-changes. Overall, PeftCD achieves a favorable balance among accuracy, efficiency, and generalization, offering an efficient paradigm for adapting VFMs to practical remote sensing change detection. The code and pretrained weights are available at https://github.com/dyzy41/PeftCD.
The source code and pre-trained weights are available at https://github.com/dyzy41/PeftCD.
bash install_env.sh
bash run.sh
If you use this code for your research, please cite our papers.
@ARTICLE{11458815,
author={Dong, Sijun and Hu, Yuxuan and Wang, Libo and Chen, Geng and Meng, Xiaoliang},
journal={IEEE Journal of Selected Topics in Applied Earth Observations and Remote Sensing},
title={PeftCD: Leveraging Vision Foundation Models with Parameter-Efficient Fine-Tuning for Remote Sensing Change Detection},
year={2026},
volume={},
number={},
pages={1-16},
keywords={Earth Observing System;Satellite images;Feeds;LoRa;Pixel;Communication systems;Internet;Electronic mail;Computer networks;Data communication;Remote Sensing Change Detection;Vision Foundation Models;Parameter-Efficient Fine-Tuning},
doi={10.1109/JSTARS.2026.3679260}}
ChangeCLIP
CSDNet
EfficientCD
Open-CD
本文档补充项目的环境安装、数据准备、训练、恢复训练、单独测试以及 main.py 主要参数说明。代码入口为 main.py,示例运行脚本为 run.sh。
建议先创建独立 conda 环境:
conda create -n pl python=3.9 -y
conda activate pl然后在项目根目录执行:
bash install_env.shinstall_env.sh 会安装 PyTorch 2.4.0、TorchVision 0.19.0、CUDA 11.8 对应 wheel、MMCV 2.2.0、MMEngine、Lightning 2.4.0、Albumentations、Timm、Einops、PEFT、MMSegmentation 等依赖。
如果安装后遇到 mmsegmentation 与 mmcv 的版本断言冲突,install_env.sh 末尾给出的处理方式是将 mmseg 的版本判断从:
assert (mmcv_min_version <= mmcv_version < mmcv_max_version)修改为:
assert (mmcv_min_version <= mmcv_version <= mmcv_max_version)SAM2 与 DINOv3 的预训练权重通过环境变量 PRETRAIN 定位,需要先设置:
export PRETRAIN=/path/to/pretrain推荐目录结构如下:
$PRETRAIN/
sam2/
sam2_hiera_large.pt
dinov3_weights/
dinov3_vitl16_pretrain_lvd1689m-8aa4cbdd.pth
DINOv3 通过 torch.hub.load(repo_or_dir="./", model="dinov3_vitl16", source="local") 从当前项目目录加载,因此请在项目根目录执行训练和测试命令。
普通变化检测任务使用 txt 文件描述数据划分。main.py 默认读取:
<dataset_root>/train.txt
<dataset_root>/val.txt
<dataset_root>/test.txt
每个 txt 文件中每一行包含三个路径,依次为第一时相图像、第二时相图像和变化标签:
/path/to/A/image_001.png /path/to/B/image_001.png /path/to/label/image_001.png
标签图会以灰度图读取,并通过 label // 255 转成 0/1 类别,因此推荐使用 0 表示未变化、255 表示变化。
如果 --dataset 传入的路径不存在,代码会自动拼接环境变量 CDPATH:
export CDPATH=/path/to/datasets例如:
python main.py --dataset SYSU-CD ...会在本地没有 SYSU-CD 目录时,自动尝试读取:
$CDPATH/SYSU-CD/train.txt
$CDPATH/SYSU-CD/val.txt
$CDPATH/SYSU-CD/test.txt
可以直接运行项目提供的脚本:
bash run.shrun.sh 会先指定 GPU:
export CUDA_VISIBLE_DEVICES=0,1随后依次启动四组 SYSU-CD 实验:
DINO3CD + loraDINO3CD + adapterSAM2CD + loraSAM2CD + adapter
单独运行一组 DINO3CD + LoRA 实验的示例:
python main.py \
--dataset SYSU-CD \
--model_type cd \
--model_arch SEED_PEFT \
--peft_method lora \
--model_name DINO3CD \
--exp_name DINO3CD_DPT_SYSU_lora \
--max_steps 15000 \
--batch_size 16 \
--devices 2 \
--strategy ddp_find_unused_parameters_true \
--accelerator gpu \
--src_size 256 \
--lr 0.0003 \
--work_dirs work_dirs训练文件默认保存到:
<work_dirs>/<exp_name>_TrainingFiles/
其中包括 Lightning 日志、CSV 日志、最优 checkpoint、last checkpoint、测试预测结果和指标文件。
如果训练中断,可以使用 --resume_path 从指定 checkpoint 继续训练:
python main.py \
--dataset SYSU-CD \
--model_type cd \
--model_arch SEED_PEFT \
--peft_method lora \
--model_name DINO3CD \
--exp_name DINO3CD_DPT_SYSU_lora \
--resume_path work_dirs/DINO3CD_DPT_SYSU_lora_TrainingFiles/last.ckpt \
--max_steps 15000 \
--batch_size 16 \
--devices 2 \
--strategy ddp_find_unused_parameters_true \
--accelerator gpu \
--src_size 256 \
--lr 0.0003 \
--work_dirs work_dirs训练模式下,main.py 会在 trainer.fit(...) 结束后自动执行:
trainer.test(model, test_loader, ckpt_path="best")如果只想单独测试已有 checkpoint,可以传入非 train 模式,并指定 --resume_path:
python main.py \
--mode test_loader \
--dataset SYSU-CD \
--model_type cd \
--model_arch SEED_PEFT \
--peft_method lora \
--model_name DINO3CD \
--exp_name DINO3CD_DPT_SYSU_lora \
--resume_path work_dirs/DINO3CD_DPT_SYSU_lora_TrainingFiles/best-model-xxxxxx-0.xxxx.ckpt \
--batch_size 16 \
--devices 1 \
--accelerator gpu \
--src_size 256 \
--work_dirs work_dirs注意:当前 main.py 的测试分支通过如下字典选择 dataloader:
loader_dict = {
"train_loader": train_loader,
"val_loader": val_loader,
"test_loader": test_loader,
}因此单独测试时建议使用 --mode test_loader。如果希望命令写成 --mode test,需要同步修改代码中的 loader_dict 键名或取值逻辑。
预测图像默认保存到:
<work_dirs>/<exp_name>_TrainingFiles/test_results/
指标文件默认保存到:
<work_dirs>/<exp_name>_TrainingFiles/<exp_name>_metrics.csv
| 参数 | 默认值 | 说明 |
|---|---|---|
--dataset |
LEVIR-CD |
数据集根目录或数据集名称。如果路径不存在,会拼接 $CDPATH/<dataset>。 |
--model_name |
SAM2CD |
具体变化检测网络,常用 SAM2CD、DINO3CD。 |
--model_type |
cd |
任务类型。cd 为普通变化检测;dgcd 为域泛化变化检测。 |
--model_arch |
SEED |
Lightning 封装模型。常用 SEED_PEFT 启用 PEFT 训练;代码中还包含 SEED、SEED_DG 等类。 |
--peft_method |
lora |
参数高效微调方法。支持 lora、adapter,其他值会进入 IA3 配置分支。 |
--mode |
train |
运行模式。train 表示训练并在结束后测试;单独测试建议使用 test_loader。 |
--resume_path |
None |
checkpoint 路径。训练时用于恢复训练;测试时用于加载指定权重。 |
--exp_name |
Default |
实验名称,同时用于日志、checkpoint 和结果目录命名。 |
--work_dirs |
work_dirs |
训练文件、日志、checkpoint 和测试结果的保存根目录。 |
| 参数 | 默认值 | 说明 |
|---|---|---|
--batch_size |
16 |
每张 GPU 上的 batch size。多卡训练时总 batch size 通常约为 batch_size * GPU 数量。 |
--num_workers |
8 |
DataLoader 读取进程数。Windows 或内存较小时可适当调小。 |
--resize_size |
1 |
若大于 1,训练和测试都会先 resize 到该尺寸。 |
--src_size |
1024 |
原图尺寸,用于判断是否需要滑窗推理。 |
--crop_size |
256 |
训练随机裁剪尺寸,也是滑窗推理窗口大小。 |
--overlap |
128 |
滑窗推理步长参数。代码中将其作为 stride 使用;值越小,窗口重叠越多。 |
当 resize_size > 1 时,代码使用 resize 流程;否则如果 src_size > crop_size,训练使用随机裁剪,测试使用原图并在推理时滑窗;如果 src_size <= crop_size,则直接使用基础变换。
| 参数 | 默认值 | 说明 |
|---|---|---|
--num_classes |
2 |
输出类别数,二类变化检测一般为 2。 |
--pred_idx |
0 |
多输出分支时用于选择某个输出进行推理;SEED 系列会对两个输出求平均。 |
--loss_type |
ce |
损失类型。ce 使用 CrossEntropyLoss,其他值会使用 BCEWithLogitsLoss。 |
--loss_weights |
1.0 1.0 |
多输出 loss 的权重,例如 --loss_weights 0.5 1.0。 |
--lr |
0.0003 |
初始学习率。 |
--min_lr |
0.00003 |
学习率衰减下限。 |
--warmup |
3000 |
warmup step 数。 |
--optimizer |
adamw |
SEED_PEFT 中支持 adam、sgd、adamw,其他值会使用 RMSprop。 |
| 参数 | 默认值 | 说明 |
|---|---|---|
--max_epochs |
120 |
最大训练 epoch 数。若 --max_steps != -1,代码会将 max_epochs 置为 None。 |
--max_steps |
40000 |
最大训练 step 数。run.sh 中设置为 15000。若设为 -1,代码会根据数据量和 epoch 数估算 step。 |
--early_stop |
80 |
EarlyStopping 的 patience,监控指标为 val_iou。 |
--check_val_every_n_epoch |
20 |
每多少个 epoch 验证一次;使用 max_steps 控制训练时会被置为 None。 |
--val_check_interval |
1000 |
每多少个 training step 做一次验证。 |
--val_vis_num |
0 |
预留的验证可视化数量参数,当前主流程中未显式使用。 |
| 参数 | 默认值 | 说明 |
|---|---|---|
--comet / --no-comet |
--comet |
是否启用 CometLogger。若不想上传日志,可加 --no-comet。 |
--save_test_results |
test_results |
测试预测图保存的子目录名称。 |
--accelerator |
gpu |
Lightning accelerator,可按环境改为 cpu、gpu 等。 |
--devices |
1 |
使用设备数。多 GPU 可设为 2、4 等,并配合 CUDA_VISIBLE_DEVICES。 |
--strategy |
auto |
Lightning 分布式策略。多卡 PEFT 示例使用 ddp_find_unused_parameters_true。 |
--precision |
16 |
训练精度,常用 16 或 32。 |
单卡快速调试:
export CDPATH=/path/to/datasets
export PRETRAIN=/path/to/pretrain
export CUDA_VISIBLE_DEVICES=0
python main.py \
--dataset SYSU-CD \
--model_type cd \
--model_arch SEED_PEFT \
--model_name DINO3CD \
--peft_method lora \
--exp_name debug_dino_lora \
--max_steps 100 \
--batch_size 2 \
--devices 1 \
--accelerator gpu \
--src_size 256 \
--crop_size 256 \
--work_dirs work_dirs \
--no-comet双卡正式训练:
export CDPATH=/path/to/datasets
export PRETRAIN=/path/to/pretrain
export CUDA_VISIBLE_DEVICES=0,1
python main.py \
--dataset SYSU-CD \
--model_type cd \
--model_arch SEED_PEFT \
--model_name SAM2CD \
--peft_method adapter \
--exp_name SAM2CD_DPT_SYSU_adapter \
--max_steps 15000 \
--batch_size 16 \
--devices 2 \
--strategy ddp_find_unused_parameters_true \
--accelerator gpu \
--src_size 256 \
--crop_size 256 \
--lr 0.0003 \
--work_dirs work_dirs