开发和评估基于深度学习的滑坡检测系统 进行滑坡风险评估和灾害预警 滑坡易发性识别检测算法 使用 segmentation_models_pytorch语义分割模型

滑坡数据集、泥石流数据、地震数据、自然灾害
用于深度学习滑坡检测、语义分割、滑坡易发性、灾害评估在这里插入图片描述1在这里插入图片描述

滑坡数据集信息表

在这里插入图片描述

数据集概述
项目内容
数据集名称滑坡数据集
总图像数量20,865 张
数据来源卫星(如 Sentinel-2A/B、Landsat 等)和无人机 UAV 图像
应用场景深度学习滑坡检测、语义分割、滑坡易发性分析、灾害评估等
分辨率范围0.2米至5米
标注格式TIFF 格式,包含精确的滑坡掩膜文件(1表示滑坡区域,0表示非滑坡区域)

---

数据集特点总结

特点描述
多源数据整合来自9个不同区域的卫星和无人机影像,提供了丰富的地理和气候多样性。
大规模数据集包含了20,865张图像,为滑坡研究提供了大量的数据支持。
高精度标注所有图像均裁剪为512×512像素,并附带精确的滑坡掩膜文件。
多样化的分辨率影像的空间分辨率从0.2米到5米不等,满足不同的研究需求。
严格的质量控制自动化指标识别结合人工检查,确保数据集的高质量和可靠性。
广泛应用领域可用于深度学习模型训练、滑坡风险评估、灾害预警、土地利用规划等多个方面。

应用方向

  • 滑坡检测:通过深度学习技术自动识别滑坡区域。
  • 语义分割:对图像中的每个像素进行分类,区分滑坡与非滑坡区域。
  • 滑坡易发性分析:基于历史数据预测未来可能发生滑坡的区域。
  • 灾害评估:评估滑坡灾害的影响范围和严重程度,辅助决策制定。


✅ 一、数据集特性总结

特性描述
图像总数20,865 张
图像尺寸512×512 像素(TIFF 格式)
空间分辨率0.2m ~ 5m(高/中分辨率)
数据来源Sentinel-2A/B、Landsat、UAV(无人机)
地理覆盖9 个不同区域,多样地形、气候、植被
标注方式语义分割掩膜(Mask),滑坡=1,非滑坡=0
应用场景滑坡检测、易发性制图、灾害评估、预警系统

✅ 二、任务类型与模型选择

1. 任务类型

  • 语义分割(Semantic Segmentation):像素级滑坡区域识别(推荐)
  • 滑坡易发性评估(Landslide Susceptibility Mapping)
  • 变化检测(Change Detection):灾前/灾后对比
  • 灾害评估(Damage Assessment)

2. 推荐模型架构(PyTorch + Ultralytics/YOLO 或 SegFormer)

模型优点适用场景
U-Net结构简单,适合医学/遥感分割基础滑坡检测
DeepLabV3+多尺度特征提取强高分辨率 UAV 图像
SegFormer轻量 Transformer,性能高多源数据融合
YOLOv8-Seg易用,支持实例分割快速原型开发
HRNet保持高分辨率特征细节丰富的滑坡边界

推荐使用SegFormerU-Net + ResNet34 作为主干网络


✅ 三、环境搭建

1. 创建虚拟环境(Anaconda)

conda create -n landslide python=3.9
conda activate landslide

2. 安装依赖

# PyTorch(CUDA 11.8)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

# 图像处理
pip install opencv-python numpy tifffile pillow matplotlib scikit-image

# 深度学习框架
pip install segmentation-models-pytorch  # 支持 U-Net, DeepLab, PSPNet 等
pip install timm  # Vision Transformer 支持

# 可视化
pip install tensorboard pandas tqdm

# 地理空间处理(可选)
pip install rasterio geopandas shapely

# 验证 GPU
python -c "import torch; print(torch.cuda.is_available())"

✅ 四、数据准备与 data.yaml

目录结构

landslide_dataset/
├── images/
│   ├── train/
│   ├── val/
│   └── test/
├── masks/
│   ├── train/
│   ├── val/
│   └── test/
└── data.yaml

✅ 所有图像和掩膜均为 512×512 TIFF 格式,一一对应


data.yaml 示例

# data.yaml
path: ./landslide_dataset
train: images/train
val: images/val
test: images/test

# 分类任务(可选)
nc: 1
names: ['landslide']

在这里插入图片描述

