CCNet

本文介绍了一种基于PyTorch的递归纵横交叉注意力机制,用于捕获图像中的远程依赖关系,提升语义分割任务的性能。通过两次纵横交叉注意力模块的递归应用,每个像素能够获取到所有像素的上下文信息。
部署运行你感兴趣的模型镜像

code pytorch

两种基于注意力的上下文aggregation图
  1. 对于每个位置(例如蓝色),Non-local模块都会生成密集的注意力图,该图的权重为H×W(绿色)。
  2. 对于每个位置(例如蓝色),criss-cross注意模块会生成一个稀疏的注意图,该图仅具有H + W-1个权重。 循环操作后,最终输出特征图中的每个位置(例如红色)都可以捕获所有像素的远程依赖关系。 为了清晰显示,忽略了残差连接。
    在这里插入图片描述
1.Overall

在这里插入图片描述

  • 图2是网络的基本的结构。输入图像经过深度卷积神经网络(DCNN)传递,生成特征图X。
    获得特征图X之后,我们首先应用卷积层以获得降维的特征图H,然后将特征图H放入纵横交错注意(CCA)模块并生成新的特征图H‘,这些特征图H’汇聚长距离的上下文信息并且每个像素以十字交叉的方式进行同步。

  • 特征图H‘仅在水平和垂直方向上聚合上下文信息,这对于语义分割而言还不够。 为了获得更丰富和更密集的上下文信息,我们将特征图H’再次输入到交叉注意模块中,然后输出特征图H‘’。 因此,特征图H‘’中的每个位置实际上收集了来自所有像素的信息。 前后两个纵横交错的注意模块共享相同的参数,以避免添加过多的额外参数。 此递归结构命名为递归纵横交叉注意(RCCA)模块。

  • 然后,我们将密集的上下文特征H‘’与局部表示特征X连接起来。紧接着是一层或数个具有批量归一化和激活以进行特征融合的卷积层。 最后,将融合的特征输入进分割层以生成最终的分割图。

2.Criss-Cross Attention

在这里插入图片描述

  • 如图3所示,局部特征H∈RC×W×H,criss-cross注意模块首先在H上应用两个具有1×1 filters的卷积层,分别生成两个特征图Q和K,其中{Q,K}∈RC’×W×H。C’是特征图的通道数,由于尺寸缩减,C‘小于C。在获得特征图Q和K之后,我们通过Affinity运算进一步生成注意力图A∈R(H + W-1)×W×H。 在特征图Q的空间维度上的每个位置u,我们都可以得到向量Qu∈R C’。 同理,我们可以通过从K中提取特征向量来获得集合Ωu,K是与u处于同一行或同一列。因此,Ωu∈R(H + W-1)×C‘,Ωi,u∈R C’是Ωu的第i个元素。

  • Affinity运算的定义如下:
    在这里插入图片描述
    其中di,u∈D表示特征Qu与Ωi,u的相关程度,i = [1,…,|Ωu|],D∈R(H + W-1)×W× H。 然后,我们沿着channel维度在D上应用softmax层,以计算注意力图A。

  • 然后在H上应用另一个具有1×1 filters的卷积层以生成V∈R C×W×H以进行特征自适应。 在特征图V的空间维度上的每个位置u,我们都可以获得向量Vu∈RC和集合Φu∈R(H + W-1)×C。 集合Φu是V中的特征向量的集合,这些特征向量位于位置为u的同一行或同一列中。 远程上下文信息由Aggregation操作收集:
    在这里插入图片描述
    其中H’u表示输出特征图H’∈R C×W×H在位置u处的特征向量。 Ai,u是通道i和位置u处的标量值。将上下文信息添加到局部特征H中以增强局部特征并增强按像素表示。 因此,它具有广阔的上下文视图,并根据空间注意力图选择性地聚合上下文。

3.Recurrent Criss-Cross Attention

