【SegNet搭建-pytorch】反池化上采样indices的记录

【SegNet搭建-pytorch】加载预训练权重+利用反池化上采样记录indices

说明:该文章为个人笔记,存在不完整,敬请谅解~~~
论文地址:https://arxiv.org/pdf/1511.00561.pdf

1 掌握

  • 1、加载预训练模型(迁移学习);
  • 2、采用反池化(max pooling)进行上采样,记录使用indices方法;

2 SegNet参考模型图

在这里插入图片描述

3、记录indices技巧(关键部分)

import torch
import torch.nn as nn
from torchvision.models import vgg16

#############1 加载预训练模型################
vgg16_pretrained = vgg16(pretrained=True) 
print(vgg16_pretrained)        #查看vgg16网络架构

#############2 定义需要返回maxpooling中indices索引值###########
for index in [4, 9, 16, 23, 30]:  # 定义返回maxpooling-indices的层
    vgg16_pretrained.features[index].return_indices = True

class SegNet(nn.Module):  # SegNet模型搭建
    def __init__(self):
        super(SegNet, self).__init__()
        # encode layers, maxpool_indices
        self.encode1 = vgg16_pretrained.features[:4]  # 左闭右开,第4层取不到。
        self.pool1 = vgg16_pretrained.features[4]     # 第四层 maxpooling层,单独写出来为了forward方面得到indices
		
		......
		
        self.encode5 = vgg16_pretrained.features[24:30]
        self.pool5 = vgg16_pretrained.features[30]

        self.decode5 = decoder(512, 512)
        self.uppool5 = nn.MaxUnpool2d(2,2)
		
		....
        
        self.decode1 = decoder(64, 12, 2)
        self.unpool1 = nn.MaxUnpool2d(2, 2)
        
    def forward(self, x):  # 前向传播
        encode1 = self.encode1(x)
        encode1_size = encode1.size()  # 3 此处定义size,为方面后面使用反池化的feature map大小
        pool1, indices1 = self.pool1(encode1)  ##### 4 获取encode阶段的indices#################
		...
        encode5 = self.encode4(pool4)
        encode5_size = encode5.size()
        pool5, indices5 = self.pool5(encode5)
        
		############ 5 反池化indices和输出的size大小#########################
        
        unpool5 = self.uppool5(input=pool5, indices=indices5, output_size=encode5_size)   
        decoder5 = self.decode5(input=unpool5)
		...
        unpool1 = self.unpool1(input=decoder2, indices=indices1, output_size=encode1_size)
        decoder1 = self.decoder1(unpool1)

        return decoder1

4、模型搭建

import torch
import torch.nn as nn
from torchvision.models import vgg16

#############1 加载预训练模型################
vgg16_pretrained = vgg16(pretrained=True) 
print(vgg16_pretrained)        #查看vgg16网络架构

#############2 定义需要返回maxpooling中indices索引值###########
for index in [4, 9, 16, 23, 30]:  # 定义返回maxpooling-indices的层
    vgg16_pretrained.features[index].return_indices = True

def decoder(input_channels, output_channels, num=3):  # 解码器
    if num == 3:
        block = nn.Sequential(
            nn.Conv2d(input_channels, input_channels, kernel_size=(3, 3), padding=1),
            nn.Conv2d(input_channels, input_channels, kernel_size=(3, 3), padding=1),
            nn.Conv2d(input_channels, output_channels, kernel_size=(3, 3), padding=1)
        )
    elif num == 2:
        block = nn.Sequential(
            nn.Conv2d(input_channels, input_channels, kernel_size=(3, 3), padding=1),
            nn.Conv2d(input_channels, output_channels, kernel_size=(3, 3), padding=1)
        )

    return block

