论文阅读《Semantic Prompt for Few-Shot Image Recognition》

论文地址:https://arxiv.org/pdf/2303.14123.pdf
论文代码:https://github.com/WentaoChen0813/SemanticPrompt

目录

  • 1、存在的问题
  • 2、算法简介
  • 3、算法细节
    • 3.1、预训练阶段
    • 3.2、微调阶段
    • 3.3、空间交互机制
    • 3.4、通道交互机制
  • 4、实验
    • 4.1、对比实验
    • 4.2、组成模块消融
    • 4.3、插入层消融
    • 4.4、Backbone和分类器消融
    • 4.5、投影函数和池化消融
    • 4.6、插入图像大小消融

1、存在的问题

目前,针对小样本问题,有一种比较有效的解决方案:
使用其他模态的辅助信息,例如自然语言,来辅助学习新概念。即根据样本的类名提取出文本特征,将文本特征和视觉特征相结合。

该思路存在的问题:文本特征可能包含了新类与已知类之间的语义联系,但缺少与底层视觉表示的交互。因此在只有有限的支持图像的情况下,直接从文本特征中得到类的原型会使学习到的视觉特征受到虚假特征的影响,例如背景杂乱时,难以产生准确的类原型。

例如,给定一个新类别“独轮车”的支持图像,特征提取器可能捕获包含独轮车和其他干扰物(如骑手和瓦片屋顶)的图像特征,而无法识别其他环境中的独轮车。
在这里插入图片描述

2、算法简介

本文提出了一种新颖的语义提示方法,利用类名的文本信息作为语义提示,自适应地调整特征提取网络,使得图像编码器只关注和语义提示相关的视觉特征,忽略其他干扰信息。

本文主要提出了一个语义提示SP模块和模块中两种互补的信息交互机制:
1、SP模块: 可以插入到特征提取器的任何层中,包含空间和通道交互部分。

2、空间交互机制: 将语义提示特征和图像块特征串联在一起,然后送入Transformer层中,通过自注意力层,语义提示可以和每个图像块特征进行信息交互从而使模型关注类别相关的图像区域。

3、通道交互机制: 首先从所有图像块中提取视觉特征,然后将视觉特征和语义提示特征拼接后送入MLP得到调制向量,最后将调制向量加到每个图像块特征上以实现对视觉特征逐通道的调整。

3、算法细节

网络的训练包括两个阶段:

第一阶段,通过对基数据集中的所有图像进行分类来预训练一个特征提取器 f f f

第二阶段,采用元训练策略,使用语义提示SP对特征提取器 f f f进行微调。
在这里插入图片描述

3.1、预训练阶段

采用Visformer作为特征提取器 f f f,在基类数据集上完成训练。

Visformer是原始ViT的一个变体,用卷积块代替了前7个Transformer层,其网络结构如下图所示:
在这里插入图片描述

第一步,将输入图像 x ∈ R H × W × C x\in\mathbb{R}^{H\times W\times C} xRH×W×C划分为 M M M个图像块序列:
X = x p 1 , x p 2 , . . . , x p M , x p i ∈ R P × P × C X=x_p^1,x_p^2,...,x_p^M, \quad x_p^i\in\mathbb{R}^{P\times P\times C} X=xp1,xp2,...,xpM,xpiRP×P×C

第二步,将每个图像块映射为一个嵌入向量,并加入位置编码:
Z 0 = [ z 0 1 , z 0 2 , . . . , z 0 M ] , z 0 i ∈ R C z Z_0=[z_0^1,z_0^2,...,z_0^M], \quad z_0^i\in\mathbb{R}^{C_z} Z0=[z01,z02,...,z0M],z0iRCz

第三步,patch token被送入到 L L L层的Transformer层进行视觉特征的提取。
每层Transformer都由多头自注意力(MSA)模块、MLP 块、归一化层和残差连接组成。

第四步,最后,在第 L L L层,计算所有嵌入向量的平均值作为提取到的图像特征。

