【CCNet】《CCNet:Criss-Cross Attention for Semantic Segmentation》

在这里插入图片描述

ICCV-2019


文章目录

  • 1 Background and Motivation
  • 2 Related Work
  • 3 Advantages / Contributions
  • 4 Method
  • 5 Experiments
    • 5.1 Datasets and Metrics
    • 5.2 Experiments on Cityscapess
    • 5.3 Experiments on ADE20K
    • 5.4 Experiments on COCO
  • 6 Conclusion(own)


1 Background and Motivation

分割任务中全局的上下文信息非常重要,如果高效轻量的获取上下文?

Thus, is there an alternative solution to achieve such a target in a more efficient way?

作者提出了 Criss-Cross Attention

相比于 Non-local(【NL】《Non-local Neural Networks》)

复杂度从 O((HxW)x(HxW)) 降低到了 O((HxW)x(H+W-1))

2 Related Work

  • semantic segmentation
  • contextual information aggregation
  • Attention model

3 Advantages / Contributions

  • 提出 Criss-Cross 注意力,capture contextual information from full-image dependencies in a more efficient and effective way
  • 在语义分割数据集 Cityscapes, ADE20K 和实例分割数据 COCO 上均有提升

4 Method

整理流程如下
在这里插入图片描述

Criss-Cross Attention Module 用了两次,叫 recurrent Criss-Cross attention (RCCA) module

下面是和 non-local 的对比
在这里插入图片描述
比如(b)中,计算蓝色块的 attention,绿色块不同深浅表示与蓝色块的相关程度,第一次结合十字架attention得到黄色块,第二次再结合十字架attention,得到红色块

为什么两次,因为一次捕获不到全局上下文信息,两次就可以,如下图

在这里插入图片描述

第一次,计算深绿色块的 Criss-Cross 注意力,只能获取到浅绿色块的信息,蓝色块的信息获取不到,浅绿色可以获取到蓝色块信息
第二次,计算深绿色块的 Criss-Cross 注意力,因为第一次计算浅绿色块注意力时已经有蓝色块信息了,此时,可以获取到蓝色块信息

更细节的 Criss-Cross 注意力图如下
在这里插入图片描述

下面结合图 3 看看公式表达

输入 H ∈ R C × W × H H \in \mathbb{R}^{C \times W \times H} HRC×W×H

