笔记03----NeurIPS2024 涨点!SSA:用于语义分割的语义和空间自适应像素级分类器(即插即用)
前言
文章标题:《SSA-Seg: Semantic and Spatial Adaptive Pixel-level Classiffer for Semantic Segmentation》
助力语义分割涨点!SSA:一种新颖的语义和空间自适应分类器,显著提高了基线模型的分割性能,比如SegNeXt、OCRNet和UperNet等模型,而计算成本的增加却很小,代码已开源!
单位:华为诺亚,浙江大学
问题:
- 语义域特征偏差:由于测试图像的内容和分布可能与训练数据存在很大差异(如背景复杂、对象分布多样),测试图像中的像素特征可能与训练时学习的固定语义原型不一致,导致分类性能下降。
举一个例子:金斧头,银斧头,你却只认得铁斧头
- 空间域信息丢失:传统方法未充分利用目标对象的空间结构信息,导致边界模糊以及对小目标的识别能力不足。
创新:
语义和空间自适应分类器(SSA-Seg):
- 空间原型自适应(SPPA):利用位置编码获得空间特征,通过粗分割掩码计算空间域中心,建模像素特征与空间之间的关系,生成空间原型,改进像素与空间原型之间的关系,提升边界和小目标分割性能。
- 语义原型自适应(SEPA):使用粗分割掩码计算语义域中心,生成自适应的语义原型,改进像素与语义原型之间的相似性,提升语义类别对齐能力。
源码下载
github:https://github.com/xwmaxwma/SSA-Seg
实现

