开发和评估基于深度学习的滑坡检测系统 进行滑坡风险评估和灾害预警 滑坡易发性识别检测算法 使用 segmentation_models_pytorch语义分割模型
·
开发和评估基于深度学习的滑坡检测系统 进行滑坡风险评估和灾害预警 滑坡易发性识别检测算法 使用 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 | 保持高分辨率特征 | 细节丰富的滑坡边界 |
✅ 推荐使用:
SegFormer或U-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)
方法:
- 提取地形因子(DEM、坡度、坡向、曲率)
- 提取植被指数(NDVI)
- 提取水文因子(TWI)
- 使用 U-Net 输出作为“滑坡概率图”
- 结合 Logistic 回归或 Random Forest 进行加权融合
✅ 可使用
WhiteboxTools或QGIS提取地形因子
✅ 八、灾害评估与预警系统集成
应用方向:
| 应用 | 实现方式 |
|---|---|
| 实时滑坡检测 | 无人机巡检 + 模型推理 |
| 灾前预警 | 结合降雨、地震数据,预测高风险区 |
| 灾后评估 | 灾前/灾后图像变化检测 |
| 政府决策支持 | 构建 GIS 平台,生成风险热力图 |
✅ 九、模型导出与部署
导出为 ONNX
dummy_input = torch.randn(1, 3, 512, 512).to(DEVICE)
torch.onnx.export(model, dummy_input, "landslide_unet.onnx", opset_version=13)
更多推荐


所有评论(0)