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

《Cross-Image Pixel Contrasting for Semantic Segmentation》论文解读

期刊:TPAMI

年份:2024

摘要

研究图像语义分割问题。目前的方法主要集中在通过专门设计的上下文聚合模块(如空洞卷积、神经注意力)或结构感知的优化目标(如iou样损失)挖掘"局部"上下文,即单个图像中像素之间的依赖关系。然而,它们忽略了训练数据的“全局”上下文,即不同图像之间像素之间的丰富语义关系。受最近无监督对比表示学习进展的启发,本文提出一种像素级对比算法PiCo,用于全监督学习环境下的语义分割。其核心思想是强制属于相同语义类的像素嵌入比来自不同语义类的嵌入更相似。通过明确探索以前很少研究的标记像素的结构,提出了一种用于语义分割的像素级度量学习范式。所提出的训练算法与现代分割解决方案兼容,在测试期间没有额外的开销。实验表明,通过著名的分割模型(即DeepLabV3、HRNet、crnet、SegFormer、Segmenter、MaskFormer)和骨干(即MobileNet、ResNet、HRNet、MiT、ViT),所提出算法在不同的数据集(即Cityscapes、ADE20 K、PASCAL-Context、COCO-Stuff、CamVid)上带来了一致的性能提升。期望这项工作将鼓励社区重新思考当前语义分割事实上的训练范式。

Introduction

动机

  1. 利用全局上下文信息来改善语义分割的性能。
  2. 通过像素级的对比学习,促使同一类别的像素在嵌入空间中更紧凑,不同类别的像素更分散。
  3. 提出一种新的训练算法,与现代分割解决方案兼容,且在测试期间没有额外的开销。

主要贡献

  1. 提出一种有监督的逐像素对比学习语义分割方法。它将当前的图像训练策略提升到图像间、像素到像素的范式。其本质是通过充分利用标记像素之间的全局语义相似性来学习像素语义嵌入空间。
  2. 开发了一种区域记忆,以更好地探索巨大的视觉数据空间,并支持进一步计算像素到区域的对比度。该方法结合像素到像素的对比度计算,利用像素之间以及像素与语义区域之间的语义相关性。
  3. 不是选择随机像素样本进行密集度量学习,而是可以通过更好的示例采样和合成策略提供更强大的分割模型。

Method

2.1 前置知识

无监督对比学习:无监督对比学习是一种自监督学习方法,它通过学习数据的内在结构和模式来表示数据,而不需要依赖于外部的标签信息。这种方法的核心思想是通过对比正样本(相似的数据点)和负样本(不相似的数据点)来学习区分不同数据点的特征表示。损失函数设计用来拉近正样本对之间的距离,同时推远负样本对之间的距离。

其中 v^{+} 表示 I 的正样本的特征嵌入,N_{I}包含所有负样本的嵌入,'·' 表示内部(点)乘积,𝜏 > 0 是缩放距离分布的温度超参数。 

记忆库:在无监督对比学习中,"记忆库"(Memory Bank)是一种关键机制,用于存储训练过程中遇到的样本的特征表示,以便在计算对比损失时使用。记忆库存储了大量样本的特征向量,这些特征向量通常由编码器网络生成,编码器网络负责将输入数据映射到特征空间。在每次迭代中,记忆库用于提供负样本,即与当前锚点(anchor)样本不同但同时参与损失函数计算。这有助于模型学习区分不同类别或不同实例的特征表示。

由于一次训练迭代中可用的负样本数量可能受到批处理大小的限制,记忆库允许模型在每次迭代中访问更多的负样本,从而提高学习效率。

2.2 监督对比分割

2.2.1 像素级交叉熵损失

一种常用的损失函数,用于训练卷积神经网络(CNN)或其它类型的神经网络,以预测图像中每个像素的类别标签。

以上损失函数公式存在两个问题:i)独立验证每个像素的分割预测,而忽略了像素之间的关系。因此,模型可能会遇到难以识别视觉证据较弱或属于小物体的像素。ii) 由于 softmax 的使用,损失仅取决于 logits 之间的相对关系,不能直接监督学习的表示 。

这两个问题很少被注意到;只有少数结构感知损失被设计用来解决:i),通过考虑相邻像素的成对亲和力,优化交叉过并测量,ii)最大化groundtruth和预测映射之间的区域互信息。