SPPA:
对于从骨干和分类头输出的语义特征 S f S_f Sf,我们首先通过位置编码生成空间特征 P f P_f Pf。然后,我们保留原始的1x1卷积以生成粗级Mask: M c M_c Mc。在 M c M_c Mc的引导下,空间域的中心 P c P_c Pc,并将其与一个可学习的位置编码 P p P_p Pp融合生成空间原型
SEPA:
对于从骨干和分类头输出的语义特征 S f S_f Sf,我们保留原始的1x1卷积以生成粗级Mask: M c M_c Mc。在 M c M_c Mc的引导下,语义中心 S c S_c Sc,并将其与固定的语义原型 S S S和 S c S_c Sc融合,以生成语义原型 S p S_p Sp
SSA:
(空间原型 P p P_p Pp+语义原型 S p S_p Sp)*(语义特征 S f S_f Sf+空间特征 P f P_f Pf)=Output
class SEPA_SPPA(nn.Module):def __init__(self, num_classes, channels):super(SEPA_SPPA, self).__init__()self.channels = channels # 通道数,用于特征图的维度self.num_classes = num_classes # 类别数,用于位置嵌入和预测# SEPA模块:生成特征位置编码self.get_feat_pos = nn.Conv2d(self.channels, self.channels, 3, 1, 1, bias=True, groups=self.channels) # 使用深度可分离卷积生成特征位置编码self.center_pos = nn.Embedding(self.num_classes, self.channels) # 可学习的向量类别位置嵌入,大小为(类别数, 通道数)self.center_pos_proj = nn.Sequential(nn.Linear(self.channels * 2, self.channels // 2, bias=False), # 降维nn.ReLU(inplace=True), # 激活函数nn.Linear(self.channels // 2, self.channels), # 恢复到原通道维度)self.feat_proj = nn.Identity() # 特征映射,不做额外操作# SPPA模块:生成语义原型self.center_content_proj = nn.Sequential(nn.Linear(self.channels * 2, self.channels // 2, bias=False), # 原型降维nn.ReLU(inplace=True), # 激活函数nn.Linear(self.channels // 2, self.channels), # 恢复到原通道数)self.center_proj = nn.Linear(self.channels, self.channels, bias=False) # 最终类中心特征的线性映射# 获取中心位置编码def get_center_pos(self, attn, feat_pos):"""根据注意力图(attn)和特征位置编码(feat_pos)计算中心位置编码"""center_pos = self.center_pos.weight # 获取类中心位置嵌入b, k, h, w = attn.size() # 批量大小、类别数、高度、宽度c = feat_pos.shape[1] # 特征图通道数# 将注意力和特征图展平,用于矩阵计算attn = attn.reshape(b, k, -1) # (b, k, h*w)feat_pos = feat_pos.reshape(b, c, -1).permute(0, 2, 1) # (b, h*w, c)# 归一化注意力并计算中心位置attn = F.softmax(attn, dim=-1) # 在像素维度上进行softmaxcenter_pos = center_pos.unsqueeze(0).repeat(b, 1, 1) # 扩展为(b, k, c)center_pos = torch.cat([center_pos, torch.matmul(attn, feat_pos)], dim=-1) # 拼接原始位置编码和计算出的编码 (b, k, 2c)center_pos = self.center_pos_proj(center_pos) # 投影到中心位置编码 (b, k, c)return center_pos# 生成像素分类预测def get_pred(self, x, proto):"""根据特征图和语义原型生成像素分类预测"""b, c, h, w = x.size() # 批量大小、通道数、高度、宽度if len(proto.shape) == 3: # 如果原型是三维的 (b, k, c)cls_num = proto.size(1) # 类别数x = x / (torch.norm(x, 2, 1, True) + 1e-12) # 对特征进行L2归一化proto = proto / (torch.norm(proto, 2, -1, True) + 1e-12) # 对原型进行L2归一化x = x.contiguous().view(b, c, h * w) # 展平特征 (b, c, h*w)pred = proto @ x # 点乘生成预测 (b, cls, h*w)elif len(proto.shape) == 2: # 如果原型是二维的 (k, c)cls_num = proto.size(0) # 类别数x = x / (torch.norm(x, 2, 1, True) + 1e-12) # 特征归一化proto = proto / (torch.norm(proto, 2, 1, True) + 1e-12) # 原型归一化x = x.contiguous().view(b, c, h * w) # 展平特征proto = proto.unsqueeze(0) # 扩展维度为 (1, cls, c)pred = proto @ x # 点乘生成预测 (b, cls, h*w)pred = pred.contiguous().view(b, cls_num, h, w) # 恢复为原始大小return pred * 15 # 放大预测值# 前向传播def forward(self, feat, pred, proto):"""输入特征图、注意力图和原型,输出像素分类预测语义特征featpred是预测输出值proto固定的语义原型,通过调用主干网络的分割头权重赋值self.conv_seg.weight.squeeze()"""# SPPA模块feat_pos = self.get_feat_pos(feat) # 获取特征位置编码center_pos = self.get_center_pos(attn=pred, feat_pos=feat_pos) # 空间原型# SEPA模块raw_x = feat.clone()b, c, h, w = raw_x.shape[:]pred = pred.view(b, proto.shape[0], h * w)pred = F.softmax(pred, 1) # b, n, hwpred_proto = (pred @ raw_x.view(b, c, h * w).permute(0, 2, 1)) / (pred.sum(-1).unsqueeze(-1) + 1e-12)pred_proto = torch.cat([pred_proto, proto.unsqueeze(0).repeat(pred_proto.shape[0], 1, 1)], -1) # b, n, 2cpred_proto = self.center_content_proj(pred_proto) #语义原型# 语义特征feat,feat_pos空间特征feat = self.feat_proj(feat+feat_pos) # 对特征图进行投影# pred_proto语义原型 center_pos空间原型center = self.center_proj(pred_proto + center_pos) # 结合语义原型和位置编码生成类中心特征pred = self.get_pred(feat, center) # 根据类中心特征生成像素分类预测return pred
if __name__ == "__main__":# 初始化模型num_classes = 21 # 类别数channels = 256 # 特征图通道数model = SEPA_SPPA(num_classes=num_classes, channels=channels) # 实例化模型# 构造测试输入b, c, h, w = 4, 256, 64, 64 # 批量大小、通道数、高度、宽度k = num_classes # 类别数feat = torch.randn(b, c, h, w) # 模拟特征图attn = torch.randn(b, k, h, w) # 模拟注意力图proto = torch.randn(k, c) # 模拟语义原型# 前向传播测试pred = model(feat, attn, proto) # 获取预测结果print(f"预测结果形状: {pred.shape}") # 打印预测结果的形状
实验
SSA-Seg在最新通用(顶部)和轻量化(底部)方法上的性能比较。FLOPS(G)的计算基于ADE20K和COCO-Stuff-10K的512x512输入大小,以及PASCAL-Context的480x480输入大小。延迟(ms)的计算基于V100 GPU的512x512的输入大小。绿色数字表示相对于基线的增加