作为参考,同时给出Vision Transformer的网络结构:
在这里插入图片描述

3.2、微调阶段

接下来,使用大规模预训练的NLP模型来从类名中提取文本特征。
采用元训练策略对特征提取器进行微调,使模型适应语义提示。

第一步,针对训练集中的支持图像 x s x^s xs,其类名为 y t e x t y^{text} ytext,将类名输入到预先训练好的文本编码器 g ( ⋅ ) g(\cdot) g()中,提取得到语义特征 g ( y t e x t ) g(y^{text}) g(ytext)

第二步,语义特征被送入训练好的特征提取器中计算图像的特征:
f g ( x s ) = f ( x s ∣ g ( y t e x t ) ) f_g(x^s)=f(x^s|g(y^{text})) fg(xs)=f(xsg(ytext))

第三步,在每个类中,将计算得到的支持图像的特征求平均,从而计算出第 i i i个类的原型:
p i = 1 K ∑ j = 1 K f g ( x j s ) p_i = \frac1K \sum_{j=1}^K f_g (x_j^s ) pi=K1j=1Kfg(xjs)

第四步,在元训练期间,冻结文本编码器 g ( ⋅ ) g(\cdot) g(),通过交叉熵损失最大化查询样本 与其原型之间的特征相似性来微调其他参数。

3.3、空间交互机制

在这里插入图片描述
第一步,给定第 l l l层的语义特征 g ( y t e x t ) g(y^{text}) g(ytext)和图像块嵌入序列 Z l − 1 = [ z l − 1 1 , z l − 1 2 , . . . , z l − 1 M ] ∈ R M × C z Z_{l-1}=[z_{l-1}^1,z_{l-1}^2,...,z_{l-1}^M]\in\mathbb{R}^{M\times C_z} Zl1=[zl11,zl12,...,zl1M]RM×Cz

使用投影函数调整语义特征的维度和图像块嵌入的维度一致 z 0 = h s ( g ( y t e x t ) ) ∈ R C z z^0=h_s\left(g(y^{text})\right)\in\mathbb{R}^{C_z} z0=hs(g(ytext))RCz

使用投影后的语义特征与图像块嵌入序列拼接 Z ^ l − 1 = [ z 0 , z l − 1 1 , . . . , z l − 1 M ] \hat{Z}_{l-1}=[z^0,z_{l-1}^1,...,z_{l-1}^M] Z^l1=[z0,zl11,...,zl1M]

第二步,将扩展后的序列输入到Transformer层,其中包含多头自注意力模块MSA;

第三步,MSA将每个图像块嵌入映射为3个向量:
[ q , k , v ] = Z ^ l − 1 W q k v , q , k , v ∈ R N h × ( M + 1 ) × C h [q,k,v]=\hat{Z}_{l-1}W_{qkv},\quad q,k,v\in\mathbb{R}^{N_h\times(M+1)\times C_h} [q,k,v]=Z^l1Wqkv,q,k,vRNh×(M+1)×Ch

第四步,取q和k之间的内积并沿空间维度执行softmax计算注意力权重A,注意力 权重用于选择和聚合来自不同位置的信息:
A = s o f t m a x ( q k T / C h 1 4 ) , A ∈ R N h × ( M + 1 ) × ( M + 1 ) A=softmax(qk^T/C_h^{\frac14}),\quad A\in\mathbb{R}^{N_h\times(M+1)\times(M+1)} A=softmax(qkT/Ch41),ARNh×(M+1)×(M+1)

第五步,通过连接所有头输出的注意力权重并通过线性投影得到最终输出:
M S A ( Z l − 1 ^ ) = ( A v ) W o u t MSA(\hat{Z_{l-1}})=(Av)W_{out} MSA(Zl1^)=(Av)Wout

3.4、通道交互机制