然而,这些替代损失只考虑图像中像素之间的依赖性(即局部上下文),而不考虑图像中像素之间的语义相关性(即全局结构)。 

2.2.2 Pixel-to-Pixel对比

通过像素级的对比学习来探索训练数据中的全局语义结构,从而正则化分割嵌入空间的优化。这样,同一类别的像素嵌入会被拉近,而不同类别的像素嵌入则会被推远。

对于一个锚点像素 𝑖,其真实语义标签为 \overline{c} ,正样本是其他属于类别\overline{c} 的像素,负样本则是属于其他类别 C\setminus \overline{c}的像素。

其中P_{i}N_{i}分别表示正样本和负样本的像素嵌入集合,𝜏 是温度参数,用于控制分布的平滑程度。 正/负样本和锚点 i 不限于来自同一图像,这种基于像素到像素对比度的损失设计的目的是通过将同一类像素样本拉近并推开不同的类样本来学习嵌入空间。

与传统的像素级分类损失(如交叉熵损失)不同,像素到像素的对比损失不仅考虑了单个像素的分类准确性,还考虑了像素之间的全局语义关系。

像素级交叉熵损失和对比损失是互补的;前者让分割网络学习对分类有意义的判别像素特征,而后者有助于通过显式探索像素样本之间的全局语义关系来规范嵌入空间,从而提高类内紧凑性和类间可分离性。因此整体训练目标是:

如图所示,LSEG学习到的像素嵌入变得更紧凑,比仅使用LCE学习的像素嵌入更好。这表明,通过享受一元交叉熵损失和成对度量损失的优势,分割网络可以生成更多的判别特征,从而产生更有希望的结果。 

(左)交叉熵损失;(右)Pixel-to-Pixel对比损失

 2.2.3 Pixel-to-Region对比

"Pixel-to-Region Contrast"(像素到区域对比)是PiCo算法的一个重要组成部分,旨在通过利用图像中像素和区域(语义区域)之间的关系来提升语义分割的性能。

像素到区域对比是一种正则化技术,它不仅考虑像素级别的对比,还考虑像素与其所属语义区域之间的关系

为了有效地进行像素到区域的对比,论文中提出了一种记忆库的设计,用于存储像素和区域的特征表示。记忆库包含两部分:像素队列和区域记忆库。

  • 像素队列为每个类别维护了一个固定大小的像素特征集合,这些像素是从最新的小批量样本中随机选取的。
  • 区域记忆库存储了每个图像中每个语义类别的区域特征,这些特征是通过平均池化同一图像中所有标记为该类别的像素嵌入得到的。

在计算像素到区域的对比损失时,属于同一类别的区域嵌入被视为正样本,而其他类别的区域嵌入被视为负样本。

动机:由于在密集预测设置中存在大量的像素样本,其中许多是冗余的(例如,从同一物体区域中采样的像素),直接存储所有训练像素样本会大大降低学习过程的速度。因此,通过维护像素队列和区域记忆库,可以更有效地利用数据。

2.2.4 Hard Example Sampling

硬样本采样的目的是在训练过程中专注于那些难以正确分类的样本,即“硬”样本,从而提高模型对困难案例的学习能力。

硬样本采样策略

  • Hardest Example Sampling(最硬样本采样):选择与锚点像素在特征空间中最相似的负样本和最不相似的正样本。
  • Semi-Hard Example Sampling(半硬样本采样):选择与锚点像素相似度处于中间水平的样本,避免使用最容易和最困难的样本。
  • Segmentation-Aware Hard Anchor Sampling(分割感知硬锚点采样):将分类错误的像素作为硬锚点,并在损失计算中给予更多关注。

通过专注于硬样本,模型可以学习到更加鲁棒的特征表示,从而在面对具有挑战性的场景时表现更好。

2.2.5 Hard Negative Example Synthesis

硬负样本合成的目的是在训练过程中增加模型学习的难度,通过引入难以区分的负样本来推动模型学习更鲁棒的特征表示。在对比学习中,负样本的选择对于模型学习至关重要。硬负样本是那些在特征空间中与锚点样本相似度较高的样本,这些样本对于模型的区分能力提出了更高的要求。

