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

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

相关推荐
程序猿追3 天前
那个右下角的小数字怎么“卡”住我打字——我用 HarmonyOS 自己写了一个字数限制输入框
pytorch·华为·harmonyos
xiao5kou4chang6kai43 天前
MATLAB机器学习、深度学习--从数据预处理到模型训练
深度学习·机器学习·matlab·数据预处理
renhongxia13 天前
世界模型作为AGI落地底层底座的作用
人工智能·深度学习·生成对抗网络·自然语言处理·知识图谱·agi
计算机科研狗@OUC3 天前
(cvpr26) AIMDepth: Asymmetric Image-Event Mamba for Monocular Depth Estimation
人工智能·深度学习·计算机视觉
闵孚龙3 天前
《PyTorch 深度修炼》Dataset 和 DataLoader:数据如何喂给模型
人工智能·pytorch·python
β添砖java3 天前
深度学习(22)网络中的网络NiN
人工智能·深度学习
Kobebryant-Manba3 天前
深度学习时候d2l报错和使用问题
人工智能·深度学习
大鱼>3 天前
地平线BPU部署实战:YOLOv8在J5/X3上的算法适配与性能优化
算法·yolo·性能优化
zhangfeng11333 天前
deepspeed zero3 结合 llamafactory 微调 ,save_only_model: true 导致保存时候出错
开发语言·python·深度学习
大模型最新论文速读3 天前
06-16 · LLM 最新论文速览
论文阅读·人工智能·深度学习·机器学习·自然语言处理