在这里插入图片描述
第一步,给定第 l l l层的语义特征 g ( y t e x t ) g(y^{text}) g(ytext)和图像块嵌入序列 Z l − 1 = [ z l − 1 1 , z l − 1 2 , . . . , z l − 1 M ] ∈ R M × C z Z_{l-1}=[z_{l-1}^1,z_{l-1}^2,...,z_{l-1}^M]\in\mathbb{R}^{M\times C_z} Zl1=[zl11,zl12,...,zl1M]RM×Cz

计算所有的图像块嵌入的平均值,得到一个全局视觉上下文向量:
z l − 1 c = 1 M ∑ i = 1 M z l − 1 i z_{l-1}^c=\frac1M\sum_{i=1}^Mz_{l-1}^i zl1c=M1i=1Mzl1i

第二步,使用投影函数调整语义特征的维度和图像块嵌入的维度一致 z 0 = h c ( g ( y t e x t ) ) ∈ R C z z^0=h_c(g(y_{text}))\in\mathbb{R}^{C_z} z0=hc(g(ytext))RCz

第三步,使用投影后的语义特征与全局视觉上下文向量拼接 [ z 0 ; z l − 1 c ] [z^0;z_{l-1}^c] [z0;zl1c]

第四步,将拼接后的向量送入两层的MLP得到调制向量:
β l − 1 = σ ( W 2 σ ( W 1 [ z 0 ; z l − 1 c ] + b 1 ) + b 2 ) \beta_{l-1}=\sigma(W_2\sigma(W_1[z^0;z_{l-1}^c]+b_1)+b_2) βl1=σ(W2σ(W1[z0;zl1c]+b1)+b2)

第五步,将调制向量添加到所有的图像块嵌入中:
Z ~ l − 1 = [ z l − 1 i + β l − 1 , ] i = 1 , 2 , . . . , M \tilde{Z}_{l-1}=[z_{l-1}^i+\beta_{l-1},]\quad i=1,2,...,M Z~l1=[zl1i+βl1,]i=1,2,...,M
这样就可以在每个通道上调整视觉特征了。

4、实验

4.1、对比实验

在四个数据集上进行了对比实验,报告准确率
第一部分的信息不使用语义信息,中间的方法利用来自类名的提示信息或描述类语义信息
带有CLIP的SP比SBERT和GloVe在1-shot上取得了更好的效果,这可能是因为CLIP的多模态预训练导致语义嵌入与视觉概念更好的对齐。
在这里插入图片描述
在这里插入图片描述

4.2、组成模块消融

Aug:数据增强

SI:空间交互机制

CI:通道交互机制
在这里插入图片描述

4.3、插入层消融

特征提取器有三个阶段,每个阶段含有多个Transformer层。理论上语义提示可以在任意层插入,实验研究了二、三阶段不同层插入语义提示的实验结果。
插入高层时模型的表现较好,插入低层时模型的表现下降。这是因为语义提示向量特定于类,更高层的网络层提取的特征特定于类,而在低层提取的特征会在类间共享。
语义提示插入三阶段的整体表现较好,语义提示默认插入位置为layer3-2(三阶段的第二层)。
在这里插入图片描述

在这里插入图片描述

4.4、Backbone和分类器消融

简单地用Visformer替换ResNet-12并不能获得显著的提升。
而在本文的网络结构中,即当使用语义提示明显可以提高性能。
在这里插入图片描述

NN:余弦距离最近原型分类器。LR:线性逻辑回归分类器。
对于1-shot,NN分类器表现与LR分类器相当,而对于5-shot,LR从更多的训练样本中获益,性能比NN提高了0.53%。
在这里插入图片描述

4.5、投影函数和池化消融

线性投影函数和MLP投影函数相比,MLP投影函数略占优势。
相比之下,池化策略对性能的影响要大得多。当采用“Head”策略时,1-shot和5-shot的学习精度都很差。这表明提示向量位置处的输出容易对语义特征过度拟合,忽略图像块中丰富的视觉特征

Head: 选择语义提示向量位置处的输出