query 和 key, { Q , K } ∈ R C ′ × W × H \{Q, K\} \in \mathbb{R}^{{C}' \times W \times H} {Q,K}RC×W×H C ′ {C}' C 为 1/8 C C C

Q u ∈ R C ′ Q_u \in \mathbb{R}^{{C}'} QuRC u u u H × W H \times W H×W 中空间位置索引,特征图 Q 的子集(每个空间位置)

Ω u ∈ R ( H + W − 1 ) × C ′ \Omega_{u} \in \mathbb{R}^{(H + W -1) \times {C}' } ΩuR(H+W1)×C,特征图 K 的子集(每个十字架)

Affinity operation 可以定义为

d i , u = Q u Ω i , u T d_{i,u} = Q_u \Omega_{i, u}^T di,u=QuΩi,uT

Q Q Q上每个空间位置 Q u Q_u Qu,找到 K K K 上对应的同行同列十字架 Ω u \Omega_{u} Ωu i i i 是十字架中空间位置的索引, d i , u ∈ D d_{i,u} \in {D} di,uD D ∈ R ( H + W − 1 ) × W × H D \in \mathbb{R}^{(H+W-1) \times W \times H} DR(H+W1)×W×H Q Q Q K K K 计算的 D D D 经过 softmax 后成 A ∈ R ( H + W − 1 ) × W × H A \in \mathbb{R}^{(H + W -1) \times W \times H} AR(H+W1)×W×H

Q Q Q K K K 计算出来了权重 A A A 最终作用到 K K K 上,形式如下:

H u ′ = ∑ i ∈ ∣ Φ u ∣ A i , u Φ i , u + H u {H}_u^{'} = \sum_{i \in | \Phi_u|} A_{i,u}\Phi_{i,u} + H_u Hu=iΦuAi,uΦi,u+Hu

Φ i , u \Phi_{i,u} Φi,u Ω i , u \Omega_{i, u} Ωi,u,一个是特征图 V V V 的子集,一个是特征图 K K K 的子集, H H H 是输入, H ′ {H}^{'} H 为输出, i i i 是十字架索引, u u u H H H x W W W 空间位置索引

为了使每一个位置 u u u 可以与任何位置对应起来,作者通过两次计算 Criss-cross 来完成,只需对 H ′ {H}^{'} H 再次计算 criss-cross attention,输出 H ′ ′ {H}^{''} H′′,此时就有:

u u u and θ \theta θ in the same row or column
在这里插入图片描述
A A A 表示 loop = 1 时的注意力 weight, A ′ {A}' A 表示 loop = 2 时的 weight

u u u and θ \theta θ not in the same row or column,eg 图 4,深绿色位置是 u u u,蓝色的位置是 θ \theta θ
在这里插入图片描述

在这里插入图片描述
加上
在这里插入图片描述

再看看代码

import torch
import torch.nn as nn
import torch.nn.functional as F
 
def INF(B,H,W):
     return -torch.diag(torch.tensor(float("inf")).cuda().repeat(H),0).unsqueeze(0).repeat(B*W,1,1)
 
class CrissCrossAttention(nn.Module):
    def __init__(self, in_channels):
        super(CrissCrossAttention, self).__init__()
        self.in_channels = in_channels
        self.channels = in_channels // 8
        self.ConvQuery = nn.Conv2d(self.in_channels, self.channels, kernel_size=1)
        self.ConvKey = nn.Conv2d(self.in_channels, self.channels, kernel_size=1)
        self.ConvValue = nn.Conv2d(self.in_channels, self.in_channels, kernel_size=1)
 
        self.SoftMax = nn.Softmax(dim=3)
        self.INF = INF
        self.gamma = nn.Parameter(torch.zeros(1))
 
    def forward(self, x):
        b, _, h, w = x.size()
 
        # [b, c', h, w]
        query = self.ConvQuery(x)
        # [b, w, c', h] -> [b*w, c', h] -> [b*w, h, c']
        query_H = query.permute(0, 3, 1, 2).contiguous().view(b*w, -1, h).permute(0, 2, 1)
        # [b, h, c', w] -> [b*h, c', w] -> [b*h, w, c']
        query_W = query.permute(0, 2, 1, 3).contiguous().view(b*h, -1, w).permute(0, 2, 1)
        
        # [b, c', h, w]
        key = self.ConvKey(x)
        # [b, w, c', h] -> [b*w, c', h]
        key_H = key.permute(0, 3, 1, 2).contiguous().view(b*w, -1, h)
        # [b, h, c', w] -> [b*h, c', w]
        key_W = key.permute(0, 2, 1, 3).contiguous().view(b*h, -1, w)
        
        # [b, c, h, w]
        value = self.ConvValue(x)
        # [b, w, c, h] -> [b*w, c, h]
        value_H = value.permute(0, 3, 1, 2).contiguous().view(b*w, -1, h)
        # [b, h, c, w] -> [b*h, c, w]
        value_W = value.permute(0, 2, 1, 3).contiguous().view(b*h, -1, w)
        
        # [b*w, h, c']* [b*w, c', h] -> [b*w, h, h] -> [b, h, w, h]
        energy_H = (torch.bmm(query_H, key_H) + self.INF(b, h, w)).view(b, w, h, h).permute(0, 2, 1, 3)
        # [b*h, w, c']*[b*h, c', w] -> [b*h, w, w] -> [b, h, w, w]
        energy_W = torch.bmm(query_W, key_W).view(b, h, w, w)
        # [b, h, w, h+w]  concate channels in axis=3 
 
        concate = self.SoftMax(torch.cat([energy_H, energy_W], 3))
        # [b, h, w, h] -> [b, w, h, h] -> [b*w, h, h]
        attention_H = concate[:,:,:, 0:h].permute(0, 2, 1, 3).contiguous().view(b*w, h, h)
        attention_W = concate[:,:,:, h:h+w].contiguous().view(b*h, w, w)
 
        # [b*w, h, c]*[b*w, h, h] -> [b, w, c, h]
        out_H = torch.bmm(value_H, attention_H.permute(0, 2, 1)).view(b, w, -1, h).permute(0, 2, 3, 1)
        out_W = torch.bmm(value_W, attention_W.permute(0, 2, 1)).view(b, h, -1, w).permute(0, 2, 1, 3)
 
        return self.gamma*(out_H + out_W) + x
 
if __name__ == "__main__":
    model = CrissCrossAttention(512)
    x = torch.randn(2, 512, 28, 28)
    model.cuda()
    out = model(x.cuda())
    print(out.shape)

Q,K,A,V 还是比较直接

参考

  • CCNet–于"阡陌交通"处超越恺明Non-local

  • 语义分割系列20-CCNet(pytorch实现)

5 Experiments

5.1 Datasets and Metrics

  • Cityscapes
  • ADE20K
  • COCO

Mean IoU (mIOU, mean of class-wise intersection over union section over union) for Cityscapes and ADE20K and the standard COCO metrics Average Precision (AP) for COCO

5.2 Experiments on Cityscapess

(1)Comparisons with state-of-the-arts
在这里插入图片描述
DPC 用了更强的主干,更多的数据集来 train

在这里插入图片描述

(2)Ablation studies

在这里插入图片描述
消融了下循环的次数,还是很猛的,第一次就提升了 2.9 个点,第二次又提升了 1.8 个

看看效果图,重点看作者圈出来的白色虚线椭圆区域
在这里插入图片描述

对比看看其他的 context aggregation 模块
在这里插入图片描述
作者的 Criss-Cross Attention 比较猛

其次比较猛的是 Non-local,但是作者的计算量小很多

在这里插入图片描述
看看特征图,重点看作者圈出来的绿色十字加号区域
在这里插入图片描述

5.3 Experiments on ADE20K

在这里插入图片描述

5.4 Experiments on COCO

在这里插入图片描述

6 Conclusion(own)

《Large Kernel Matters Improve Semantic Segmentation by Global Convolutional Network》

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/314062.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GEM5 McPAT教程:源代码解读McPAT NoC功耗 arbiter部分

简介 McPAT用的很多,大多只是写个python或perl脚本替换xml文件.没有深入到为什么xml脚本这些值要换,以及这写填进去xml的值是怎么影响计算的.本问从源代码一步步读下来,解释每一步是如何计算的. power 构成: 动态功耗其实更相关于energy McPAT的power 核心是两类,动态和静态…

新年的第一个项目管理计划借助工具制定,真高效!

年终总结刚提交没多久,新年的第一个项目就接踵而来了,是一个中大型项目,也是我做的比较少的类型。之前主要做一些中小型项目,项目的交付周期不长、所需资源也较少,基本上都能顺利的交付,所以一般简要规划下…

【设计模式-6】建造者模式的实现与框架中的应用

建造者模式又被成为生成器模式,是一种使用频率比较低,相对复杂的创建型模式,在很多源码框架中可以看到建造者的使用场景,稍后我们会在本文末尾展示几个框架的使用案例。  建造者模式所构造的对象通常是比较复杂而且庞大的&#x…

PaddleSeg的训练与测试推理全流程(超级详细)

LeNet模型量化 参考文档一.下载项目地址:https://gitee.com/paddlepaddle/PaddleSeg/tree/release%2F2.5/特别注意下载版本: 二.paddlepaddle-gpu安装1.环境安装参考文档:https://gitee.com/paddlepaddle/PaddleSeg/blob/release/2.8/docs/in…

x-cmd pkg | pypinyi - 汉字拼音转换工具

目录 简介首次用户功能特点相关工具进一步探索 简介 pypinyin 是一个汉字拼音转换工具,支持多种词库,多种输出格式,支持自定义词组拼音库或单字拼音库。 首次用户 使用 x env use pypinyin 即可自动下载并使用 在终端运行 eval "$(cur…

计算机中vcruntime140.dll丢失如何修复,马上教会你

在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是“VCRuntime140.dll丢失”。VCRuntime140.dll是Visual C Redistributable Packages的一部分,它提供了许多常用的运行时函数。当这个文件丢失或损坏时,可能会导致某些应…

Python如何对csv文件进行操作

csv是Comma-Separated Values的缩写,是用文本文件形式储存的表格数据,比如如下的表格: 就可以存储为csv文件,文件内容是: No.,Name,Age,Score1,mayi,18,99 2,jack,21,89 3,tom,25,95 4,rain,19,80 假设上述csv文件保存…

基于STM32F103C8T6单片机的DHT11温湿度传感器与OLED显示屏实时动态数据监测系统设计

标题: 摘要: 本文提出了一种利用STM32F103C8T6微控制器,结合DHT11数字温湿度传感器和OLED显示屏实现环境温湿度实时、直观显示的方法。该系统通过低功耗且精确的DHT11传感器获取环境温湿度信息,并借助于STM32F103C8T6强大的处理能…

大模型学习之书生·浦语大模型3——基于InternLM和LangChain搭建知识库

基于InternLM和LangChain搭建知识库 1 大模型开发范式 LLM的局限性 知识受限:最新知识无法实时获取专业能力有限:有广度无深度定制化成本高:训练成本高 RAG VS Finetune RAG: 无需重新训练组织外挂加入知识容易受基座模型的影响…

软件测试|解读Python的requirements.txt文件:管理项目依赖的完整指南

简介 在Python项目中,管理依赖库是必不可少的。requirements.txt文件是一种常用的方式,用于列出项目所需的所有依赖库及其版本。本文将详细介绍requirements.txt的用法,帮助你更好地管理项目的依赖。 使用步骤 创建requirements.txt文件&am…

Linux之Iptables简易应用

文档形成时期:2009-2024年 和iptables打交道有15年了,经过无数实践后,形成一个简易应用文档。 文档主题是简易应用,所以其原理不详述了。 因软件世界之复杂和个人能力之限,难免疏漏和错误,欢迎指正。 文章目…

强化app广告变现用户隐私合规,移动广告变现合规技巧

移动广告技术的发展帮助开发者极大提升了广告变现效率,APP作为用户个人信息处理的重要载体,自从《个人信息保护法》颁布以来,个人信息的使用已经成为监管重点,开发者强化合规意识,让广告变现业务“细水长流”&#xff…

无公网ip如何随时随地远程查看本地群晖NAS存储的文件资源

文章目录 前言本教程解决的问题是:按照本教程方法操作后,达到的效果是前排提醒: 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机:1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…

Cylinder3D论文阅读

Cylindrical and Asymmetrical 3D Convolution Networks for LiDAR Segmentation(2020年论文) 作者:香港中文大学 论文链接:https://arxiv.org/pdf/2011.10033.pdf 代码链接:https://github.com/xinge008/Cylinder3D …

BP神经网络(公式推导+举例应用)

文章目录 引言M-P神经元模型激活函数多层前馈神经网络误差逆传播算法缓解过拟合化结论实验分析 引言 人工神经网络(Artificial Neural Networks,ANNs)作为一种模拟生物神经系统的计算模型,在模式识别、数据挖掘、图像处理等领域取…

【工具栏】RestfulTool 插件的使用(接口开发规范)

目录 1. 安装 2.使用 1. 安装 2.使用 点开控制层,该控制层写了什么接口一目了然 跳转对应的接口,查看代码

基于JAVA+ssm智能旅游线路规划系统设计与实现【附源码】

基于JAVAssm智能旅游线路规划系统设计与实现【附源码】 🍅 作者主页 央顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql…

【Jmeter之get请求传递的值为JSON体实践】

Jmeter之get请求传递的值为JSON体实践 get请求的常见传参方式 1、在URL地址后面拼接,有多个key和value时,用&链接 2、在Parameters里面加上key和value 第一次遇到value的值不是字符串也不是整型,我尝试把json放到value里面&#xff0…

迅为RK3588开发板编译 Buildroot单独编译图形化界面三

第三步:编译 Recovery 首先在 linux 源码目录下输入以下命令进入编译的 UI 界面,进入之后如下所示: ./build.sh 然后将光标移动到第四个 recovery,点击回车即可开始 recovery 的编译,编译过程如下所示: 编…

OpenAI推出GPT商店和ChatGPT Team服务

🦉 AI新闻 🚀 OpenAI推出GPT商店和ChatGPT Team服务 摘要:OpenAI正式推出了其GPT商店和ChatGPT Team服务。用户已经创建了超过300万个ChatGPT自定义版本,并分享给其他人使用。GPT商店集结了用户为各种任务创建的定制化ChatGPT&a…