change_detection.pytorch:3 步跑通遥感图像变化检测完整模型 change_detection.pytorch3 步跑通遥感图像变化检测完整模型【免费下载链接】change_detection.pytorchDeep learning models for change detection of remote sensing images项目地址: https://gitcode.com/gh_mirrors/ch/change_detection.pytorchchange_detection.pytorch 是一个基于 PyTorch 的遥感图像变化检测库输入同一地点两个时相的图像输出像素级变化掩膜。如果你正在做环境监测、城市规划或灾害评估又不想自己逐行搭编码器、解码器和损失函数这个项目可以直接作为起点。一、它到底帮你解决什么遥感图像对规模大人工核查不现实。LEVIR-CD 含 637 对 1024×1024 高分辨率影像肉眼都看不完更谈不上逐对标注变化。这个库把训练、验证、推理、可视化打包成套加载两时相图像跑几个 epoch直接拿到变化图。第二个痛点是换架构要重写网络。变化检测模型普遍需要双编码器加特征融合自己写至少两三百行。库里把这件事收敛成两个参数是否孪生编码器siam_encoder、特征融合方式fusion_form。换架构只改一个类名。第三个痛点是评估体系分散。变化检测要看 F-score、Precision、Recall、IoU 等多个指标手写容易搞错激活函数和阈值。库内置了这些指标对象训练循环里和 loss 一起打印。这个项目覆盖的是从遥感图像变化检测到 PyTorch 模型搭建、孪生编码器特征融合、变化检测损失函数的完整链路。二、看懂设计为什么遥感图像变化检测用孪生编码器![PyTorch遥感图像变化检测孪生编码器架构图](https://raw.gitcode.com/gh_mirrors/ch/change_detection.pytorch/raw/d76fb14916590cea42c42e4de787667a2f483da7/resources/model architecture.png?utm_sourcegitcode_repo_files)为什么是「双编码器、单解码器」变化检测本质是两张图像之间的像素级对应问题。如果两个分支用不同网络模型无法区分「差异来自网络结构不同」还是「来自真实变化」。所以默认 siam_encoderTrue两分支共享同一套编码器权重只有时间维度的差异参与梯度。解码器把两分支各尺度的特征逐级融合concat、sum、diff、abs_diff 四种可选最终输出变化掩膜。这套思路来自成熟的语义分割模型设计库本身参考了 segmentation_models.pytorch 的模块化方式编码器、解码器、分割头全部解耦。change_detection_pytorch/base/ 下的 SegmentationModel 统一处理前向逻辑forward(x1, x2) 吃两张图、吐出 (batch, classes, H, W) 的预测张量推理时调用 predict 即可自动切到 eval 模式。三、 3 步跑通第一个模型第 1 步装环境。依赖清单很短只有 5 个包git clone https://gitcode.com/gh_mirrors/ch/change_detection.pytorch cd change_detection.pytorch pip install -r requirements.txt如果已装好 PyTorch补装 torchvision、timm、pretrainedmodels、efficientnet-pytorch、albumentations 即可。第 2 步最小可运行示例。参考根目录的local_test.py核心就是下面这几行import change_detection_pytorch as cdp from change_detection_pytorch.datasets import LEVIR_CD_Dataset from torch.utils.data import DataLoader model cdp.Unet(encoder_nameresnet34, encoder_weightsimagenet, in_channels3, classes2, siam_encoderTrue, fusion_formconcat) dataset LEVIR_CD_Dataset(../LEVIR-CD/train, sub_dir_1A, sub_dir_2B, img_suffix.png, ann_dir../LEVIR-CD/train/label) loader DataLoader(dataset, batch_size8, shuffleTrue)参数含义in_channels 是输入通道RGB 填 3灰度填 1classes 是输出类别数变化/未变化填 2fusion_form 控制两分支特征怎么融合。数据集类会按同名文件把 A、B 两个子目录的图像配对再从 label 目录读标签。第 3 步训练并确认反馈。损失、指标、优化器、训练 runner 各一行import torch loss cdp.losses.SoftCrossEntropyLoss(threshold0.5) metrics [cdp.utils.metrics.Fscore(activationargmax2d), cdp.utils.metrics.IoU(activationargmax2d)] optimizer torch.optim.Adam(model.parameters(), lr1e-4) train_epoch cdp.utils.train.TrainEpoch(model, lossloss, metricsmetrics, optimizeroptimizer, devicecuda, verboseTrue) for epoch in range(60): print(train_epoch.run(loader))跑通后你应看到每个 epoch 输出一行train - loss - 0.xxxx, fscore - 0.xxxx日志loss 逐轮下降fscore 从低位缓慢爬升。验证用 ValidEpoch 同构对象训练结束跑一行推理可视化valid_epoch.infer_vis(valid_loader, saveTrue, slideFalse, save_dir./res)变化图逐张存到 ./res可以和标签目测核对。数据目录要求A/ 放第一期、B/ 放第二期、label/ 放标签图像文件名除后缀外必须一致标签是单通道 0/1 图内置类会自动 Resize 到 256 并做归一化。四、 看能力矩阵编码器、解码器、损失怎么选解码器共 11 种按需求挑Unet结构最简、训练最快第一版基线首选UnetPlusPlus嵌套密集跳跃连接小目标变化恢复更好DeepLabV3Plus空洞卷积多尺度特征适合尺度差异大的地物STANet专为变化检测设计的时空注意力可额外输出两时相特征距离图编码器ResNet 系列resnet18 到 resnet152精度速度均衡都有 ImageNet 预训练EfficientNetb0~b7 及 timm 变体参数少、效率高MobileNet v2/v3参数仅几兆适合低配机器和快速试跑Swin Transformer / MiT想试 Transformer 路线时的注意力骨干此外还有 VGG、DenseNet、SENet、ResNeSt、Res2NeSt、RegNet、DPN、Inception、GERNet、SK-Net 等编码器清单超过一百项。损失函数SoftCrossEntropyLoss收敛稳定基线第一选择DiceLoss / JaccardLoss直接优化重叠率对样本不平衡更友好FocalLoss压低易分样本权重聚焦难例HybridLoss / TverskyLoss / BCLLoss组合策略、精确率召回率调节、边界一致性推理与评估infer_vis 支持滑动窗口推理slideTrue大图不爆显存Fscore、IoU、Precision、Recall、Accuracy 指标对象按需组装进 metrics 列表五、 按场景选方案半天内跑通一个基线Unet resnet34 SoftCrossEntropyLossbatch_size 8、输入 256。目标是把整条流水线跑通验证数据配对和标签质量不纠结指标数字。在 LEVIR-CD 级别数据上冲精度STANet 或 DeepLabV3Plus efficientnet-b4 到 b7或 timm-resnest50d损失换 HybridLoss验证指标同时盯 Fscore 和 IoU。根据项目文档该库曾用于 PRCV2021 变化检测竞赛并取得第 3 名这类组合有实战基础。低配 GPU 或 CPU 试跑Linknet timm-mobilenetv3_small_100batch_size 2~4输入 256。编码器参数不足 1M训练速度最快够用来验证代码链路。六、⚙️ 进阶调优与部署调优方面有三条实用建议。第一学习率调度用 change_detection_pytorch/utils/lr_scheduler.py 里的 GradualWarmupScheduler 做预热再配合 MultiStepLR 分段衰减。第二变化区域占比很低时损失从交叉熵换成 TverskyLoss 或 HybridLoss。第三单张输出分辨率不满意时测试阶段用 ChunkImage 切块 滑动窗口合并。部署与推理注意三点。模型保存直接 torch.save(model, ./best_model.pth) 存整个模型local_test.py就是这么做的。大图推理务必走滑动窗口在测试 transform 里加 ChunkImage 和 ToTensorTest或 infer_vis 里直接传 slideTrue。自定义数据按data/my_dataset/train/下设 img1_dir、img2_dir、label_dir 三个子目录组织文件名除后缀一致用 img_suffix 和 seg_map_suffix 指定后缀交给 CustomDataset 加载即可。七、 踩坑速查encoder_weights 下载失败模型初始化卡住用 get_encoder_names() 核对编码器名拼写网络差时先设 encoder_weightsNone 把代码跑通权重后补。loss 卡在 0.69 附近不动0.69 是二分类交叉熵在随机初始化下的典型值。依次排查标签是否真的是 0/1标签按灰度读取后除以 255A、B 两期文件名是否同名配对成功in_channels 是否与实际图像通道一致。CUDA out of memory先降 batch_size再确认输入 size 是 256 而不是更大值最后把编码器从 resnet34 换到 resnet18 或 mobilenet_v2。推理结果与原图对不上训练用 256 缩放、测试直接喂原图会造成比例不一致。统一训练与测试的预处理大图用 ChunkImage 按原图尺寸分块推理。收尾下一步可以这样做通读一遍local_test.py它是训练、验证、可视化最完整的参考尝试 create_model(unet, encoder_name...) 这类字符串接口实验里换架构更快对照 change_detection_pytorch/datasets/ 的目录结构改 CustomDataset 的 size 和 split 参数接入自己的数据查看 COMPETITIONS.md 了解 PRCV2021 获奖方案如何使用这个库把 Fscore 加进指标列表养成看趋势而不是只盯 loss 的习惯。从两期图像到变化掩膜一套代码走通11 种解码器和上百种编码器的组合全部由参数决定这就是一个遥感变化检测项目需要的最小完备形态。【免费下载链接】change_detection.pytorchDeep learning models for change detection of remote sensing images项目地址: https://gitcode.com/gh_mirrors/ch/change_detection.pytorch创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考