【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} H∈RC×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}'} Qu∈RC′, 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}' } Ωu∈R(H+W−1)×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,u∈D, D ∈ R ( H + W − 1 ) × W × H D \in \mathbb{R}^{(H+W-1) \times W \times H} D∈R(H+W−1)×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} A∈R(H+W−1)×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∈∣Φu∣∑Ai,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 Fdef 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_channelsself.channels = in_channels // 8self.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 = INFself.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) + xif __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》



相关文章:
【CCNet】《CCNet:Criss-Cross Attention for Semantic Segmentation》
ICCV-2019 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method5 Experiments5.1 Datasets and Metrics5.2 Experiments on Cityscapess5.3 Experiments on ADE20K5.4 Experiments on COCO 6 Conclusion(own) 1 Ba…...
Qt QSQlite数据库插入字符串中存在单个双引号或单个单引号解决方案
1. 前言 当进行数据库写入或更新时,有时会遇到存在字符串中包含单个双引号或者单引号。 2. 单引号和双引号""作用 在数据库中,字符串常量时需要用一对英文单引号或英文双引号""将字符串常量括起来。 比如: select * …...
Linux系统中的IP地址、主机名、和域名解析
1.IP地址 每一台联网的电脑都会有一个地址,用于和其它计算机进行通讯 IP地址主要有2个版本,V4版本和V6版本(V6很少用,暂不涉及) IPv4版本的地址格式是:a.b.c.d,其中abcd表示0~255的数字&…...
soc算法【周末总结】
1 实验一(SOC误差30%放电实验) 1.1 实验过程 1、对电池包进行充电,将昨天放空的电池包进行充电,充电至SOC40%左右; 2、电池包SOC为38%时,手动修改SOC值为70%,开始放电 3、SOC由70%缓慢降至4…...
SpringBoot之优化高并发场景下的HttpClient并提升QPS
HttpClient优化思路 使用连接池(简单粗暴) 长连接优化(特殊业务场景) httpclient和httpget复用 合理的配置参数(最大并发请求数,各种超时时间,重试次数) 异步请求优化࿰…...
go-zero 如何在任意地方获取yaml中的值
1、config配置文件中新增全局变量 package configimport "github.com/zeromicro/go-zero/rest"type Config struct {rest.RestConfDB struct {DataSource string}Redis struct {Addr stringPassWord stringUserName string}Auth struct {AccessSecret stringAcc…...
C++20结构化绑定应用实例(二百五十六)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…...
改进YOLOv8注意力系列四:结合中心化特征金字塔EVCBlock、大核卷积注意力LKA_Attention、全局注意力MobileViTAttention
改进YOLOv8注意力系列三:结合CrissCrossAttention、ECAAttention、EMAU期望最大化注意力 代码大核卷积注意力LKA_Attention中心化特征金字塔EVCBlock全局注意力MobileViTAttention加入方法各种yaml加入结构本文提供了改进 YOLOv8注意力系列包含不同的注意力机制以及多种加入方…...
idea中使用Lombok 失效,@Slf4j 找不到符号的解决办法
文章目录 一、前言二、问题排查和解决方案三、 其他解决方案3.1 另一种解决方案3.2 参考文章 一、前言 今天在一个多module工程中,新增了一个 springboot(版本 2.2.4.RELEASE) module,像往常一样,我引入了lombok依赖&…...
MySQL修炼手册8:约束与完整性:保证数据的一致性
目录 写在开头1 主键与唯一键约束1.1 PRIMARY KEY约束的作用1.2 主键的复合使用1.3 主键的修改与删除1.4 UNIQUE约束的应用场景1.5 主键与唯一键约束的性能影响1.6 主键的自动增长1.7 主键的最佳实践1.8 独特性与业务需求1.9 避免过度使用唯一约束1.10 主键与唯一键的关系 2 外…...
React入门 - 03(初识 React 组件和 JSX)
本章内容 目录 1.初识 React 组件2.关于 JSX 继上一节的工程案例,我们这一节主要了解一下 React组件和 “JSX 语法”。 前置知识点:ES6模块化&继承 1.初识 React 组件 1、打开 src/index.js文件(项目的入口文件)内容&…...
华为OD机试 - 反射计数(Java JS Python C)
题目描述 给定一个包含 0 和 1 的二维矩阵。 给定一个初始位置和速度,一个物体从给定的初始位置出发,在给定的速度下进行移动,遇到矩阵的边缘则发生镜面发射。 无论物体经过 0 还是 1,都不影响其速度。 请计算并给出经过 t 时间单位后,物体经过 1 点的次数。 矩阵以左…...
Linux系统中使用systemctl命令控制软件的启动和关闭
Linux系统很多软件(内置或第三方)均支持使用systemctl命令控制:启动、停止、开机自启 能够被systemctl管理的软件,一般也称之为:服务 1.功能和语法 功能:控制系统服务的启动关闭等 语法:syst…...
2024年01月微软更新Bug 已解决 !Explorer.EXE 提示:Windows无法访问指定设备、路径或文件。你可能没有适当的权限访问该项目。
前倾概要 近期大量出现如上图问题,杀毒,系统急救箱都没反应,罪魁祸首就是微软更新! 点击什么都是:Windows无法访问指定设备、路径或文件。你可能没有适当的权限访问该项目。 但软件使用正常,还能通过建立…...
Qt/QML编程学习之心得:slider(34)
滑条slider,有时也成为进度条progressbar,在GUI界面中也是经常用到的。 import QtQuick 2.9 import QtQuick.Controls 2.0 import QtQuick.Layouts 1.2ApplicationWindow {id:rootvisible: truewidth: 1920height: 720//title: qsTr("Hello World&q…...
使用metricbeat 监控多ES集群
背景 ES 本身自带 监控,属于xpack 中的内容,为商业版,需要收费; 并且 monitor 功能必须要在security开启后才能使用,还有就是集群监控自己,将采集到的性能数据保存到本集群,这是一个比较差的设…...
阿里云服务器+宝塔 (尝试部署一个最简单的静态页面)
1. 免费白嫖一个阿里服务器 进入网址:服务器购买地址 选择预装宝塔面板 购买完成后前往控制台 查看当前实例 设置或修改密码 设置用户名和密码 2. 远程连接到服务器 2.1. 使用Workbench连接 输入用户名和密码连接成功页面如下: 2.2. 使…...
每日一题——LeetCode1160.拼写单词
方法一 个人方法: 先统计chars里每个字符出现的次数,再对words里每个字符串统计每个字符出现的字符,当: 1、字符串里出现chars里没有的字符 2、字符串里某个字符出现的次数大于该字符在chars里出现的次数 以上两种情况则不符合…...
物联网协议Coap之Core和NetWork简介
目录 前言 一、Coap的Core包 1、Coap对象 2、Message对象 3、Request对象 4、Response对象 二、Coap的NetWork调试 1、UDP运行模式 2、Network消息接收 3、Sender线程发送数据 三、总结 前言 在之前的博文中,对Californium中Coap的实现进行了简要的介绍&a…...
Java SE入门及基础(10)
switch选择结构 1. 概念 switch 表示开关的意思,为了帮助理解,下面以线路为例,进行解释说明 上图中表示一条带有多个开关的线路,当开关打开时,该开关所控制的灯即被点亮。 2. 语法规则 switch ( 表达式 ){ //…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...
Python学习(8) ----- Python的类与对象
Python 中的类(Class)与对象(Object)是面向对象编程(OOP)的核心。我们可以通过“类是模板,对象是实例”来理解它们的关系。 🧱 一句话理解: 类就像“图纸”,对…...
Java中HashMap底层原理深度解析:从数据结构到红黑树优化
一、HashMap概述与核心特性 HashMap作为Java集合框架中最常用的数据结构之一,是基于哈希表的Map接口非同步实现。它允许使用null键和null值(但只能有一个null键),并且不保证映射顺序的恒久不变。与Hashtable相比,Hash…...
