DeepLabV3+进行GID遥感图像语义分割:从数据准备到模型训练 进行学习率调度, 损失函数优化

使用DeepLabV3+进行GID遥感图像语义分割:从数据准备到模型训练 如何进行学习率调度, 损失函数优化


本人不才。

仅供参考,同学。

以DeepLabV3+为例,提供一个基本的代码框架来帮助开始训练GID数据集。此示例使用PyTorch框架,并假设同学尼亚,已经安装了必要的库,如torch, torchvision, 和用于数据增强和处理的albumentations等。
在这里插入图片描述

DeepLabV3+ 模型训练GID数据集

安装依赖

确保安装了所有需要的库:

pip install torch torchvision albumentations opencv-python

在这里插入图片描述

数据加载与预处理

创建一个自定义的数据加载器来加载GID数据集并进行必要的预处理:

import torch
from torch.utils.data import Dataset, DataLoader
import cv2
import os
import numpy as np
import albumentations as A
from albumentations.pytorch.transforms import ToTensorV2

class GIDSegmentationDataset(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_path = os.path.join(self.image_dir, self.images[idx])
        mask_path = os.path.join(self.mask_dir, self.images[idx].replace(".jpg", "_mask.png"))
        image = cv2.imread(img_path)
        mask = cv2.imread(mask_path, 0)  # Load grayscale mask

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

        return image, mask.long()

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

在这里插入图片描述

模型定义

接下来是DeepLabV3+模型的定义:

import torchvision
from torchvision.models.segmentation.deeplabv3 import DeepLabHead

def createDeepLabv3(outputchannels=15):
    """创建DeepLabV3+模型实例"""
    model = torchvision.models.segmentation.deeplabv3_resnet101(pretrained=True, progress=True)
    model.classifier = DeepLabHead(2048, outputchannels)
    return model

model = createDeepLabv3(outputchannels=15).cuda()  # 假设GID-15有15个类别

在这里插入图片描述

训练过程

最后,设置训练循环:

import torch.optim as optim

# 设置训练参数
num_epochs = 20
learning_rate = 0.001
batch_size = 8

dataset = GIDSegmentationDataset(image_dir="path/to/images", mask_dir="path/to/masks", transform=transform)
dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True)

optimizer = optim.Adam(model.parameters(), lr=learning_rate)
criterion = torch.nn.CrossEntropyLoss()

for epoch in range(num_epochs):
    model.train()
    running_loss = 0.0
    for images, masks in dataloader:
        images = images.cuda()
        masks = masks.cuda()
        
        optimizer.zero_grad()
        outputs = model(images)['out']
        loss = criterion(outputs, masks)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
    
    print(f"Epoch {epoch+1}/{num_epochs}, Loss: {running_loss/len(dataloader)}")

仅提供了一个基本的框架,具体实现可能需要根据实际情况(例如数据路径、类别数量等)进行调整。

为了在学习率调度和损失函数优化方面进行深入探索,采取多种策略来提高模型的性能。

以下是一些常用的方法及其实现示例。仅供参考。

学习率调度

  1. StepLR:每隔固定epoch数降低学习率。
  2. ReduceLROnPlateau:当监控量(如验证损失)停止下降时降低学习率。
  3. CosineAnnealingLR:基于余弦函数周期性地调整学习率。

损失函数优化

除了常用的交叉熵损失,对于不平衡数据集,可以考虑使用加权交叉熵损失或Focal Loss等方法来处理类别不平衡问题。

代码实现

如何将这些技术集成到您的训练流程中的示例代码:

import torch
from torch.optim.lr_scheduler import StepLR, ReduceLROnPlateau, CosineAnnealingLR
import torch.nn as nn
import torch.optim as optim

# 假设已经定义了模型、dataloader、optimizer等

# StepLR 示例
step_lr_scheduler = StepLR(optimizer, step_size=7, gamma=0.1)

# ReduceLROnPlateau 示例
reduce_on_plateau_scheduler = ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=5, verbose=True)

# CosineAnnealingLR 示例
cosine_annealing_scheduler = CosineAnnealingLR(optimizer, T_max=10, eta_min=0)

# 加权交叉熵损失函数,适用于类别不平衡的情况
class_weights = torch.tensor([1.0, 2.0, 1.5, ...], dtype=torch.float).cuda()  # 根据实际情况设置权重
criterion = nn.CrossEntropyLoss(weight=class_weights)

