超大规模滑坡分割数据集,共34604张图像,全部处理为512×512尺度,涵盖航空,无人机,卫星多种传感器类型,涵盖0.1m-10m不同分辨率影像,数据量3.6GB,标注质量高,全部为原始数据,无增强
- 滑坡分割数据集
- 规模:共34,604张图像,数据量约3.6GB
- 图像尺寸:统一处理为512×512像素
- 传感器类型:涵盖航空、无人机、卫星等多种传感器类型
- 分辨率范围:涵盖0.1米至10米的不同分辨率影像
- 标注格式:提供高质量的分割标注(JSON格式)
数据集特点
- 高分辨率影像:所有图像均经过统一处理,确保了图像的一致性和分割模型的训练效率。
- 详细标注:每张图像都有详细的分割区域标注,采用JSON格式。这些标注可以用于训练模型来进行滑坡区域的分割。
- 多样性:数据集包含来自不同传感器的数据,覆盖了广泛的地理区域和不同的分辨率,适用于各种应用场景。
- 原始数据:提供的数据未经任何数据增强处理,保证了数据的真实性和完整性。
数据集统计
图像来源 | 图像张数 | 数据量 |
---|---|---|
航空影像 | ||
无人机影像 | ||
卫星影像 | ||
总计 | 34,604 | 3.6GB |
数据集结构
LandslideSegmentationDataset/
├── images/ # 图像文件
│ ├── image_00001.jpg
│ ├── image_00002.jpg
│ └── ...
├── annotations/ # 分割标注
│ ├── image_00001.json
│ ├── image_00002.json
│ └── ...
└── dataset_info.txt # 数据集描述文件
标注格式示例
每张图像对应一个JSON文件,包含每个目标的分割信息:
{
"image_id": "image_00001",
"width": 512,
"height": 512,
"objects": [
{
"label": "Landslide",
"polygon": [[100, 150], [150, 200], [200, 150], [150, 100]],
"segmentation": [[100, 150, 150, 200, 200, 150, 150, 100]]
},
{
"label": "Landslide",
"polygon": [[250, 300], [300, 350], [350, 300], [300, 250]],
"segmentation": [[250, 300, 300, 350, 350, 300, 300, 250]]
},
...
]
}
使用该数据集进行模型训练
1. 数据预处理与加载
首先,我们需要加载数据并将其转换为适合常用分割模型(如U-Net、DeepLab等)使用的格式。假设你已经安装了PyTorch和其他必要的库。
import os
import json
import numpy as np
from PIL import Image
import torch
from torch.utils.data import Dataset, DataLoader
from torchvision import transforms
class LandslideSegmentationDataset(Dataset):
def __init__(self, image_dir, annotation_dir, transform=None):
self.image_dir = image_dir
self.annotation_dir = annotation_dir
self.transform = transform
self.image_files = [f for f in os.listdir(image_dir) if f.endswith('.jpg')]
self.annotations = {}
# 加载所有标注
for img_file in self.image_files:
ann_file = img_file.replace('.jpg', '.json')
with open(os.path.join(annotation_dir, ann_file), 'r') as f:
self.annotations[img_file] = json.load(f)
def __len__(self):
return len(self.image_files)
def __getitem__(self, idx):
img_name = self.image_files[idx]
img_path = os.path.join(self.image_dir, img_name)
ann_data = self.annotations[img_name]
# 加载图像
image = Image.open(img_path).convert('RGB')
if self.transform:
image = self.transform(image)
# 加载标注
mask = np.zeros((512, 512))
for obj in ann_data['objects']:
seg = np.array(obj['segmentation'][0]).reshape(-1, 2)
cv2.fillPoly(mask, [seg], 1)
mask = torch.from_numpy(mask).float()
return image, mask
# 数据增强
transform = transforms.Compose([
transforms.ToTensor(),
])
# 创建数据集
dataset = LandslideSegmentationDataset(image_dir='LandslideSegmentationDataset/images/', annotation_dir='LandslideSegmentationDataset/annotations/', transform=transform)
# 划分训练集和验证集
train_size = int(0.8 * len(dataset))
val_size = len(dataset) - train_size
train_dataset, val_dataset = torch.utils.data.random_split(dataset, [train_size, val_size])
train_loader = DataLoader(train_dataset, batch_size=4, shuffle=True, num_workers=4)
val_loader = DataLoader(val_dataset, batch_size=4, shuffle=False, num_workers=4)
2. 构建模型
我们可以使用U-Net模型进行语义分割任务。假设你已经安装了PyTorch和其他必要的库。
import torch
import torch.nn as nn
import torch.optim as optim
class UNet(nn.Module):
def __init__(self):
super(UNet, self).__init__()
# 定义网络结构
...
def forward(self, x):
# 前向传播
...
# 初始化模型
model = UNet()
optimizer = optim.Adam(model.parameters(), lr=0.001)
criterion = nn.BCEWithLogitsLoss() # 二分类任务
# 将模型转移到GPU
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)
3. 训练模型
使用定义好的数据加载器和模型进行训练。
num_epochs = 100
for epoch in range(num_epochs):
model.train()
running_loss = 0.0
for i, (inputs, labels) in enumerate(train_loader, 0):
inputs, labels = inputs.to(device), labels.to(device)
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels.unsqueeze(1))
loss.backward()
optimizer.step()
running_loss += loss.item() * inputs.size(0)
print(f'Epoch {epoch+1}/{num_epochs}, Loss: {running_loss/len(train_dataset)}')
# 在验证集上评估模型
model.eval()
with torch.no_grad():
correct = 0
total = 0
for inputs, labels in val_loader:
inputs, labels = inputs.to(device), labels.to(device)
outputs = model(inputs)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print(f'Accuracy of the network on the validation set: {100 * correct // total}%')
4. 评估模型
在验证集上评估模型性能。
# 在验证集上评估模型
model.eval()
with torch.no_grad():
correct = 0
total = 0
for inputs, labels in val_loader:
inputs, labels = inputs.to(device), labels.to(device)
outputs = model(inputs)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print(f'Accuracy of the network on the validation set: {100 * correct // total}%')
5. 推理
使用训练好的模型进行推理。
def infer(model, image_path):
image = Image.open(image_path).convert('RGB')
image = transform(image).unsqueeze(0).to(device)
model.eval()
with torch.no_grad():
output = model(image)
prediction = torch.sigmoid(output) >= 0.5
return prediction.squeeze().cpu().numpy()
# 示例推理
image_path = 'path/to/test/image.jpg'
prediction = infer(model, image_path)
实验报告
实验报告应包括以下内容:
- 项目简介:简要描述项目的背景、目标和意义。
- 数据集介绍:详细介绍数据集的来源、规模、标注格式等。
- 模型选择与配置:说明选择的模型及其配置参数。
- 训练过程:记录训练过程中的损失变化、学习率调整等。
- 评估结果:展示模型在验证集上的性能指标(如准确率、F1分数)。
- 可视化结果:提供一些典型样本的分割结果可视化图。
- 结论与讨论:总结实验结果,讨论可能的改进方向。
- 附录:包含代码片段、图表等补充材料。
依赖库
确保安装了以下依赖库:
pip install torch torchvision opencv-python
总结
这个超大规模滑坡分割数据集提供了丰富的标注数据,非常适合用于训练和评估语义分割模型。通过U-Net等分割模型框架,可以方便地构建和训练高性能的滑坡分割模型。实验报告可以帮助你更好地理解和分析模型的表现,并为进一步的研究提供参考。
标签:inputs,labels,image,torch,超大规模,model,集之,数据,self From: https://blog.csdn.net/2401_88441190/article/details/143235307