当前位置: 首页 > news >正文

笔记03----NeurIPS2024 涨点!SSA:用于语义分割的语义和空间自适应像素级分类器(即插即用)

前言

文章标题:《SSA-Seg: Semantic and Spatial Adaptive Pixel-level Classiffer for Semantic Segmentation》
助力语义分割涨点!SSA:一种新颖的语义和空间自适应分类器,显著提高了基线模型的分割性能,比如SegNeXt、OCRNet和UperNet等模型,而计算成本的增加却很小,代码已开源!
单位:华为诺亚,浙江大学
问题:

  1. 语义域特征偏差:由于测试图像的内容和分布可能与训练数据存在很大差异(如背景复杂、对象分布多样),测试图像中的像素特征可能与训练时学习的固定语义原型不一致,导致分类性能下降。
    举一个例子:金斧头,银斧头,你却只认得铁斧头
  1. 空间域信息丢失:传统方法未充分利用目标对象的空间结构信息,导致边界模糊以及对小目标的识别能力不足。

创新:
语义和空间自适应分类器(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)的计算基于ADE20KCOCO-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 文件中添加相关依赖&#xff1a; <dependencies><!-- Spring Boot Starter Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><…...

简单聊聊PLT和GOT

在 Linux 的动态链接中&#xff0c;PLT&#xff08;Procedure Linkage Table&#xff09; 和 GOT&#xff08;Global Offset Table&#xff09; 是动态链接机制中的两个关键组件&#xff0c;它们一起支持程序动态加载共享库以及在运行时解析符号地址。下面是它们的作用和原理&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框架来创建一个简单的时钟页面。首先&#xff0c;你需要在HTML文件中引入Vue框架的CDN&#xff1a; <script src"https://cdn.jsdelivr.net/npm/vue"></script>然后&#xff0c;创建一个包含时钟功能的Vue实例&#xff1a; <div id&qu…...

HTML表单-第二部分

HTML表单 表单元素是允许用户在表单中输入内容&#xff0c;比如&#xff1a;文本域&#xff0c;下拉列表&#xff0c;单选框&#xff0c;复选框等等‘ 使用<from>标签创建 例如 <from> . input . </from> HTML表单-输入元素 <input>标签创建&#xff…...

PyQt5:一个逗号引发的闪退血案

【日常小计】 在开发PyQt5程序时&#xff0c;调用了一个写入excel表格的后端方法&#xff0c;但是每次打开页面点击对应的动作&#xff0c;窗口就会闪退&#xff0c;而且Python后台也没有提示出任何的异常堆栈&#xff0c;后来经过在后端一点一点的单点测试&#xff0c;终于发…...

AI智能体Prompt预设词指令大全+GPTs应用使用

AI智能体使用指南 直接复制在AI工具助手中使用&#xff08;提问前&#xff09; 可前往SparkAi系统用户官网进行直接使用 SparkAI系统介绍文档&#xff1a;Docs 常见AI智能体GPTs应用大全在线使用 自定义添加制作AI智能体进行使用&#xff1a; 文章润色器 你是一位具有敏锐洞察…...

SSM整合原理实战案例《任务列表案例》

