图像分割实战-系列教程16:deeplabV3+ VOC分割实战4-------网络结构2

发布时间:2024年01月20日

在这里插入图片描述

🍁🍁🍁图像分割实战-系列教程 总目录

有任何问题欢迎在下面留言
本篇文章的代码运行界面均在Pycharm中进行
本篇文章配套的代码资源已经上传

本项目的网络结构在network文件夹中,主要在modeling.py和_deeplab.py中:
modeling.py:指定要用的骨干网络是什么
_deeplab.py:根据modeling.py指定的骨干网络构建实际的网络结构

7、_deeplab.py的 ASPP类

ASPP,Atrous Spatial Pyramid Pooling,空洞空间卷积池化金字塔

class ASPP(nn.Module):
    def __init__(self, in_channels, atrous_rates):
        super(ASPP, self).__init__()
        out_channels = 256
        modules = []
        modules.append(nn.Sequential(
            nn.Conv2d(in_channels, out_channels, 1, bias=False),
            nn.BatchNorm2d(out_channels),
            nn.ReLU(inplace=True)))
        rate1, rate2, rate3 = tuple(atrous_rates)
  1. 定义了一个名为 ASPP 的类,继承自 PyTorch 的 nn.Module 基类
  2. ASPP 类的构造函数,接收输入通道数 in_channels 和一组膨胀率 atrous_rates 作为参数
  3. 调用基类的构造函数来正确初始化 ASPP 类
  4. 定义 ASPP 模块的输出通道数
  5. 初始化一个空的模块列表,用于存放构成 ASPP 的不同组件
  6. 添加一个执行序列模块到 modules 列表
  7. 这个执行序列由 1x1 卷积
  8. 批量归一化
  9. ReLU激活组成
  10. 解包膨胀率
        modules.append(ASPPConv(in_channels, out_channels, rate1))
        modules.append(ASPPConv(in_channels, out_channels, rate2))
        modules.append(ASPPConv(in_channels, out_channels, rate3))
        modules.append(ASPPPooling(in_channels, out_channels))
        self.convs = nn.ModuleList(modules)
        self.project = nn.Sequential(
            nn.Conv2d(5 * out_channels, out_channels, 1, bias=False),
            nn.BatchNorm2d(out_channels),
            nn.ReLU(inplace=True),
            nn.Dropout(0.1), )
  1. 对膨胀率rate1添加一个ASPPConv空洞卷积层到 modules
  2. 对膨胀率rate2添加一个ASPPConv空洞卷积层到 modules
  3. 对膨胀率rate3添加一个ASPPConv空洞卷积层到 modules
  4. 添加一个 ASPPPooling 层到 modules
  5. 将 modules 列表转换为 nn.ModuleList,modules 是python的list数据类型,将其转换成对应的pytorch的数据类型
  6. 定义一个名为project 的执行序列,这个执行序列包含
  7. 一个1*1的二维卷积
  8. 一个批量归一化
  9. 一个ReLU 激活
  10. 一个 Dropout
    def forward(self, x):
        res = []
        for conv in self.convs:
            res.append(conv(x))
        res = torch.cat(res, dim=1)
        return self.project(res)
  1. ASPP 类的前向传播函数
  2. 初始化一个空列表,用于存放不同卷积层的输出
  3. 遍历 self.convs 中的每个卷积层
  4. 将每个卷积层对输入 x 的处理结果添加到 res 列表
  5. 将 res 列表中的所有输出在特征通道维度(dim=1)上进行拼接操作
  6. 将连接后的结果传递给投影层 self.project,并返回最终结果

8、_deeplab.py的 ASPPConv类

class ASPPConv(nn.Sequential):
    def __init__(self, in_channels, out_channels, dilation):
        modules = [
            nn.Conv2d(in_channels, out_channels, 3, padding=dilation, dilation=dilation, bias=False),
            nn.BatchNorm2d(out_channels),
            nn.ReLU(inplace=True)
        ]
        super(ASPPConv, self).__init__(*modules)

9、_deeplab.py的 ASPPPooling类

class ASPPPooling(nn.Sequential):
    def __init__(self, in_channels, out_channels):
        super(ASPPPooling, self).__init__(
            nn.AdaptiveAvgPool2d(1),
            nn.Conv2d(in_channels, out_channels, 1, bias=False),
            nn.BatchNorm2d(out_channels),
            nn.ReLU(inplace=True))

    def forward(self, x):
        size = x.shape[-2:]
        x = super(ASPPPooling, self).forward(x)
        return F.interpolate(x, size=size, mode='bilinear', align_corners=False)
文章来源:https://blog.csdn.net/weixin_50592077/article/details/135710070
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。