硬负样本的合成机制

  • 负负合成(Negative-Negative Synthesis):通过随机选择负样本对,进行凸线性组合来生成新的负样本。
  • 负锚合成(Negative-Anchor Synthesis):将锚点样本与选定的负样本进行线性混合,生成更具挑战性的负样本。

合成的硬负样本在损失函数中作为负样本参与计算,增加了损失函数的复杂性,促使模型在优化过程中更加关注特征的区分度。

2.3 Detailed Network Architecture

对于小批量中的每个训练图像 I,利用特征提取器 f_{EXT} 将其投影到密集嵌入 I 中,然后将其输入分割头 f_{SEG} 进行掩码预测(即 Y),由交叉熵损失 (L^{CE}) 监督,以及用于像素对比度的投影头 f_{PROJ} (L^{NCE})。此外,维护内存库M,设计硬示例采样和合成策略来寻找更多信息样本,以实现有效的对比学习。

Feature Extractor (f_{EXT}):特征提取器用于将输入图像 𝐼 映射到密集的特征表示 𝐼,其维度为 𝐻×𝑊×𝐷,其中 𝐻×𝑊 是特征图的空间尺寸,𝐷 是特征维度。常见的CNN或Transformer骨干网络可以用于实例化 f_{EXT}

segmentation Head (f_{SEG}):分割头f_{SEG} 将特征表示 𝐼 映射到一个类别分数图 𝑌,其维度为 𝐻×𝑊×∣𝐶∣,其中 ∣𝐶∣ 是类别的数量。这个分数图表示了每个像素属于各个类别的置信度。

Projection Head (f_{PROJ}):投影头 f_{PROJ} 用于将每个高维像素嵌入 𝑖 映射到一个低维的 l_{2}-​归一化特征向量,用于计算对比损失 L^{NCE}f_{PROJ} 通常由几个1x1的卷积层、批量归一化(BN)和ReLU激活函数组成。在推理时,f_{PROJ} 被移除,不会引入任何额外的计算成本。

Memory Bank (M):记忆库 𝑀 由两部分组成,分别存储像素嵌入和区域嵌入。对于每个训练图像,我们为每个类采样 V = 10 像素。对于每个类,我们将像素队列的大小设置为 T = 10 N。对于大规模或词汇表的数据集,例如 COCO-Stuff 和 ADE20 K,我们将 T 设置为固定数量的(即 10,000),记忆库在训练后被丢弃,不参与推理过程。

Joint Loss (L^{SEG}):联合损失 L^{SEG} 结合了表示学习和度量学习的优势,用于更显著的分割特征学习。它结合了像素级交叉熵损失 L^{CE} 和对比损失 L^{SEG},通过一个可调节的系数 𝜆 来平衡两种损失。

总的来说

  • 通过特征提取器得到特征,并通过分割头得到像素级别的预测,将其预测与Grounding Truth比较计算交叉熵损失。
  • 通过特征提取器得到特征,并通过投影得到低维特征向量,将分类错误的像素作为硬锚点,从记忆库中选择与当前锚点像素相似的负样本,以及不相似的正样本,使用采样得到的锚点、正样本和负样本,计算像素级的对比损失。
  • 使用联合损失反向传递更新网络,并合成新的负样本。
  • 在每次训练迭代中重复上述损失计算和参数更新步骤,直到模型在验证集上的性能不再提升或达到预定的迭代次数。

Conclusion

在本文中,我们提出了一种新的监督学习范式用于语义分割,它享受一元分类和结构化度量学习的互补优势。通过逐像素的对比学习,它研究了训练像素之间的全局语义关系,引导像素嵌入到跨图像的类别判别表示,最终提高分割性能。实验表明,在不同的语义分割基准上,该算法比基于fcn或基于transformer的分割器实现了一致的性能改进。我们的算法在各种密集预测任务中显示出巨大的潜力,例如姿态估计和身体解析。它也带来了新的挑战,特别是在智能数据采样和生成、度量学习损失设计、训练期间的类再平衡和多层特征对比方面。考虑到过去几年里大量的技术突破,我们期待在这些方向上出现一阵创新的热潮。

相关文章:

