输电线路语义分割图像数据集,图片总共1200张左右,包含分割标签,json标签
输电线路语义分割图像数据集介绍
数据集概述
名称:输电线路语义分割图像数据集
图片数量:约1200张
标注格式:JSON (包含像素级分割标签)
类别:
- 背景 (Background)
- 输电线路 (Transmission Line)
- 其他相关对象(如绝缘子、杆塔等,具体类别根据数据集定义)
用途:用于输电线路的语义分割任务,适用于电力系统的安全监控、维护和故障预防等。该数据集特别适合基于深度学习的语义分割模型。
数据集特点
- 规模:包含约1200张高分辨率图像,每张图像都带有详细的像素级分割标签。
- 多样性:图像涵盖了不同的光照条件(白天、夜晚)、天气状况(晴天、阴天、雨天)、背景环境(城市、乡村、山地)以及不同类型的输电线路及相关对象,以确保模型能够适应多样的实际场景。
- 标注质量:每张图像都有精确的手动标注,确保了高质量的训练数据。
- 标注格式:
- JSON格式:每个图像的分割标签存储在一个JSON文件中,包含像素级别的分类信息。
标注信息
- JSON格式:
解释:{ "image_filename": "image_0001.jpg", "width": 800, "height": 600, "annotations": [ { "category_id": 1, "segmentation": [ [100, 100, 150, 100, 150, 150, 100, 150], [200, 200, 250, 200, 250, 250, 200, 250] ] }, { "category_id": 2, "segmentation": [ [300, 300, 350, 300, 350, 350, 300, 350] ] } ] }
"category_id"
表示类别的ID,"segmentation"
包含边界点的坐标列表,用于描述每个对象的轮廓。
应用领域
- 电力系统安全监控:自动检测并报告输电线路的状态,提高电力系统的安全性。
- 维护与故障预防:及时发现潜在的安全隐患,辅助进行定期维护和故障预防。
- 智能巡检:结合无人机或地面机器人,实现自动化巡检,减少人工成本。
- 数据分析:通过数据分析,提供关于输电线路状态的统计报告,优化维护策略。
获取方式
通常情况下,研究人员可以通过官方提供的链接或相关机构网站下载该数据集。请注意,使用时应遵循相应的许可协议和引用要求。
关键代码示例
1. 下载数据集
假设我们已经有了数据集的下载链接,可以使用 Python 的 requests
库来下载数据集:
import requests
import os
# 定义下载链接和保存路径
url = 'http://example.com/path/to/transmission_line_segmentation_dataset.zip' # 替换为实际的下载链接
save_path = './transmission_line_segmentation_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('./transmission_line_segmentation_dataset')
2. 解析 JSON 格式的标注文件
以下是一个解析 JSON 格式标注文件的函数:
import json
import numpy as np
def parse_json_annotation(anno_file, height, width):
with open(anno_file, 'r') as f:
data = json.load(f)
segmentation_mask = np.zeros((height, width), dtype=np.uint8)
for annotation in data['annotations']:
category_id = annotation['category_id']
for segment in annotation['segmentation']:
points = np.array(segment).reshape(-1, 2)
cv2.fillPoly(segmentation_mask, [points], category_id)
return segmentation_mask
3. 加载图像并显示分割掩码
我们可以使用 OpenCV 来加载图像,并使用 Matplotlib 来显示图像及其分割掩码:
import cv2
import matplotlib.pyplot as plt
def load_image(image_path):
return cv2.imread(image_path)
def display_image_with_mask(image, mask):
fig, axs = plt.subplots(1, 2, figsize=(12, 6))
# 显示原始图像
axs[0].imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
axs[0].set_title('Original Image')
axs[0].axis('off')
# 显示分割掩码
cmap = plt.cm.get_cmap('tab20', 20) # 假设有20个类别
axs[1].imshow(mask, cmap=cmap, vmin=0, vmax=20)
axs[1].set_title('Segmentation Mask')
axs[1].axis('off')
plt.show()
# 示例用法
image_path = './transmission_line_segmentation_dataset/images/image_0001.jpg'
anno_path = './transmission_line_segmentation_dataset/annotations/image_0001.json'
image = load_image(image_path)
height, width, _ = image.shape
mask = parse_json_annotation(anno_path, height, width)
display_image_with_mask(image, mask)
4. 使用数据集进行训练
如果您打算使用这个数据集进行深度学习模型的训练,可以使用 PyTorch 或 TensorFlow 等框架。以下是一个简单的 PyTorch DataLoader 示例:
import torch
from torch.utils.data import Dataset, DataLoader
from PIL import Image
import numpy as np
class TransmissionLineSegmentationDataset(Dataset):
def __init__(self, image_dir, anno_dir, transform=None):
self.image_dir = image_dir
self.anno_dir = anno_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 = Image.open(os.path.join(self.image_dir, img_name)).convert("RGB")
anno_name = img_name.replace('.jpg', '.json')
anno_path = os.path.join(self.anno_dir, anno_name)
image_np = np.array(image)
image_height, image_width, _ = image_np.shape
mask = parse_json_annotation(anno_path, image_height, image_width)
if self.transform:
image = self.transform(image)
mask = self.transform(mask)
return image, mask
# 创建 DataLoader
dataset = TransmissionLineSegmentationDataset(
image_dir='./transmission_line_segmentation_dataset/images',
anno_dir='./transmission_line_segmentation_dataset/annotations'
)
dataloader = DataLoader(dataset, batch_size=4, shuffle=True, num_workers=2)
# 遍历数据
for images, masks in dataloader:
# 在这里进行模型训练
pass
语义分割模型训练
为了使用深度学习模型进行语义分割,您可以选择一些常用的语义分割架构,例如 U-Net、DeepLabV3+ 或者 FCN。以下是使用 PyTorch 和 U-Net 进行训练的一个简单示例:
-
安装依赖库:
pip install torch torchvision
-
准备数据集配置文件: 将数据集转换为PyTorch所需的格式,并创建配置文件(例如
config.yaml
):train: ./transmission_line_segmentation_dataset/train/images val: ./transmission_line_segmentation_dataset/val/images test: ./transmission_line_segmentation_dataset/test/images num_classes: 20 # 类别数
-
定义 U-Net 模型:
import torch.nn as nn class UNet(nn.Module): def __init__(self, num_classes): super(UNet, self).__init__() self.encoder = nn.Sequential( nn.Conv2d(3, 64, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.Conv2d(64, 64, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=2, stride=2) ) self.decoder = nn.Sequential( nn.ConvTranspose2d(64, 64, kernel_size=2, stride=2), nn.ReLU(inplace=True), nn.Conv2d(64, 64, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.Conv2d(64, num_classes, kernel_size=1) ) def forward(self, x): x = self.encoder(x) x = self.decoder(x) return x
-
训练模型: 使用 PyTorch 进行训练:
import torch from torch.optim import Adam from torch.nn import CrossEntropyLoss # 初始化模型、损失函数和优化器 model = UNet(num_classes=20) criterion = CrossEntropyLoss() optimizer = Adam(model.parameters(), lr=0.001) # 训练循环 num_epochs = 50 for epoch in range(num_epochs): model.train() for images, masks in dataloader: optimizer.zero_grad() outputs = model(images) loss = criterion(outputs, masks) loss.backward() optimizer.step() print(f"Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}") # 保存模型 torch.save(model.state_dict(), 'unet_model.pth')
-
评估模型: 训练完成后,可以使用验证集进行评估
model.eval() with torch.no_grad(): for images, masks in val_dataloader: outputs = model(images) # 进行评估(例如计算IoU、mIoU等)
-
推理测试: 使用训练好的模型进行推理测试:
model.load_state_dict(torch.load('unet_model.pth')) model.eval() with torch.no_grad(): for images, _ in test_dataloader: outputs = model(images) # 处理输出结果
通过上述步骤,您将拥有一个完整的输电线路语义分割系统,包括数据集、预训练模型和相关的训练流程。