✅ 五、语义分割训练代码(使用 segmentation_models_pytorch

import torch
import torch.nn as nn
from torch.utils.data import DataLoader
from torch.optim import Adam
from torch.optim.lr_scheduler import CosineAnnealingLR
import segmentation_models_pytorch as smp
from segmentation_models_pytorch.utils.metrics import IoU, Fscore
from segmentation_models_pytorch.utils.train import TrainEpoch, ValidEpoch
import os
from PIL import Image
import numpy as np
import tifffile as tiff

# -------------------------------
# 1. 数据集类
# -------------------------------
class LandslideDataset(torch.utils.data.Dataset):
    def __init__(self, image_dir, mask_dir, transform=None):
        self.image_dir = image_dir
        self.mask_dir = mask_dir
        self.images = os.listdir(image_dir)
        self.transform = transform

    def __len__(self):
        return len(self.images)

    def __getitem__(self, idx):
        img_name = self.images[idx]
        img_path = os.path.join(self.image_dir, img_name)
        mask_path = os.path.join(self.mask_dir, img_name.replace('.tif', '_mask.tif'))

        # 读取 TIFF 图像(多波段或 RGB)
        image = tiff.imread(img_path).astype(np.float32)
        mask = tiff.imread(mask_path).astype(np.float32)

        # 归一化(假设为 8/16-bit)
        image = image / image.max()
        mask = mask / mask.max()

        # 转为 CHW 格式(PyTorch 要求)
        if len(image.shape) == 2:
            image = np.expand_dims(image, 0)  # 单通道
        else:
            image = np.transpose(image, (2, 0, 1))  # HWC -> CHW

        mask = np.expand_dims(mask, 0)  # CHW

        return torch.tensor(image), torch.tensor(mask)

# -------------------------------
# 2. 模型定义
# -------------------------------
ENCODER = 'resnet34'
ENCODER_WEIGHTS = 'imagenet'
DEVICE = 'cuda' if torch.cuda.is_available() else 'cpu'

model = smp.Unet(
    encoder_name=ENCODER,
    encoder_weights=ENCODER_WEIGHTS,
    in_channels=3,  # 若为多光谱可改为 4/6/10
    classes=1,
    activation='sigmoid'
)
model = model.to(DEVICE)

# -------------------------------
# 3. 数据加载
# -------------------------------
train_dataset = LandslideDataset('landslide_dataset/images/train', 'landslide_dataset/masks/train')
val_dataset = LandslideDataset('landslide_dataset/images/val', 'landslide_dataset/masks/val')

train_loader = DataLoader(train_dataset, batch_size=16, shuffle=True, num_workers=4)
val_loader = DataLoader(val_dataset, batch_size=16, shuffle=False, num_workers=4)

# -------------------------------
# 4. 损失函数与优化器
# -------------------------------
loss = smp.utils.losses.DiceLoss()
metrics = [
    IoU(threshold=0.5),
    Fscore(beta=1, threshold=0.5)
]

optimizer = Adam([
    dict(params=model.parameters(), lr=0.001),
])

scheduler = CosineAnnealingLR(optimizer, T_max=100, eta_min=1e-6)

# -------------------------------
# 5. 训练与验证
# -------------------------------
train_epoch = TrainEpoch(
    model, loss=loss, metrics=metrics,
    optimizer=optimizer, device=DEVICE,
    verbose=True
)

valid_epoch = ValidEpoch(
    model, loss=loss, metrics=metrics,
    device=DEVICE, verbose=True
)

# 开始训练
best_iou = 0.0
for epoch in range(100):
    print(f"\nEpoch: {epoch}")
    train_logs = train_epoch.run(train_loader)
    valid_logs = valid_epoch.run(val_loader)

    scheduler.step()

    # 保存最佳模型
    if best_iou < valid_logs['iou_score']:
        best_iou = valid_logs['iou_score']
        torch.save(model.state_dict(), 'best_unet_landslide.pth')
        print(f"Model saved! Best IoU: {best_iou:.4f}")

✅ 六、推理与可视化

import matplotlib.pyplot as plt

model.eval()
image, mask = val_dataset[0]
image_tensor = image.unsqueeze(0).to(DEVICE)

with torch.no_grad():
    pred_mask = model(image_tensor)
    pred_mask = (pred_mask.squeeze().cpu().numpy() > 0.5).astype(np.uint8)

# 可视化
plt.figure(figsize=(12, 4))
plt.subplot(1, 3, 1)
plt.imshow(image[0], cmap='gray')
plt.title("Input Image")
plt.axis('off')

plt.subplot(1, 3, 2)
plt.imshow(mask[0], cmap='gray')
plt.title("True Mask")
plt.axis('off')

plt.subplot(1, 3, 3)
plt.imshow(pred_mask, cmap='gray')
plt.title("Predicted Mask")
plt.axis('off')

plt.show()

✅ 七、滑坡易发性制图(Landslide Susceptibility Mapping)

方法:

  1. 提取地形因子(DEM、坡度、坡向、曲率)
  2. 提取植被指数(NDVI)
  3. 提取水文因子(TWI)
  4. 使用 U-Net 输出作为“滑坡概率图”
  5. 结合 Logistic 回归或 Random Forest 进行加权融合

✅ 可使用 WhiteboxToolsQGIS 提取地形因子


✅ 八、灾害评估与预警系统集成

应用方向:

应用实现方式
实时滑坡检测无人机巡检 + 模型推理
灾前预警结合降雨、地震数据,预测高风险区
灾后评估灾前/灾后图像变化检测
政府决策支持构建 GIS 平台,生成风险热力图

✅ 九、模型导出与部署

导出为 ONNX

dummy_input = torch.randn(1, 3, 512, 512).to(DEVICE)
torch.onnx.export(model, dummy_input, "landslide_unet.onnx", opset_version=13)

更多推荐