27 - ASPP模块

论文《Rethinking Atrous Convolution for Semantic Image Segmentation》

1、作用

DeepLabv3是一种先进的语义图像分割系统,它通过使用空洞卷积捕获多尺度上下文来显著提升性能,无需依赖DenseCRF后处理。

2、机制

DeepLabv3的核心机制围绕空洞(扩张)卷积展开。这种技术允许模型控制滤波器的视野,使其能够在多个尺度上捕获空间上下文。DeepLabv3在串联和并联架构中使用空洞卷积来提取密集的特征图,并有效地整合多尺度信息。文章还介绍了Atrous Spatial Pyramid Pooling(ASPP)模块,该模块通过在多个尺度上探索卷积特征并结合图像级特征,用于编码全局上下文。

3、独特优势

1、多尺度上下文捕获

通过在不同配置中使用空洞卷积,DeepLabv3能够从多个尺度捕获上下文信息,这对于准确分割不同大小的对象至关重要。

2、高效密集特征提取

空洞卷积使得模型能够在不需要额外参数或计算资源的情况下提取密集特征图,提高了部署效率。

3、性能提升

ASPP与图像级特征的结合显著提高了模型性能,使其在PASCAL VOC 2012等基准数据集上与其他最先进方法竞争。

4、灵活性和泛化能力

DeepLabv3的框架是通用的,可以应用于任何网络架构,为适应不同的分割任务提供了灵活性。

4、代码

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


# 定义一个包含空洞卷积、批量归一化和ReLU激活函数的子模块
class ASPPConv(nn.Sequential):
    def __init__(self, in_channels, out_channels, dilation):
        modules = [
            # 空洞卷积,通过调整dilation参数来捕获不同尺度的信息
            nn.Conv2d(in_channels, out_channels, 3, padding=dilation, dilation=dilation, bias=False),
            nn.BatchNorm2d(out_channels),  # 批量归一化
            nn.ReLU()  # ReLU激活函数
        ]
        super(ASPPConv, self).__init__(*modules)


# 定义一个全局平均池化后接卷积、批量归一化和ReLU的子模块
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),  # 1x1卷积
            nn.BatchNorm2d(out_channels),  # 批量归一化
            nn.ReLU())  # ReLU激活函数

    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)


# ASPP模块主体,结合不同膨胀率的空洞卷积和全局平均池化
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),  # 1x1卷积用于降维
            nn.BatchNorm2d(out_channels),
            nn.ReLU()))

        # 根据不同的膨胀率添加空洞卷积模块
        for rate in atrous_rates:
            modules.append(ASPPConv(in_channels, out_channels, rate))

        # 添加全局平均池化模块
        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(),
            nn.Dropout(0.5))  # 防止过拟合的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)


# 示例使用ASPP模块
aspp = ASPP(256, [6, 12, 18])
x = torch.rand(2, 256, 13, 13)
print(aspp(x).shape)  # 输出处理后的特征图维度
相关推荐
TracyCoder1232 小时前
BERT:让模型 “读懂上下文” 的双向语言学习法
人工智能·深度学习·bert
前网易架构师-高司机2 小时前
标注好的胃病识别数据集,可识别食管炎,胃炎,胃出血,健康,息肉,胃溃疡等常见疾病,支持yolo, coco json,pascal voc xml格式的标注
深度学习·yolo·数据集·疾病·胃病·胃炎·胃部
Dekesas969510 小时前
【深度学习】基于Faster R-CNN的黄瓜幼苗智能识别与定位系统,农业AI新突破
人工智能·深度学习·r语言
哥布林学者11 小时前
吴恩达深度学习课程四:计算机视觉 第二周:经典网络结构 (三)1×1卷积与Inception网络
深度学习·ai
鼾声鼾语11 小时前
matlab的ros2发布的消息,局域网内其他设备收不到情况吗?但是matlab可以订阅其他局域网的ros2发布的消息(问题总结)
开发语言·人工智能·深度学习·算法·matlab·isaaclab
【建模先锋】13 小时前
特征提取+概率神经网络 PNN 的轴承信号故障诊断模型
人工智能·深度学习·神经网络·信号处理·故障诊断·概率神经网络·特征提取
轲轲0113 小时前
Week02 深度学习基本原理
人工智能·深度学习
smile_Iris14 小时前
Day 40 复习日
人工智能·深度学习·机器学习
深度学习实战训练营14 小时前
TransUNet:Transformer 成为医学图像分割的强大编码器,Transformer 编码器 + U-Net 解码器-k学长深度学习专栏
人工智能·深度学习·transformer
火山kim14 小时前
经典论文研读报告:DAGGER (Dataset Aggregation)
人工智能·深度学习·机器学习