UNet架构训练输电线路、输电杆塔、水泥杆和输电线路木头杆塔的语义分割模型检测输电线路分割

UNet架构训练输电线路、输电杆塔、水泥杆和输电线路木头杆塔的语义分割模型检测输电线路分割

文章目录

      • [1. 环境配置](#1. 环境配置)
      • [2. 数据准备](#2. 数据准备)
      • [3. 创建数据加载器](#3. 创建数据加载器)
      • [4. UNet模型定义](#4. UNet模型定义)
      • [5. 模型训练](#5. 模型训练)
      • [6. 推理与可视化](#6. 推理与可视化)

以下文字及代码仅供参考。
输电线路语义分割图像数据集,输电线路,输电杆塔,水泥杆,输电线路木头杆塔,1200张左右,分割标签:json标签

1

1

1

1

输电线路、输电杆塔、水泥杆和输电线路木头杆塔的语义分割模型,UNet架构。以下是如何准备数据集、训练UNet模型以及构建检测系统的详细步骤。
仅供参考

1. 环境配置

首先确保已经安装了必要的依赖库:

bash 复制代码
pip install torch torchvision albumentations opencv-python tqdm

2. 数据准备

数据集由1200张图像及其对应的JSON格式标签组成。需要将这些JSON标签转换为适合UNet模型使用的mask图像。可以使用Python脚本来完成这一任务。以下是处理JSON到mask图像的示例代码:

python 复制代码
import cv2
import json
import numpy as np
from pathlib import Path

def json_to_mask(json_path, mask_path):
    with open(json_path) as f:
        data = json.load(f)
    
    height, width = data['imageHeight'], data['imageWidth']
    mask = np.zeros((height, width), dtype=np.uint8)
    
    for shape in data['shapes']:
        label = shape['label']
        points = np.array(shape['points'], dtype=np.int32)
        
        # 假设每个类别都有一个唯一的id
        class_id = {'transmission_line': 1, 'tower': 2, 'cement_pole': 3, 'wooden_tower': 4}[label]
        
        cv2.fillPoly(mask, [points], class_id)
    
    cv2.imwrite(mask_path, mask)

# 示例:遍历所有json文件并生成相应的mask
for json_file in Path('path/to/jsons').glob('*.json'):
    mask_file = Path('path/to/masks') / (json_file.stem + '.png')
    json_to_mask(str(json_file), str(mask_file))

根据你的实际路径修改上述代码中的路径。

3. 创建数据加载器

接下来,创建一个PyTorch数据加载器来加载图像和mask:

python 复制代码
import torch
from torch.utils.data import Dataset, DataLoader
import albumentations as A
from albumentations.pytorch import ToTensorV2
import cv2
import numpy as np

class TransmissionLineDataset(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 = list(Path(image_dir).glob('*'))

    def __len__(self):
        return len(self.images)

    def __getitem__(self, idx):
        img_path = self.images[idx]
        mask_path = Path(self.mask_dir) / (img_path.stem + '.png')
        
        image = cv2.imread(str(img_path))
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
        mask = cv2.imread(str(mask_path), 0)

        if self.transform is not None:
            augmented = self.transform(image=image, mask=mask)
            image = augmented['image']
            mask = augmented['mask']
            
        return image, mask

transform = A.Compose(
    [
        A.Resize(height=512, width=512),
        A.Normalize(),
        ToTensorV2(),
    ],
)

train_dataset = TransmissionLineDataset(image_dir='path/to/images', mask_dir='path/to/masks', transform=transform)
train_loader = DataLoader(train_dataset, batch_size=8, shuffle=True)

4. UNet模型定义

定义UNet模型结构:

python 复制代码
import torch.nn as nn
import torch.nn.functional as F

class UNet(nn.Module):
    def __init__(self):
        super(UNet, self).__init__()
        # 定义UNet的各个层(这里省略具体实现)
        # ...
    
    def forward(self, x):
        # 定义前向传播逻辑
        # ...

model = UNet()

参考UNet的原始论文或在线资源来填充UNet的具体实现细节。

5. 模型训练

编写训练循环:

python 复制代码
import torch.optim as optim
from tqdm import tqdm

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = model.to(device)
optimizer = optim.Adam(model.parameters(), lr=1e-4)

for epoch in range(epochs):
    model.train()
    loop = tqdm(train_loader)
    for images, masks in loop:
        images = images.to(device)
        masks = masks.long().to(device)

        optimizer.zero_grad()
        outputs = model(images)
        loss = criterion(outputs, masks)
        loss.backward()
        optimizer.step()

        loop.set_postfix(loss=loss.item())

请根据需要调整损失函数criterion和其他超参数。

6. 推理与可视化

最后,利用训练好的模型进行推理,并可视化结果:

python 复制代码
model.eval()
with torch.no_grad():
    for images, _ in train_loader:
        images = images.to(device)
        predictions = model(images)
        _, predicted_masks = torch.max(predictions, dim=1)
        # 使用opencv或其他库可视化predicted_masks

成功训练出针对输电线路的语义分割模型。

相关推荐
pjj1985418 小时前
深度学习-数据清单——把图片整理成训练可读的 txt
人工智能·深度学习·cnn
憨波个18 小时前
【ASR】Whisper:Robust Speech Recognition via Large-Scale Weak Supervision
人工智能·深度学习·语言模型·whisper·语音识别
手写码匠19 小时前
DeepSeek 函数调用实战:从零搭建一个会“动手“的 AI 助手
人工智能·深度学习·算法·aigc
creator_Li19 小时前
深度学习 学习笔记
pytorch·深度学习
YOLO数据集集合19 小时前
天空反无人机检测数据集 | 无人机检测 多旋翼识别 固定翼识别 低空安防 目标检测9063期
人工智能·yolo·目标检测·计算机视觉·无人机·反无人机
派大_星20 小时前
基于 PyTorch 的 CNN 图片分类学习
pytorch·分类·cnn
深度学习lover21 小时前
<数据集>蚜虫识别<目标检测>
人工智能·深度学习·yolo·目标检测·计算机视觉·蚜虫识别
牧羊人.3331 天前
动手学深度学习 03 | 卷积神经网络实现手写数字识别
人工智能·深度学习·神经网络·算法·cnn
计算机编程-吉哥1 天前
基于YOLO11s的苹果叶片病害检测系统 | 5类病害、2万+数据集、全栈闭环【计算机毕业设计选题推荐】
深度学习·毕业设计·课程设计·计算机毕业设计选题·机器学习毕业设计·大数据毕业设计选题推荐
阳明山水1 天前
从相关到因果:预测科学的因果转向与可识别性挑战
人工智能·深度学习·算法·机器学习·架构