大规模多传感器滑坡检测数据集,利用landsat,哨兵2,planet,无人机图像等多种传感器采集数据共2w余副图像,mask准确标注滑坡位置
大规模多传感器滑坡检测数据集介绍
数据集概述
名称:大规模多传感器滑坡检测数据集
图像数量:20,000余幅
数据来源:
- Landsat 卫星图像
- 哨兵2 (Sentinel-2) 卫星图像
- Planet 卫星图像
- 无人机图像
- 其他可能的高分辨率卫星或航空图像
标注类型:像素级分割掩码,准确标注滑坡位置
用途:用于滑坡检测和监测任务,适用于地质灾害预警、城市规划、环境监测等领域。该数据集特别适合基于深度学习的语义分割模型(如U-Net、DeepLab)和其他遥感图像处理技术。
数据集特点
- 规模:包含20,000余张高分辨率图像,每张图像都带有详细的像素级分割掩码。
- 多样性:图像来自多种传感器,包括卫星和无人机,涵盖了不同的时空分辨率、光照条件和天气状况,确保模型能够适应多样的实际场景。
- 标注质量:每张已标注的图像都有精确的手动分割掩码,确保了高质量的训练数据。
- 多源数据:结合了Landsat、哨兵2、Planet和无人机等多种传感器的数据,提供了丰富的信息层次和视角。
- 时间序列:部分数据集可能包含时间序列图像,有助于分析滑坡的发展过程和动态变化。
应用领域
- 地质灾害预警:自动识别和监测滑坡区域,提供早期预警。
- 城市规划:通过滑坡风险评估,优化城市规划和土地利用。
- 环境监测:持续监测滑坡对环境的影响,支持生态保护和恢复工作。
- 数据分析:通过数据分析,提供关于滑坡分布和演变的统计报告,辅助决策制定。
获取方式
通常情况下,研究人员可以通过官方提供的链接或相关机构网站下载该数据集。请注意,使用时应遵循相应的许可协议和引用要求。
关键代码示例
1. 下载数据集
假设我们已经有了数据集的下载链接,可以使用 Python 的 requests
库来下载数据集:
import requests
import os
# 定义下载链接和保存路径
url = 'http://example.com/path/to/landslide_detection_dataset.zip' # 替换为实际的下载链接
save_path = './landslide_detection_dataset.zip'
# 检查是否已经下载过
if not os.path.exists(save_path):
print("Downloading dataset...")
response = requests.get(url, stream=True)
with open(save_path, 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
if chunk:
f.write(chunk)
print("Download complete.")
else:
print("Dataset already exists.")
# 解压数据集
import zipfile
with zipfile.ZipFile(save_path, 'r') as zip_ref:
zip_ref.extractall('./landslide_detection_dataset')
2. 加载和显示图像及其分割掩码
以下是一个加载和显示图像及其分割掩码的示例:
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
def load_image_and_mask(image_path, mask_path):
image = Image.open(image_path).convert("RGB")
mask = Image.open(mask_path).convert("L") # 转换为灰度图
return image, mask
def display_image_and_mask(image, mask):
fig, axes = plt.subplots(1, 2, figsize=(12, 6))
axes[0].imshow(image)
axes[0].set_title('Image')
axes[0].axis('off')
axes[1].imshow(mask, cmap='gray')
axes[1].set_title('Segmentation Mask')
axes[1].axis('off')
plt.show()
# 示例路径
image_path = './landslide_detection_dataset/images/image_0001.jpg'
mask_path = './landslide_detection_dataset/masks/mask_0001.png'
image, mask = load_image_and_mask(image_path, mask_path)
display_image_and_mask(image, mask)
3. 创建 PyTorch Dataset 和 DataLoader
以下是一个简单的 PyTorch Dataset 和 DataLoader 示例:
import torch
from torch.utils.data import Dataset, DataLoader
from torchvision import transforms
from PIL import Image
import numpy as np
class LandslideDetectionDataset(Dataset):
def __init__(self, image_dir, mask_dir, transform=None):
self.image_dir = image_dir
self.mask_dir = mask_dir
self.transform = transform
self.images = os.listdir(image_dir)
def __len__(self):
return len(self.images)
def __getitem__(self, idx):
img_name = self.images[idx]
image_path = os.path.join(self.image_dir, img_name)
mask_path = os.path.join(self.mask_dir, img_name.replace('.jpg', '.png'))
image = Image.open(image_path).convert("RGB")
mask = Image.open(mask_path).convert("L") # 转换为灰度图
if self.transform:
image = self.transform(image)
mask = self.transform(mask)
return image, mask
# 数据增强和预处理
transform = transforms.Compose([
transforms.Resize((256, 256)),
transforms.ToTensor(),
])
# 创建 Dataset 和 DataLoader
dataset = LandslideDetectionDataset(
image_dir='./landslide_detection_dataset/images',
mask_dir='./landslide_detection_dataset/masks',
transform=transform
)
dataloader = DataLoader(dataset, batch_size=4, shuffle=True, num_workers=2)
# 遍历数据
for images, masks in dataloader:
# 在这里进行模型训练
pass
4. 使用 U-Net 进行语义分割
以下是一个使用 U-Net 进行语义分割的简单示例:
-
定义 U-Net 模型:深色版本
-
import torch.optim as optim device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model.to(device) criterion = nn.BCEWithLogitsLoss() # 二分类损失函数 optimizer = optim.Adam(model.parameters(), lr=0.001) num_epochs = 50 for epoch in range(num_epochs): model.train() running_loss = 0.0 for images, masks in dataloader: images, masks = images.to(device), masks.to(device).unsqueeze(1) # 添加通道维度 optimizer.zero_grad() outputs = model(images) loss = criterion(outputs, masks) loss.backward() optimizer.step() running_loss += loss.item() print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(dataloader)}')
-
评估模型:
model.eval() with torch.no_grad(): for images, masks in dataloader: images, masks = images.to(device), masks.to(device).unsqueeze(1) # 添加通道维度 outputs = model(images) predicted_masks = torch.sigmoid(outputs) > 0.5 # 二值化预测结果 # 可视化预测结果 for i in range(images.size(0)): fig, axes = plt.subplots(1, 3, figsize=(15, 5)) axes[0].imshow(images[i].permute(1, 2, 0).cpu().numpy()) axes[0].set_title('Image') axes[0].axis('off') axes[1].imshow(masks[i].squeeze().cpu().numpy(), cmap='gray') axes[1].set_title('Ground Truth') axes[1].axis('off') axes[2].imshow(predicted_masks[i].squeeze().cpu().numpy(), cmap='gray') axes[2].set_title('Predicted Mask') axes[2].axis('off') plt.show()
时间序列分析(可选)
如果数据集中包含时间序列图像,您可以进一步进行时间序列分析,例如:
-
时间序列数据准备: 将同一地区的不同时间点的图像组织在一起,形成时间序列数据。
-
时间序列模型: 使用循环神经网络(RNN)、长短期记忆网络(LSTM)或其他时间序列模型,结合卷积神经网络(CNN),构建端到端的时间序列滑坡检测模型。
-
训练和评估: 训练模型并评估其在时间序列数据上的性能。
通过上述步骤,您将拥有一个完整的多传感器滑坡检测系统,包括数据集、预训练模型和相关的训练流程。希望这些代码能帮助您更好地利用该数据集!