
用 change_detection.pytorch 十分钟搭出遥感图像变化检测模型【免费下载链接】change_detection.pytorchDeep learning models for change detection of remote sensing images项目地址: https://gitcode.com/gh_mirrors/ch/change_detection.pytorch最近有同行找我帮忙手里有一千多对相隔三年的卫星图要标出哪些楼是新建的、哪些被拆了。人工的办法是把两期图叠在屏幕上逐块目视比对两个人干了一周还没干完。这正是 change_detection.pytorch 要解决的问题——遥感图像变化检测喂给它两期卫星图它直接输出像素级的变化图而搭一个能跑的模型只需要十几行 PyTorch 代码。原理为什么是双编码器它的核心思路很直白两个编码器分别处理第一期和第二期图像各自提取空间特征解码器把两组特征融合后输出像素级的变化图。这样设计的原因是变化信号通常很弱直接在原始像素上做差会引入大量噪声而在特征层面对比才能把楼拆了、路没变这类细微差异稳定地检测出来。项目留了一个关键开关siam_encoderTrue时两条分支共享权重孪生结构保证两期特征在同一空间差出来的就是纯变化。解码器的融合方式可以用fusion_form选择行为各不相同fusion_form融合方式适合什么concat通道拼接默认选择信息量最全sum逐元素相加结构更简单强化两期共性abs_diff逐元素绝对差只关心变没变直接利用差异整个库是从 segmentation_models.pytorch 改造来的代码风格一脉相承用过那个库的话上手几乎没有成本。十分钟跑起来先克隆项目并装依赖命令直接粘到终端git clone https://gitcode.com/gh_mirrors/ch/change_detection.pytorch cd change_detection.pytorch pip install -r requirements.txt下面这段代码用来验证模型通路——建一个 Unet resnet34 的孪生模型喂两张随机图看输出形状import torch import change_detection_pytorch as cdp model cdp.Unet(encoder_nameresnet34, encoder_weightsimagenet, in_channels3, classes2, siam_encoderTrue, fusion_formconcat) x1, x2 torch.randn(2, 1, 3, 256, 256) print(model(x1, x2).shape) # torch.Size([1, 2, 256, 256])即变化图看到这行输出就说明链路通了。要做完整训练不用自己写打开仓库根目录的local_test.py里面是配好 LEVIR-CD 数据集的完整训练循环最后一步infer_vis会把预测的变化图存到res/目录打开图片就能看到识别出的变化区域。选型按你的场景挑配置库里内置了 Unet、Unet、MAnet、Linknet、FPN、PSPNet、DeepLabV3/V3、PAN、UPerNet、STANet 等架构编码器从 ResNet、EfficientNet 到 MobileNet、Swin Transformer 三十多个但没必要全看。按场景挑就够了场景推荐配置预期耗时适用约束快速验证、数据少于千对Unet resnet34 CrossEntropyLoss单卡 2-4 小时12GB 显存够用拼精度、要交付DeepLabV3Plus efficientnet-b7 HybridLoss单卡 8-12 小时24GB 显存以上资源受限、边缘部署Linknet mobilenet_v2 CrossEntropyLoss单卡 1-2 小时6GB 显存就够专做时空注意力STANet resnet50单卡 4-8 小时为变化检测定制的结构损失函数都挂在cdp.utils.losses下Dice、Focal、Lovasz、Tversky 都有。变化区域通常占全图不到一成类别不平衡明显时把 CrossEntropy 换成 Dice或再叠一个 Focal我实际跑下来效果提升比较稳。我踩过的坑in_channels 写了 3图其实是四波段加载多波段数据第一时刻就报通道不匹配。这个参数指单张图的通道数四波段就老老实实写in_channels4别硬塞成三通道。1024×1024 一上来就 OOMLEVIR-CD 的 1024×1024 原图配 batch_size8 是显存杀手。把 batch 降到 2 或开 AMP推理时可以用库里的ChunkImage变换做滑窗把大图切块处理local_test.py末尾有现成注释。离线服务器拉不到 imagenet 权重encoder_weightsimagenet首次运行会联网下载内网机器直接卡死。改成encoder_weightsNone跳过预训练大差距主要体现在小数据集上数据集够大的话从零训问题不大。训练能跑但指标不涨多半是两个原因classes参数和标签实际类别数对不上或者指标忘了配activationargmax2d拿原始 logits 直接和标签比。对照local_test.py里的 metrics 写法看一眼就明白了。往深了走源码看哪过了第一跑之后常见的改动集中在这几处想改特征融合方式或孪生结构看 change_detection_pytorch/base/model.pybase_forward就是整网的主干想自定义数据格式看 change_detection_pytorch/datasets/custom.py照着模板实现一个__getitem__即可想调解码器细节通道数、上采样看对应架构目录例如 change_detection_pytorch/unet/如果你只有 30 分钟我的建议是打开local_test.py把编码器换成 resnet18拿几张样本图跑一个 epoch然后把fusion_form从 concat 改成 abs_diff对比两次输出的变化图——两条分支的差异到底是怎么被用上的一次就明白了。【免费下载链接】change_detection.pytorchDeep learning models for change detection of remote sensing images项目地址: https://gitcode.com/gh_mirrors/ch/change_detection.pytorch创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考