Patch: 对所有图像块的特征取平均

All: 对所有特征向量取平均

在这里插入图片描述

4.6、插入图像大小消融

保持卷积核大小和步长不变的情况下,缩小图像会导致精度下降,这是因为此时卷积核和步长太大不能捕获详细的视觉特征,应该相应地减少卷积核和步长,这样精度会提高。

在这里插入图片描述

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

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

相关文章

软件杯 深度学习交通车辆流量分析 - 目标检测与跟踪 - python opencv

文章目录 0 前言1 课题背景2 实现效果3 DeepSORT车辆跟踪3.1 Deep SORT多目标跟踪算法3.2 算法流程 4 YOLOV5算法4.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 *…

QT C++(QT对象树与内存泄漏管理,QT中文乱码问题)

文章目录 1. QT对象树与内存泄漏2. QT中文乱码 1. QT对象树与内存泄漏 #include "widget.h" #include "ui_widget.h" #include <QLabel>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//通过代码构…

SpringCloud Alibaba Sentinel 实现熔断功能

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第十六篇&#xff0c;即使用 Sentinel 实现熔断功能。 二、 Ribbon 系列 首先我们新建两个服务的提供者…

90天玩转Python—05—基础知识篇:Python基础知识扫盲,使用方法与注意事项

90天玩转Python系列文章目录 90天玩转Python—01—基础知识篇:C站最全Python标准库总结 90天玩转Python--02--基础知识篇:初识Python与PyCharm 90天玩转Python—03—基础知识篇:Python和PyCharm(语言特点、学习方法、工具安装) 90天玩转Python—04—基础知识篇:Pytho…

神经网络中的超参数调整

背景 在深度神经网络学习和优化中&#xff0c;超参数调整一项必备技能&#xff0c;通过观察在训练过程中的监测指标如损失loss和准确率来判断当前模型处于什么样的训练状态&#xff0c;及时调整超参数以更科学地训练模型能够提高资源利用率。在本研究中使用了以下超参数&#x…

cocos creator 安卓包 输入法遮挡问题

问题描述 Cocos Creator开发版本&#xff1a; v2.4.x 如上效果图。该需求是&#xff0c;进入游戏后&#xff0c;随机角色名&#xff0c;可以自己编辑。在未修改前 手机输入法遮挡了游戏的编辑框&#xff0c;导致无法直观展示&#xff0c;编辑的文字。尝试各种修改清单文件wind…

2024春算法训练4——函数与递归题解

一、前言 感觉这次的题目都很好&#xff0c;但是E题....&#xff08;我太菜了想不到&#xff09;&#xff0c;别人的题解都上百行了&#xff0c;晕&#xff1b; 二、题解 A-[NOIP2010]数字统计_2024春算法训练4——函数与递归 (nowcoder.com) 这种题目有两种做法&#xff1a;…

Golang单元测试和压力测试

一.单元测试 1.1 go test工具 go语言中的测试依赖go test命令。编写测试代码和编写普通的Go代码过程类似&#xff0c;并不需要学习新的语法&#xff0c;规则和工具。 go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内&#xff0c;所有以_test.go为后缀名的…

自定义gitlog格式

git log命令非常强大而好用&#xff0c;在复杂系统的版本管理中扮演着重要的角色&#xff0c;但默认的git log命令显示出的东西实在太丑&#xff0c;不好好打扮一下根本没法见人&#xff0c;打扮好了用alias命令拍个照片&#xff0c;就正式出道了&#xff01; 在使用git查看lo…

物联网可视化平台

随着数字化转型的深入&#xff0c;物联网技术正在成为企业实现智能化、高效化运营的重要工具。物联网可视化平台&#xff0c;作为连接物理世界与数字世界的桥梁&#xff0c;为企业提供了直观、实时的数据展示和监控能力&#xff0c;从而在数字化转型中扮演着关键角色。 一、物…

链路代价信息、链路状态信息(链路状态通告LSA)