在这里插入图片描述

  • 尽管纵横交错的注意力模块可以捕获水平和垂直方向的远程上下文信息,但像素与像素周围的连接仍然稀疏。 我们基于上述的纵横交叉注意模块引出了反复纵横交叉注意。 循环交叉注意模块可以展开为R个循环。在第一个循环中,纵横交错的注意力模块将从CNN模型中提取的特征地图H作为输入,并将特征地图H’作为输出,其中H和H‘具有相同的形状。 在第二个循环中,纵横交错的注意力模块将输入特征图H’作为输入和输出特征图H‘’。
    如图2所示,循环纵横交错注意模块具有两个循环(R = 2),足以从所有像素中获取远程依存关系,以生成具有密集且丰富的上下文信息的新特征图。

  • A和A‘分别作为循环1和循环2中的注意图。 由于我们只对上下文信息的空间维度而不是通道维度感兴趣,因此可以将具有1×1filters的卷积层视为相同的连接。 另外,从位置x ‘,y’到权重Ai,x,y的映射函数定义为

  • 在这里插入图片描述

  • 对于特征图H’’上的任何位置u和特征图H上的任何位置θ,如果R = 2,则存在连接。一种情况是u和θ在同一行或同一列中:
    在这里插入图片描述

  • 其中←表示附加操作。 另一种情况是u和θ不在同一行和同一列中。 图4显示了上下文信息在空间维度上的传播路径:
    在这里插入图片描述

  • 通常,我们的循环交叉注意模块弥补了交叉注意模块无法从所有像素获取密集上下文信息的不足。 与纵横交错注意模块相比,循环纵横交错注意模块(R = 2)不会带来额外的参数,并且可以以较小的计算增量为代价实现更好的性能。

您可能感兴趣的与本文相关的镜像

PyTorch 2.6

PyTorch 2.6

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

复现CCNet相关内容可按以下步骤进行: ### 安装显卡驱动 可通过源代码方式,然后进行驱动安装,但具体的源代码及安装步骤未在给定内容中详细说明,需进一步查找相关文档。 ### 环境配置 - **Anaconda3下创建新环境**:使用Anaconda3创建一个新的虚拟环境,为后续的依赖安装提供独立的环境。 - **安装CUDA10.2**:CUDA是NVIDIA推出的并行计算平台和编程模型,CCNet的运行依赖于CUDA进行加速计算,因此需要安装CUDA10.2版本。 - **安装cuDNN**:cuDNN是NVIDIA提供的深度神经网络库,可加速深度神经网络的计算,安装它能提高CCNet的运行效率。 ### 编译 - **下载CCNet**:从相关代码仓库下载CCNet的源代码。 - **安装编译Apex**:Apex是一个用于混合精度训练和分布式训练的工具包,编译安装它有助于提高训练效率。 - **安装编译Inplace**:具体的Inplace功能未详细说明,但编译安装它是复现CCNet的必要步骤之一。 ### 数据集和预训练模型 - **城市景观数据集**:CCNet常用于语义分割任务,城市景观数据集可用于训练和评估模型的性能。 - **预训练**:使用预训练模型可以加快模型的收敛速度,提高训练效果。 ### 训练 完成上述步骤后,就可以使用准备好的数据集和预训练模型对CCNet进行训练。 以下是CCNet的模型代码示例: ```python import torch import torch.nn as nn import ResNet import RCCAModule class CCNet(nn.Module): def __init__(self, num_classes): super(CCNet, self).__init__() self.backbone = ResNet.resnet50(replace_stride_with_dilation=[1,2,4]) self.decode_head = RCCAModule(recurrence=2, in_channels=2048, num_classes=num_classes) def forward(self, x): x = self.backbone(x) x = self.decode_head(x) return x if __name__ == "__main__": model = CCNet(num_classes=2) x = torch.randn(2, 3, 224, 224) model.cuda() out = model(x.cuda()) print(out.shape) ```
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值