《Cross-Image Pixel Contrasting for Semantic Segmentation》论文解读

期刊:TPAMI 年份:2024 摘要 研究图像语义分割问题。目前的方法主要集中在通过专门设计的上下文聚合模块(如空洞卷积、神经注意力)或结构感知的优化目标(如iou样损失)挖掘"局部"上下文,即单个图像中像素之间的依赖关系。然而&…...

技术周总结 2024.07.08~07.14(算法,Python,Java,Scala,PHP)

文章目录 一、07.13 周六1.0)算法题:字符串中的单词反转1.1) 问题01:可靠性计算中的MTTR MTTF MTBF 分别指什么?他们之间有什么联系?MTTR (Mean Time to Repair)MTTF (Mean Time to Failure)MTBF (Mean Time Between F…...

UnityECS学习中问题及总结entityQuery.ToComponentDataArray和entityQuery.ToEntityArray区别

在Unity的ECS&#xff08;Entity Component System&#xff09;开发中&#xff0c;entityQuery.ToComponentDataArray<T>(Allocator.Temp) 和 entityQuery.ToEntityArray(Allocator.Temp) 是两种不同的方法&#xff0c;用于从实体查询中获取数据。除了泛型参数之外&#…...

[python]基于yolov10+gradio目标检测演示系统设计

【设计介绍】 YOLOv10结合Gradio实现目标检测系统设计是一个结合了最新目标检测技术和快速部署框架的项目。下面将详细介绍这一系统的设计和实现过程。 一、YOLOv10介绍 YOLOv10是YOLO&#xff08;You Only Look Once&#xff09;系列的最新版本&#xff0c;由清华大学的研究…...

浏览器开发者视角及CSS表达式选择元素

点击想要查看的接口&#xff0c;然后点击检查&#xff0c;便可以切换到该接口对应的html代码 如果F12不起作用的话&#xff0c;点击更多工具&#xff0c;然后选择开发者工具即可 ctrlF可以去查阅相关的CSS表达式选择元素 如果没有加#t1&#xff0c;那么表示的是选择所有的p 使用…...

GuLi商城-商品服务-API-品牌管理-统一异常处理

每个方法都加这段校验太麻烦了 准备做一个统一异常处理@ControllerAdvice 后台代码: package com.nanjing.gulimall.product.exception;import com.nanjing.common.exception.BizCodeEnum; import com.nanjing.common.utils.R; import lombok.extern.slf4j.Slf4j; import org…...

VUE+Spring Flux实现SSE长连接

VUE代码 // 初始化EventSourceinitEventSource(url) {const token getAccessToken();const eventSource new EventSourcePolyfill(url, {headers: {Authorization: Bearer ${token},tenant-id: getTenantId(),}});eventSource.onerror (e) > {console.log("SSE连接错…...

C#实现Winform程序右下角弹窗消息提示

前言 消息通知在应用程序中&#xff0c;是一种非常有用的功能&#xff0c;实现对一些重要信息、提醒或警告及时向用户展示。我们在使用软件时&#xff0c;通常会收到一种从桌面右下角弹出的&#xff08;提示信息或广告&#xff09;信息框。本文将介绍使用 C# 实现此种方式的信息…...

Java三剑客:封装、继承、多态的魔法世界

第一章&#xff1a;封装的艺术 —— 保护你的宝藏 案例分析&#xff1a;银行账户系统 想象一下&#xff0c;你正在构建一个银行账户系统。每个账户都有一个余额&#xff0c;这个余额需要受到严格的保护&#xff0c;不能被随意修改。我们可以通过封装来实现这一目标。 示例代…...

0145__Linux的capability

https://zhuanlan.zhihu.com/p/693896673 Linux的capability深入分析&#xff08;1&#xff09;_linux 设置进程capprm-CSDN博客 cap_init(3) - Linux manual page...

# Redis 入门到精通(一)数据类型(4)

Redis 入门到精通&#xff08;一&#xff09;数据类型&#xff08;4&#xff09; 一、redis 数据类型–sorted_set实现时效性任务管理 1、sorted_set 类型数据操作的注意事项 score 保存的数据存储空间是64位&#xff0c;如果是整数范围是-9007199254740992~9007199254740992…...

西邮计科嵌入式复习

西邮嵌入式复习 一、第一章复习二、第二章复习三、第三章复习四、第四章复习 一、第一章复习 二、第二章复习 三、第三章复习 四、第四章复习...

Java如何使用 HttpClientUtils 发起 HTTP 请求

Java如何使用 HttpClientUtils 发起 HTTP 请求 一、前言1.HttpClientUtils 类概览2.解析 HttpClientUtils 类3.使用 HttpClientUtils 类 一、前言 在现代的软件开发中&#xff0c;经常需要与远程服务器进行通信&#xff0c;例如获取数据或发送数据。Apache HttpClient 是一个流…...

无人机的工作原理

无人飞行器&#xff08;UAV&#xff0c;即Unmanned Aerial Vehicle&#xff09;的工作原理涉及多个复杂的系统和技术。以下是对各个系统和技术的详细介绍&#xff1a; 1. 飞行控制系统&#xff08;FCS&#xff09; 飞行控制系统是无人机的“大脑”&#xff0c;负责监控和调整…...

敏捷开发笔记(第10章节)--Liskov原则(LSP)

目录 1&#xff1a;PDF上传链接 10.1 Liskov替换原则&#xff08;LSP&#xff09; 10.2 一个违反LSP的简单例子 10.6 启发式规则和习惯用法 10.7 结论 1&#xff1a;PDF上传链接 【免费】敏捷软件开发(原则模式与实践)资源-CSDN文库 OCP背后的主要机制是抽象(abstraction…...

基于SSM的校园一卡通管理系统的设计与实现

摘 要 本报告全方位、深层次地阐述了校园一卡通管理系统从构思到落地的整个设计与实现历程。此系统凭借前沿的 SSM&#xff08;Spring、Spring MVC、MyBatis&#xff09;框架精心打造而成&#xff0c;旨在为学校构建一个兼具高效性、便利性与智能化的一卡通管理服务平台。 该系…...

新版Android Studio中设置gradle的JDK版本

旧版android studio 在旧版&#xff08;具体哪个版本号之前搞不清了&#xff09;中设置JDK版本在>File——>Project Structure——>SDK location——>Gradle Setting——>Gradle SDK 新版android studio 某次更新后发现SDK location下找不到Gradle Setting选项…...

打造你的智能家居指挥中心:基于STM32的多协议(zigbee、http)网关(附代码示例)

1. 项目概述 随着物联网技术的蓬勃发展&#xff0c;智能家居正逐步融入人们的日常生活。然而&#xff0c;市面上琳琅满目的智能家居设备通常采用不同的通信协议&#xff0c;导致不同品牌设备之间难以实现互联互通。为了解决这一难题&#xff0c;本文设计了一种基于STM32的多协…...

【基于R语言群体遗传学】-16-中性检验Tajima‘s D及连锁不平衡 linkage disequilibrium (LD)

Tajimas D Test 已经开发了几种中性检验&#xff0c;用于识别模型假设的潜在偏差。在这里&#xff0c;我们将说明一种有影响力的中性检验&#xff0c;即Tajimas D&#xff08;Tajima 1989&#xff09;。Tajimas D通过比较数据集中的两个&#x1d703; 4N&#x1d707;估计值来…...

防火墙组网与安全策略实验

实验要求&#xff1a; 实现&#xff1a; 防火墙接口配置&#xff1a; 所有接口均配置为三层接口 由于G1/0/3口下为vlan环境&#xff0c;所以防火墙需要配置子接口 &#xff1a; 交换机划分vlan分开生产区和办公区、配置trunk干道 &#xff1a; 安全策略&#xff1a; 生产区访…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上&#xff0c;对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

算法250609 高精度

加法 #include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<algorithm> using namespace std; char input1[205]; char input2[205]; int main(){while(scanf("%s%s",input1,input2)!EOF){int a[205]…...

【java】【服务器】线程上下文丢失 是指什么

目录 ■前言 ■正文开始 线程上下文的核心组成部分 为什么会出现上下文丢失&#xff1f; 直观示例说明 为什么上下文如此重要&#xff1f; 解决上下文丢失的关键 总结 ■如果我想在servlet中使用线程&#xff0c;代码应该如何实现 推荐方案&#xff1a;使用 ManagedE…...