链路代价信息"link cost information" 通常指的是**在网络中&#xff0c;数据包从一个节点传输到另一个节点所需承担的“成本”或者“开销”&#xff0c;这个概念常用于路由算法和网络设计中**。以下是一些关键要点&#xff1a; 1. **路径开销**&#xff1a;路径开…

【iOS】UITableView性能优化

文章目录 前言一、优化的本质二、卡顿产生原因三、CPU层面优化1.使用轻量级对象2.cellForRowAtIndexPath方法中不要做耗时操作3.UITableView的复用机制4.提前计算好布局了解tableView代理方法执行顺序cell高度计算rowHeightestimatedRowHeight 高度计算进行时机rowHeight计算时…

如何采集大众点评的商家信息-简数采集器

如何使用简数采集器批量采集大众点评的店铺和活动等相关信息呢&#xff1f; 简数采集器目前不支持采集大众点评的店家和活动等信息&#xff0c;不建议采集&#xff0c;请换个采集源采集。 简数采集器采集网站文章特别简单&#xff0c;不需要懂编程写代码&#xff0c;只需填写…

基于Spring Boot的网上书城系统(带文档)

主要功能 本次设计任务是要设计一个网上书城管理系统&#xff0c;通过这个系统能够满足网上书城的管理及用户的图书信息管理及购物功能。系统的主要功能包括&#xff1a;首页、个人中心、用户管理、图书类型管理、图书分类管理、图书信息管理、我的收藏管理、系统管理、订单管…

2.接口自动化测试学习-执行excel测试用例

1.接口自动化测试规划 编程语言 编程工具 自动化测试框架&#xff1a;pytest 报告可视化&#xff1a;allure 持续方案&#xff1a;CI持续集成-jenkins 仓库服务器&#xff08;自动化执行&#xff09;&#xff1a;github/gitlab/gitee 测试管理工具&#xff1a;jira 2.项目代码…

三防笔记本丨工业笔记本电脑丨助力测绘行业的数字化转型

测绘行业测绘行业一直是高度技术化的领域&#xff0c;其重要性在于为建设、规划和资源管理提供准确的地理数据。然而&#xff0c;随着技术的发展&#xff0c;传统的测绘方法已经难以满足对数据精度和实时性的要求。因此&#xff0c;测绘行业正逐渐向数字化转型&#xff0c;采用…

Node.js进阶——Express

文章目录 一、初识Express1、概念2、安装3、使用3、托管静态资源4、nodemon 二、Express路由1、概念2、使用1&#xff09;简单使用2&#xff09;模块化路由 三、Express中间件1、介绍2、语法1&#xff09;基本语法2&#xff09;next函数作用3&#xff09;定义中间件函数4&#…

成人英语口语学习-生活口语日常商务口语柯桥成人培训学校

如果你听见老外对你说forget-me-not&#xff0c;千万不要想太多。因为&#xff0c;他只是在说一种花的名字。就是长下面这样&#xff1a; forget-me-not的意思是勿忘我&#xff0c;是一种鲜花的名字。 例句&#xff1a;The plant is called forget-me-not. 这种植物叫勿忘我…

Vscode连接WSL2当中的jupyter

主要解决办法参考自这篇博客 1. 在WSL当中安装jupyter 这个随便找一篇博客即可&#xff0c;比如这篇&#xff0c;也可以根据现有的环境参考其它博客内容 2. 使用jupyter创建一个虚拟环境 首先激活想要添加的虚拟环境后&#xff0c;输入命令安装库: pip install ipykernel …

JUC:手写实现一个简易的线程池(Java)

目录 ​编辑 先上完整代码&#xff1a; 解析&#xff1a; 任务队列&#xff1a; 线程池类&#xff1a; 拒绝策略&#xff1a; 先上完整代码&#xff1a; public class MyThreadPool {public static void main(String[] args) {ThreadPool threadPool new ThreadPool(2, …