一、前端程序搭建和运行: 1.整合案例介绍和接口分析: (1).案例功能预览: (2).接口分析: 学习计划分页查询 /* 需求说明查询全部数据页数据 请求urischedule/{pageSize}/{currentPage} 请求方式 get 响应的json{"code":200,"flag":true,"data&…...

在风能市场持续增长的情况下,全球【环氧活性稀释剂】的需求呈现明显上涨的趋势

摘要 据 HengCe 最新调研&#xff0c;2023年中国环氧活性稀释剂市场销售收入达到了 万元&#xff0c;预计2030年可以达到 万元&#xff0c;2024-2030期间年复合增长率(CAGR)为 %。本研究项目旨在梳理环氧活性稀释剂领域产品系列&#xff0c;洞悉行业特点、市场存量空间及增量空…...

CSS一些小点 —— 12.7

1. box-sizing: border-box box-sizing 属性&#xff0c;默认值为 content-box box-sizing: border-box 使padding和border的值不会再影响元素的宽高&#xff1b;padding和border的值算在指定宽高的内部&#xff08;但是外边距依然算做外部&#xff09; 2. overflow: hidden …...

[NeurlPS 2022] STaR 开源代码实现解读

STaR 方法代码开源&#xff0c;这里给出一个中文代码解读地址&#xff1a;repo入口点&#xff1a;iteration_train.py&#xff1b;关键代码&#xff1a;device_train.py, device_inference.py, and create_finetune_tfrecords.py&#xff1b;基于 JAX、RAY&#xff0c;在 Googl…...

Android笔记【15】跳转页面返回信息

一、问题 学习一段代码 val intent Intent(thisSecondActivity, MainActivity::class.java) intent.putExtra("extra_data", data) startActivity(intent) 二、内容 这段代码是在 Android 应用中启动一个新的活动&#xff08;Activity&#xff09;&#xff0c;具…...

使用 Qt 打造高效的 .run 软件包管理器

在软件开发领域&#xff0c;.run 软件包因其便携性和自解压特性而备受青睐&#xff0c;特别是由 makeself 工具生成的 .run 软件包。这些软件包通常包含一个完整的程序或库&#xff0c;以及一个用于解压和安装的脚本。然而&#xff0c;手动管理这些软件包&#xff08;尤其是进行…...

python学opencv|读取视频(二)制作gif

【1】引言 前述已经完成了图像和视频的读取学习&#xff0c;本次课学习制作gif格式动图。 【2】教程 实际上想制作gif格式动图是一个顺理成章的操作&#xff0c;完成了图像和视频的处理&#xff0c;那就自然而然会对gif的处理也产生兴趣。 不过在opencv官网、matplotlib官网…...

19. Three.js案例-创建一个带有纹理映射的旋转平面

19. Three.js案例-创建一个带有纹理映射的旋转平面 实现效果 知识点 WebGLRenderer (WebGL渲染器) WebGLRenderer 是 Three.js 中用于渲染场景的主要类。它利用 WebGL 技术在浏览器中绘制 3D 图形。 构造器 new THREE.WebGLRenderer(parameters)参数类型描述parametersobj…...

ASP.NET|日常开发中常用属性详解

JAVA &#xff5c;日常开发中常用属性详解 前言一、控件属性&#xff08;以 TextBox 控件为例&#xff09;1.1 Text 属性&#xff1a;1.2 MaxLength 属性&#xff1a;1.3 ReadOnly 属性&#xff1a;1.4 IsPostBack 属性&#xff08;在ASP.NET Web Forms 中&#xff09;&#xf…...

vscode CMakeLists中对opencv eigen的引用方法

CMakeLists.txt 项目模式&#xff08;只有一个main函数入口&#xff09; 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…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考

目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候&#xff0c;显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...

python读取SQLite表个并生成pdf文件

代码用于创建含50列的SQLite数据库并插入500行随机浮点数据&#xff0c;随后读取数据&#xff0c;通过ReportLab生成横向PDF表格&#xff0c;包含格式化&#xff08;两位小数&#xff09;及表头、网格线等美观样式。 # 导入所需库 import sqlite3 # 用于操作…...

SpringCloud优势

目录 完善的微服务支持 高可用性和容错性 灵活的配置管理 强大的服务网关 分布式追踪能力 丰富的社区生态 易于与其他技术栈集成 完善的微服务支持 Spring Cloud 提供了一整套工具和组件来支持微服务架构的开发,包括服务注册与发现、负载均衡、断路器、配置管理等功能…...

基于django+vue的健身房管理系统-vue

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.8数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat12开发软件&#xff1a;PyCharm 系统展示 会员信息管理 员工信息管理 会员卡类型管理 健身项目管理 会员卡管理 摘要 健身房管理…...