DANet: Dual Attention Network for Scene Segmentation

本文提出结合位置注意力机制和通道注意力机制的语义分割网络,通过增强全局特征融合及语义特征间相关性,解决类内不一致性问题,提高分割精度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文从增强全局的特征融合以及语义特征质之间的相关性为切入点,提出了Position Attetion 和 Channel Attention mechanism(位置注意力机制和通道注意力机制)的方法。

目前基于深度学习的语义分割网络采用multi scale融合或者U-Net的结构去融合低层和高层的语义特征,但是还是没有综合考虑各个位置的联系和相关性。因为CNN使用局部感受野进行特征的提取,这就导致即使是相同的像素标签在最终的feature map上的表达也可能不同,致使分割的类内不一致性,产生误分割。 其次,对于语义分割,每个通道的map相当于是对每一类的响应,因此对于通道间的相关性也应着重考虑。

网络架构:

整体网络架构如上图所示,backbone采用ResNet,为更好地进行语义分割,作者对ResNet做出以下改动,将最后的downsampling取消,采用空洞卷积来达到即扩大感受野又保持较高空间分辨率的目的,然后进行两个并行的位置注意力机制和通道注意力机制操作,最终将两个模块的结果进行elementwise操作。

Postion Attention Module:

位置注意力机制模块如上图所示,B、C、D由A卷积得到,维度均为C*H*W。将B、C、D都reshape到C * N(N = H*W);然后将C的转置于B相乘到N*N的矩阵, 对于矩阵的每一个点进行softmax,例如对于i行j列的点(i, j),softmax考虑的是i行的每一个点。然后将D与softmax后的结果相乘并reshape到C*H*W,与A进行elementwise。以上操作如下式所示:

从上式可以直接看出每个位置都融合了其他位置的信息。

Channel Attention Module:

在通道注意力机制中,B与C的转置相乘C*C的矩阵,然后针对C*C的矩阵进行softmax操作,具体如下是所示:

如上式所示,每个通道也融合其他通道的信息。

### 关于Dual Attention Network (DANet) #### 研究论文 Dual Attention Network (DANet) 是一种用于场景分割的神经网络架构,在 CVPR 2019 上发表。该模型旨在通过引入两个不同的注意力模块——位置注意力模块和通道注意力模块,来提升特征表示的质量,进而改进场景分割的效果[^1]。 #### 实现方式 为了实现更有效的特征提取,DANet 设计了两种类型的注意力机制: - **位置注意力模块**:此模块专注于捕捉图像中不同位置之间的空间依赖关系。具体来说,它计算每个像素与其他所有像素的相关性得分,并利用这些分数重新加权原始特征图中的响应值。这有助于突出显示那些对于当前像素分类重要的区域[^3]。 - **通道注意力模块**:这一部分则侧重于理解各个特征通道间的关联度。通过对各层输出执行全局平均池化操作并应用多层感知器(MLP),可以生成一组权重向量;随后将它们乘回原特征映射上,以此强调最具代表性的通道特性。 最终,上述两者的输出会被结合起来形成综合后的特征表达,再经过卷积层转换成预测结果。值得注意的是,这种组合并非简单的叠加,而是采用了更为复杂的融合策略以确保最佳性能表现[^5]。 以下是简化版的位置注意力模块 Python 实现示例: ```python import torch.nn as nn class PositionAttentionModule(nn.Module): """Position attention module""" def __init__(self, in_channels): super(PositionAttentionModule, self).__init__() self.query_conv = nn.Conv2d(in_channels=in_channels, out_channels=in_channels//8, kernel_size=1) self.key_conv = nn.Conv2d(in_channels=in_channels, out_channels=in_channels//8, kernel_size=1) self.value_conv = nn.Conv2d(in_channels=in_channels, out_channels=in_channels, kernel_size=1) self.gamma = nn.Parameter(torch.zeros(1)) self.softmax = nn.Softmax(dim=-1) def forward(self, x): batch_size, channels, height, width = x.size() proj_query = self.query_conv(x).view(batch_size,-1,width*height).permute(0,2,1) proj_key = self.key_conv(x).view(batch_size,-1,width*height) energy = torch.bmm(proj_query,proj_key) attention = self.softmax(energy) proj_value = self.value_conv(x).view(batch_size,-1,width*height) out = torch.bmm(proj_value,attention.permute(0,2,1)) out = out.view(batch_size,channels,height,width) out = self.gamma * out + x return out ``` #### 应用场景 由于 DANet 能够有效地捕捉长距离的空间与通道间的关系,因此非常适合应用于需要精细边界检测以及复杂背景下的目标识别任务。例如城市街景解析、医学影像分析等领域均能受益于此技术所带来的精度增益[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值