滑坡智能识别|遥感卫星无人机多源影像数据集|深度学习语义分割开源基准
地质灾害应急监测正从人工目视解译迈向AI自动化解译,滑坡识别作为地质灾害防控核心环节,面临样本稀缺、场景单一、尺度不均、标注粗糙 四大痛点,严重制约模型泛化与工程落地。本项目发布多区域、多分辨率、高精度标注滑坡遥感数据集,配套完整深度学习训练推理代码,为科研与工程提供开箱即用的基准方案,助力滑坡智能识别技术快速迭代。

数据集信息
- 数据规模:20,865张 高分辨率遥感影像,总容量8.55GB
- 覆盖区域:9大典型滑坡灾区,含国内外地震诱发滑坡场景
- 影像来源:PlanetScope、SuperView-1、GF-1卫星+无人机航拍
- 分辨率:0.2m/0.5m/0.6m/1.0m多尺度覆盖
- 标准格式:512×512像素TIFF格式,RGB三波段
- 标注体系:分类标签+像素级掩码,适配语义分割/目标检测
- 应用方向:滑坡识别、灾害清单制图、语义分割模型训练
区域与数据明细
| 序号 | 英文标识 | 核心说明 |
|---|---|---|
| 1 | Hokkaido Iburi-Tobu | 2018日本北海道地震滑坡,PlanetScope卫星 |
| 2 | Jiuzhai Valley(UAV-0.2m) | 2017九寨沟地震,0.2m无人机+掩膜标注 |
| 3 | Jiuzhai Valley(UAV-0.5m) | 九寨沟区域,0.5m无人机影像 |
| 4 | Lombok | 2018印尼龙目岛地震滑坡,遥感提取 |
| 5 | Longxi River(SAT) | 四川陇西河,0.8m卫星滑坡提取 |
| 6 | Longxi River(UAV) | 陇西河区域,0.2m无人机+滑坡掩膜 |
| 7 | Mengdong Township | 云南勐董乡,0.5m影像+掩膜 |
| 8 | Moxi Town(UAV) | 四川莫溪镇,0.2m/1m多尺度变化检测 |
| 9 | Palu | 2018印尼帕卢地震滑坡+液化 |
| 10 | Tiburon Peninsula | 2021海地地震,多源卫星融合 |
目录结构
landslide-remote-sensing-dataset/
├── README.md # 说明文档
├── images/ # 原始影像(TIFF)
├── masks/ # 像素级掩码
├── labels/ # 分类标签
├── splits/ # 训练/验证/测试划分
├── code/
│ ├── dataset.py # 数据加载
│ ├── model.py # 网络定义
│ ├── train.py # 训练脚本
│ ├── infer.py # 推理脚本
│ └── utils.py # 工具函数
└── docs/ # 技术文档
深度学习核心代码
python
# -*- coding: utf-8 -*-
"""
@主题 遥感滑坡语义分割标准训练流程
@场景 适配卫星+无人机多源数据,解决小目标/边缘模糊/样本不均衡
@框架 PyTorch + segmentation_models_pytorch
@数据 本项目512×512 TIFF,像素级掩码标注
"""
import os
import torch
import torch.nn as nn
import albumentations as A
from albumentations.pytorch import ToTensorV2
from torch.utils.data import Dataset, DataLoader
import segmentation_models_pytorch as smp
from tqdm import tqdm
import cv2
import numpy as np
# ====================== 1. 全局配置(滑坡场景优化)======================
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
IMG_SIZE = 512
IN_CHANNELS = 3
NUM_CLASSES = 1
LEARNING_RATE = 1e-4
BATCH_SIZE = 8
EPOCHS = 50
DATA_ROOT = "./"
IMG_DIR = os.path.join(DATA_ROOT, "images")
MASK_DIR = os.path.join(DATA_ROOT, "masks")
# ====================== 2. 数据增强(遥感滑坡专用)======================
# 保留地物纹理/坡度信息,避免畸变导致边界误判
train_transform = A.Compose([
A.Resize(IMG_SIZE, IMG_SIZE),
A.HorizontalFlip(p=0.5),
A.VerticalFlip(p=0.5),
A.RandomRotate90(p=0.5),
A.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)),
ToTensorV2()
])
val_transform = A.Compose([
A.Resize(IMG_SIZE, IMG_SIZE),
A.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)),
ToTensorV2()
])
# ====================== 3. 数据集加载(适配TIFF与掩码)======================
class LandslideDataset(Dataset):
def __init__(self, img_dir, mask_dir, transform=None):
self.img_paths = sorted([os.path.join(img_dir, f) for f in os.listdir(img_dir) if f.endswith(".tif")])
self.mask_paths = sorted([os.path.join(mask_dir, f) for f in os.listdir(mask_dir) if f.endswith(".tif")])
self.transform = transform
def __len__(self):
return len(self.img_paths)
def __getitem__(self, idx):
img = cv2.imread(self.img_paths[idx])
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
mask = cv2.imread(self.mask_paths[idx], cv2.IMREAD_GRAYSCALE)
mask = (mask > 0).astype(np.float32) # 二值化:滑坡=1,背景=0
if self.transform:
augmented = self.transform(image=img, mask=mask)
img = augmented["image"]
mask = augmented["mask"].unsqueeze(0)
return img, mask
# ====================== 4. 模型构建(U-Net+ResNet34,兼顾精度速度)======================
model = smp.Unet(
encoder_name="resnet34",
encoder_weights="imagenet",
in_channels=IN_CHANNELS,
classes=NUM_CLASSES,
activation="sigmoid"
).to(DEVICE)
# ====================== 5. 损失函数(解决滑坡样本不均衡)======================
# 混合Dice+BCE,降低背景主导、提升滑坡边界召回率
loss_fn = smp.losses.DiceLoss(smp.losses.BINARY_MODE) + smp.losses.BCELoss()
# ====================== 6. 优化器与指标======================
optimizer = torch.optim.AdamW(model.parameters(), lr=LEARNING_RATE)
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=EPOCHS)
metrics = [smp.metrics.IoU(threshold=0.5)]
# ====================== 7. 训练&验证核心逻辑======================
def train_one_epoch(model, loader, loss_fn, optimizer, device):
model.train()
total_loss = 0
for img, mask in tqdm(loader):
img, mask = img.to(device), mask.to(device)
pred = model(img)
loss = loss_fn(pred, mask)
optimizer.zero_grad()
loss.backward()
optimizer.step()
total_loss += loss.item()
return total_loss / len(loader)
def val_one_epoch(model, loader, loss_fn, metrics, device):
model.eval()
total_loss = 0
total_metrics = {m.__name__: 0 for m in metrics}
with torch.no_grad():
for img, mask in tqdm(loader):
img, mask = img.to(device), mask.to(device)
pred = model(img)
loss = loss_fn(pred, mask)
total_loss += loss.item()
for m in metrics:
total_metrics[m.__name__] += m(pred, mask).item()
return total_loss / len(loader), {k: v / len(loader) for k, v in total_metrics.items()}
# ====================== 8. 启动训练======================
if __name__ == "__main__":
train_ds = LandslideDataset(IMG_DIR, MASK_DIR, train_transform)
train_loader = DataLoader(train_ds, batch_size=BATCH_SIZE, shuffle=True)
val_loader = DataLoader(train_ds, batch_size=BATCH_SIZE, shuffle=False)
for epoch in range(EPOCHS):
train_loss = train_one_epoch(model, train_loader, loss_fn, optimizer, DEVICE)
val_loss, val_metrics = val_one_epoch(model, val_loader, loss_fn, metrics, DEVICE)
scheduler.step()
print(f"Epoch {epoch+1:2d} | TrainLoss: {train_loss:.4f} | ValLoss: {val_loss:.4f} | IoU: {val_metrics['iou_score']:.4f}")
torch.save(model.state_dict(), "landslide_segmentation_best.pth")
技术优势
- 多源融合:卫星+无人机互补,覆盖广域与精细场景
- 尺度齐全:0.2m--1m分辨率,适配大/中/小尺度滑坡
- 标注精准:像素级掩码,直接训练主流分割模型
- 工程友好:标准格式、目录清晰、开箱即用
- 泛化性强:多区域多地貌,提升模型跨区域迁移能力
典型应用方向
- 地震/降雨诱发滑坡快速识别与提取
- 地质灾害风险区划与监测预警
- 遥感AI语义分割模型训练与 benchmark
- 应急测绘、灾害评估、灾后重建规划
使用说明
- 下载数据集,按标准目录放置
- 配置环境:
pip install torch segmentation-models-pytorch albumentations opencv-python tqdm - 调整路径与超参数,运行
train.py启动训练 - 用
infer.py对新影像批量推理输出滑坡掩码


标签
#遥感影像 #滑坡识别 #语义分割 #深度学习 #无人机航拍 #地质灾害 #数据集 #PyTorch #U-Net #智能解译