相关文章:
笔记03----NeurIPS2024 涨点!SSA:用于语义分割的语义和空间自适应像素级分类器(即插即用)
前言 文章标题:《SSA-Seg: Semantic and Spatial Adaptive Pixel-level Classiffer for Semantic Segmentation》 助力语义分割涨点!SSA:一种新颖的语义和空间自适应分类器,显著提高了基线模型的分割性能,比如SegNeXt、OCRNet和UperNet等模型…...
自定义比较函数 down 作为 sort 函数的参数实现数组元素从大到小排序
【自定义比较函数 down 作为 sort 函数的参数实现数组元素从大到小排序】 #include <bits/stdc.h> using namespace std;const int maxn1e35; int a[maxn];bool down(int u,int v) {return u>v; }int main() {int n;cin>>n;for(int i0; i<n; i) cin>>…...
在 Spring Boot 中使用 JPA(Java Persistence API)进行数据库操作
步骤 1: 添加依赖 在 pom.xml 文件中添加相关依赖: <dependencies><!-- Spring Boot Starter Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><…...
简单聊聊PLT和GOT
在 Linux 的动态链接中,PLT(Procedure Linkage Table) 和 GOT(Global Offset Table) 是动态链接机制中的两个关键组件,它们一起支持程序动态加载共享库以及在运行时解析符号地址。下面是它们的作用和原理&a…...
FaRM译文
No compromises: distributed transactions with consistency, availability, and performance Aleksandar Dragojevic, Dushyanth Narayanan, Edmund B. Nightingale, Matthew Renzelmann, Alex Shamis, Anirudh Badam, Miguel Castro Microsoft Research 目录 摘要 1. 引…...
用vue框架写一个时钟的页面
你可以使用Vue框架来创建一个简单的时钟页面。首先,你需要在HTML文件中引入Vue框架的CDN: <script src"https://cdn.jsdelivr.net/npm/vue"></script>然后,创建一个包含时钟功能的Vue实例: <div id&qu…...
HTML表单-第二部分
HTML表单 表单元素是允许用户在表单中输入内容,比如:文本域,下拉列表,单选框,复选框等等‘ 使用<from>标签创建 例如 <from> . input . </from> HTML表单-输入元素 <input>标签创建ÿ…...
PyQt5:一个逗号引发的闪退血案
【日常小计】 在开发PyQt5程序时,调用了一个写入excel表格的后端方法,但是每次打开页面点击对应的动作,窗口就会闪退,而且Python后台也没有提示出任何的异常堆栈,后来经过在后端一点一点的单点测试,终于发…...
AI智能体Prompt预设词指令大全+GPTs应用使用
AI智能体使用指南 直接复制在AI工具助手中使用(提问前) 可前往SparkAi系统用户官网进行直接使用 SparkAI系统介绍文档:Docs 常见AI智能体GPTs应用大全在线使用 自定义添加制作AI智能体进行使用: 文章润色器 你是一位具有敏锐洞察…...
SSM整合原理实战案例《任务列表案例》
一、前端程序搭建和运行: 1.整合案例介绍和接口分析: (1).案例功能预览: (2).接口分析: 学习计划分页查询 /* 需求说明查询全部数据页数据 请求urischedule/{pageSize}/{currentPage} 请求方式 get 响应的json{"code":200,"flag":true,"data&…...
在风能市场持续增长的情况下,全球【环氧活性稀释剂】的需求呈现明显上涨的趋势
摘要 据 HengCe 最新调研,2023年中国环氧活性稀释剂市场销售收入达到了 万元,预计2030年可以达到 万元,2024-2030期间年复合增长率(CAGR)为 %。本研究项目旨在梳理环氧活性稀释剂领域产品系列,洞悉行业特点、市场存量空间及增量空…...
CSS一些小点 —— 12.7
1. box-sizing: border-box box-sizing 属性,默认值为 content-box box-sizing: border-box 使padding和border的值不会再影响元素的宽高;padding和border的值算在指定宽高的内部(但是外边距依然算做外部) 2. overflow: hidden …...
[NeurlPS 2022] STaR 开源代码实现解读
STaR 方法代码开源,这里给出一个中文代码解读地址:repo入口点:iteration_train.py;关键代码:device_train.py, device_inference.py, and create_finetune_tfrecords.py;基于 JAX、RAY,在 Googl…...
Android笔记【15】跳转页面返回信息
一、问题 学习一段代码 val intent Intent(thisSecondActivity, MainActivity::class.java) intent.putExtra("extra_data", data) startActivity(intent) 二、内容 这段代码是在 Android 应用中启动一个新的活动(Activity),具…...
使用 Qt 打造高效的 .run 软件包管理器
在软件开发领域,.run 软件包因其便携性和自解压特性而备受青睐,特别是由 makeself 工具生成的 .run 软件包。这些软件包通常包含一个完整的程序或库,以及一个用于解压和安装的脚本。然而,手动管理这些软件包(尤其是进行…...
python学opencv|读取视频(二)制作gif
【1】引言 前述已经完成了图像和视频的读取学习,本次课学习制作gif格式动图。 【2】教程 实际上想制作gif格式动图是一个顺理成章的操作,完成了图像和视频的处理,那就自然而然会对gif的处理也产生兴趣。 不过在opencv官网、matplotlib官网…...
19. Three.js案例-创建一个带有纹理映射的旋转平面
19. Three.js案例-创建一个带有纹理映射的旋转平面 实现效果 知识点 WebGLRenderer (WebGL渲染器) WebGLRenderer 是 Three.js 中用于渲染场景的主要类。它利用 WebGL 技术在浏览器中绘制 3D 图形。 构造器 new THREE.WebGLRenderer(parameters)参数类型描述parametersobj…...
ASP.NET|日常开发中常用属性详解
JAVA |日常开发中常用属性详解 前言一、控件属性(以 TextBox 控件为例)1.1 Text 属性:1.2 MaxLength 属性:1.3 ReadOnly 属性:1.4 IsPostBack 属性(在ASP.NET Web Forms 中)…...
vscode CMakeLists中对opencv eigen的引用方法
CMakeLists.txt 项目模式(只有一个main函数入口) cmake_minimum_required(VERSION 3.5)project(vsin01 VERSION 0.1 LANGUAGES CXX)set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON)set(OpenCV_DIR G:/MinGW_Opencv/opencv4.10/opencv…...
使用Goland对6.5840项目进行go build出现异常
使用Goland对6.5840项目进行go build出现异常 Lab地址: https://pdos.csail.mit.edu/6.824/labs/lab-mr.html项目地址: git://g.csail.mit.edu/6.5840-golabs-2024 6.5840运行环境: mac系统 goland git clone git://g.csail.mit.edu/6.5840-golabs-2024 6.5840 cd 6.5840/src…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