class SegNet(nn.Module):  # SegNet模型搭建
    def __init__(self):
        super(SegNet, self).__init__()
        # encode layers, maxpool_indices
        self.encode1 = vgg16_pretrained.features[:4]  # 左闭右开,第4层取不到。
        self.pool1 = vgg16_pretrained.features[4]     # 第四层 maxpooling层,单独写出来为了forward方面得到indices

        self.encode2 = vgg16_pretrained.features[5:9]
        self.pool2 =vgg16_pretrained.featuresp[9]

        self.encode3 = vgg16_pretrained.features[10:16]
        self.pool3 = vgg16_pretrained.features[16]

        self.encode4 = vgg16_pretrained.features[17:23]
        self.pool4 = vgg16_pretrained.features[23]

        self.encode5 = vgg16_pretrained.features[24:30]
        self.pool5 = vgg16_pretrained.features[30]

        self.decode5 = decoder(512, 512)
        self.uppool5 = nn.MaxUnpool2d(2,2)

        self.decode4 = decoder(512,256)
        self.uppool4 = nn.MaxUnpool2d(2,2)

        self.decode3 =decoder(256, 128)
        self.uppool3 = nn.MaxUnpool2d(2,2)

        self.decode2 = decoder(128, 64, 2)
        self.unpool2 = nn.MaxUnpool2d(2, 2)

        self.decode1 = decoder(64, 12, 2)
        self.unpool1 = nn.MaxUnpool2d(2, 2)
        
    def forward(self, x):  # 前向传播
        encode1 = self.encode1(x);print('encode1:', encoder1.size())
        encode1_size = encode1.size()  # 此处定义size,为方面后面使用反池化的feature map大小
        pool1, indices1 = self.pool1(encode1)  ##### 获取encode阶段的indices

        encode2 = self.encode2(pool1)
        encode2_size = encode2.size()
        pool2, indices2 = self.pool2(encode2)

        encode3 = self.encode3(pool2)
        encode3_size = encode3.size()
        pool3, indices3 = self.pool3(encode3)

        encode4 = self.encode4(pool3)
        encode4_size = encode4.size()
        pool4, indices4 = self.pool4(encode4)

        encode5 = self.encode4(pool4)
        encode5_size = encode5.size()
        pool5, indices5 = self.pool5(encode5)

        unpool5 = self.uppool5(input=pool5, indices=indices5, output_size=encode5_size)   # 反池化注意indices和输出的size大小
        decoder5 = self.decode5(input=unpool5)

        unpool4 = self.uppool4(input=decoder5,indices = indices4, output_size = encode4_size)
        decoder4 = self.decode4(unpool4)

        unpool3 = self.uppool3(input=decoder4, indices=indices3, output_size=encode3_size)
        decoder3 = self.decode3(unpool3)

        unpool2 = self.unpool2(input=decoder3, indices=indices2, output_size=encode2_size)
        decoder2 = self.decoder2(unpool2)

        unpool1 = self.unpool1(input=decoder2, indices=indices1, output_size=encode1_size)
        decoder1 = self.decoder1(unpool1)

        return decoder1
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 要使用SegNet PyTorch版本来训练自己的数据集,需要按照以下步骤进行操作。 首先,将自己的数据集准备好。数据集应包含带有相应标签的图像。确保所有图像的分辨率一致,并且标签图像与输入图像大小相匹配。 接下来,下载SegNet PyTorch版本的源代码,并配置所需的环境。PyTorch的安装是必需的,你可以根据自己的系统进行安装。此外,还需要安装其他可能需要的依赖项。 然后,将准备好的数据集分为训练集和测试集。确保训练集与测试集的标签图像都包含在对应的文件夹中,并且文件名与其对应的输入图像相同。 接下来,修改SegNet源代码以适应自己的数据集。在训练和测试过程中,需要根据数据集的类别数量修改网络的输出通道数,并根据输入图像的大小调整网络的输入尺寸。 在修改好源代码后,进行训练。使用训练集数据来训练网络,并调整超参数以达到更好的性能。可以通过调节批次大小、学习率和迭代次数等来调整训练速度和准确性。 训练完成后,可以使用测试集数据来评估网络的性能。查看网络在测试集上每个类别的预测结果,并计算准确性、精确度和召回率等评价指标。 最后,可以使用训练好的SegNet模型来对未知图像进行预测。加载模型并对待预测图像进行处理,最后得到图像的分割结果。 以上就是使用SegNet PyTorch版本训练自己的数据集的基本步骤。通过适应自己的数据集和调整超参数,可以获得更好的语义分割模型。 ### 回答2: SegNet是一种用于图像语义分割的深度学习模型,其可以用于将输入图像分为不同的语义类别。如果要在PyTorch中使用SegNet模型,需要先准备自己的数据集并对其进行相应的处理。 首先,数据集需要包括输入图像和对应的标签图像。输入图像作为模型的输入,标签图像包含每个像素的语义类别信息。可以使用图像标注工具如labelImg对图像进行手动标注,或者使用已有的语义标注数据集。 接下来,需要将数据集分为训练集和验证集。可以按照一定的比例将数据集划分为两部分,其中一部分用于模型的训练,另一部分用于验证模型的性能。 然后,需要对数据集进行预处理。预处理的步骤包括图像的缩放、归一化和图像增强等。在PyTorch中,使用torchvision.transforms中的函数可以方便地进行这些处理。 接下来,需要定义数据加载器。可以使用PyTorch的DataLoader类读取预处理后的数据集,并将其提供给模型进行训练和验证。 在开始训练之前,需要加载SegNet模型。在PyTorch中,可以通过torchvision.models中的函数加载预定义的SegNet模型。可以选择预训练好的模型权重,或者将模型初始化为随机权重。 然后,需要定义损失函数和优化器。对于语义分割问题,常用的损失函数是交叉熵损失函数。可以使用torch.nn.CrossEntropyLoss定义损失函数。优化器可以选择Adam或SGD等常用的优化算法。 最后,开始模型的训练和验证。使用torch.nn.Module类创建SegNet模型的子类,并实现其forward函数。然后,通过迭代训练集的每个批次,使用损失函数计算损失,并使用优化器更新模型的参数。在每个epoch结束后,使用验证集评估模型的性能。 以上就是在PyTorch中使用SegNet模型进行图像语义分割的基本流程。通过按照上述步骤对自己的数据集进行处理,即可使用SegNet模型训练和验证自己的图像语义分割任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值