# Focal Loss 实现
class FocalLoss(nn.Module):
    def __init__(self, alpha=1, gamma=2, reduction='mean'):
        super(FocalLoss, self).__init__()
        self.alpha = alpha
        self.gamma = gamma
        self.reduction = reduction
        self.criterion = nn.CrossEntropyLoss(reduction='none')  # 不直接应用reduction

    def forward(self, inputs, targets):
        ce_loss = self.criterion(inputs, targets)
        pt = torch.exp(-ce_loss)
        focal_loss = self.alpha * (1 - pt) ** self.gamma * ce_loss
        if self.reduction == 'mean':
            return focal_loss.mean()
        elif self.reduction == 'sum':
            return focal_loss.sum()
        else:
            return focal_loss

focal_loss = FocalLoss(alpha=1, gamma=2)

# 训练循环示例,使用ReduceLROnPlateau作为例子
for epoch in range(num_epochs):
    model.train()
    running_loss = 0.0
    for images, masks in dataloader:
        images = images.cuda()
        masks = masks.cuda()

        optimizer.zero_grad()
        outputs = model(images)['out']
        loss = criterion(outputs, masks)  # 或者使用 focal_loss(outputs, masks)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
    
    avg_loss = running_loss / len(dataloader)
    print(f"Epoch {epoch+1}/{num_epochs}, Loss: {avg_loss}")
    
    # 调整学习率
    reduce_on_plateau_scheduler.step(avg_loss)  # 对于其他调度器,根据需要调整此处调用

进一步优化建议

  • 混合精度训练:使用torch.cuda.amp自动混合精度训练以加速训练并减少显存占用。
  • 数据增强:更复杂的数据增强策略可以增加模型的泛化能力。
  • 模型剪枝与量化:对模型进行剪枝和量化以减少计算成本和存储需求。
  • 迁移学习:利用预训练模型并在其基础上微调,特别是在数据量有限的情况下非常有用。

通过结合上述策略,您可以进一步优化模型的训练过程,从而获得更好的性能。请根据具体应用场景调整参数和方法。

### DeepLabV3+ 实现遥感图像语义分割 #### 模型概述 DeepLabV3+ 是一种高效的语义分割模型,其核心在于结合编码器-解码器架构以及 ASPP(Atrous Spatial Pyramid Pooling)模块来提升多尺度特征提取的能力[^2]。对于遥感图像语义分割任务,该模型能够很好地适应高分辨率和复杂场景的需求。 #### 数据准备 在实际应用中,可以选用公开的数据集如 GID 或 LoveDA 来训练模型[^1]。这些数据集中包含了丰富的标注信息,适合用于验证模型性能。如果使用自定义数据集,则需按照标准格式整理并划分成训练集、验证集和测试集。 #### 环境搭建 为了快速上手,推荐使用 PaddleSeg 工具包中的预置功能完成环境配置与模型部署工作[^3]。以下是具体的安装命令: ```bash pip install paddlepaddle-gpu==2.4.0 # 安装飞桨框架 (GPU 版本) pip install paddleslim # 可选:轻量化工具 git clone https://github.com/PaddlePaddle/PaddleSeg.git cd PaddleSeg && pip install -r requirements.txt ``` #### 训练过程 下面展示如何基于 PaddleSeg 库运行一个完整的训练脚本: ```python from paddleseg.cvlibs import Config, SegBuilder import paddleseg.transforms as T from paddleseg.datasets import Dataset # 配置文件路径 cfg_path = 'configs/deeplabv3+/deeplabv3+_xception_512x512_8k.yml' config = Config(cfg_path) train_transforms = [ T.RandomHorizontalFlip(), T.ResizeStepScaling(min_scale_factor=0.75, max_scale_factor=2), ] val_transforms = [T.Normalize(mean=[0.5], std=[0.5])] dataset_train = Dataset( transforms=train_transforms, dataset_root='path/to/your/dataset', num_classes=config.dic['num_classes'], mode='train') model_builder = SegBuilder(config) trainer = model_builder.model optimizer = model_builder.optimizer for epoch in range(epochs): trainer.train_one_epoch(optimizer, train_dataset=dataset_train) ``` 上述代码片段展示了如何设置数据增强操作,并调用 `train_one_epoch` 方法逐步迭代优化参数。 #### 推理阶段 当模型收敛后即可进入推理环节,这里给出一段简单的预测函数作为参考: ```python import cv2 import numpy as np from PIL import Image def predict_image(image_path, trained_model): img = cv2.imread(image_path).astype('float32') / 255. input_tensor = np.transpose(img, axes=(2, 0, 1))[np.newaxis,...] result = trained_model(input_tensor)[0].argmax(axis=0) colored_mask = decode_segmap(result.numpy()) # 自定义颜色映射逻辑 return Image.fromarray(colored_mask.astype(np.uint8)) predicted_img = predict_image('test.jpg', trainer) predicted_img.save('output.png') ``` 此部分实现了单张图片输入到输出可视化掩膜的过程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值