DenseCLIP论文讲解

文章目录

  • 简介
  • 方法
    • 总体框架 (Language-Guided Dense Prediction)
    • 上下文感知提示 (Context-Aware Prompting)
    • 应用实例

论文:DenseCLIP: Language-Guided Dense Prediction with Context-Aware Prompting
代码:https://github.com/raoyongming/DenseCLIP

简介

  • 提出背景
    现有的方法大多数用CLIP预训练模型来解决分类任务,但是很少应用在密集预测的任务上。本文就主要研究如何微调预训练的CLIP模型,使其可以应用于密集预测任务
  • 困难挑战
    与传统的ImageNet预训练模型相比,最大的挑战是上游对比预训练任务和下游逐像素预测任务之间的gap,前者涉及图像和文本的实例级表示,而后者仅基于像素级的视觉信息。
  • 解决思路
    为了解决上述问题,通过隐式和显式地利用来自CLIP的预训练知识,提出了一个语言引导的密集预测框架: DenseCLIP。 该框架是模型不可知(model-agnostic)且即插即用(plug-and-play),可以应用于任意密集预测系统和各种预训练的视觉主干。
    (1)隐式方法:直接对下游数据集上的模型进行微调。但是这种直接的方法不能充分利用CLIP模型的潜力。
    (2)显示的方法:受CLIP中原始对比学习框架的启发,将CLIP中的原始图像-文本匹配问题转换为像素-文本匹配问题,并使用像素-文本得分映射来指导密集预测模型的学习。通过进一步使用图像中的上下文信息来提示语言模型,能够促进模型更好地利用预训练的知识。

在这里插入图片描述

  • 传统的预训练+微调模式:如上图所示,通常通过在ImageNet等大规模数据集上对骨干模型进行监督分类或自监督学习来完成,然后在骨干模型上添加特定任务的模块,如检测器或分割解码器,然后在训练数据较少的目标数据集上对整个模型进行微调。
    在这里插入图片描述
  • DenseCLIP的预训练步骤:CLIP预训练模型+语言引导的微调
    DenseCLIP通过引入新的像素-文本匹配任务,将图像-文本对比学习的知识转移到密集预测模型中,并进一步使用图像中的上下文信息提示预训练的语言模型。

方法

总体框架 (Language-Guided Dense Prediction)

在这里插入图片描述
如上图所示,DenseCLIP的步骤如下:

  • DenseCLIP首先提取图像嵌入(image embeddings)和 K类文本嵌入(k-class text embeddings)
  • 然后计算像素-文本得分映射(pixel-text score maps),将CLIP中原始的图像-文本匹配问题转化为像素-文本匹配进行密集预测。
  • 这些分数图被输入到解码器中,并使用真值标签进行监督。
  • 为了更好地利用预先训练的知识,DenseCLIP使用图像中的上下文信息来用Transformer模块提示语言模型。

除了全局图像特征,我们还可以从CLIP图像编码器的最后一层提取语言兼容的特征映射。
以ResNet编码器为例,总共有4个阶段,我们将特征映射表示为 { x i } i − 1 4 \{x_i\}^4_{i-1} {xi}i14。与原来的ResNet不同,CLIP增加了一个注意力池化层(attention pooling layer)。
CLIP首先对 x 4 ∈ R H 4 W 4 × C x_4\in R^{H_4W_4\times C} x4RH4W4×C进行全局平均池化,得到一个全局特征 x ˉ 4 ∈ R 1 × C \bar x_4\in R^{1\times C} xˉ4R1×C, 其中 H 4 H_4 H4 W 4 W_4 W4 C C C分别为骨干网第4段特征图的高度、宽度和通道数。
然后将连接的特征 [ x ˉ 4 , x 4 ] [\bar x_4, x_4] [xˉ4,x4]馈送到多头自关注层 (MHSA)。
⌈ z ‾ , z ] = MHSA ⁡ ( [ x ‾ 4 , x 4 ] ) . \lceil\overline{\mathbf{z}}, \mathbf{z}]=\operatorname{MHSA}\left(\left[\overline{\mathbf{x}}_4, \mathbf{x}_4\right]\right) . z,z]=MHSA([x4,x4]).
在CLIP的标准训练过程中,使用全局特征 z ‾ \overline{\mathbf{z}} z作为图像编码器的输出,而其他输出 z \mathbf{z} z通常被忽略。
然而,作者发现z有两个有趣的性质: (1) z \mathbf{z} z仍然保留了足够的空间信息,因此可以作为特征映射。(2)由于MHSA对每个输入元素都是对称的,所以 z \mathbf{z} z的行为可能类似于 z ‾ \overline{\mathbf{z}} z,这与语言特征很好地一致。

为了获得文本特征,我们可以从模板“a photo of a [CLS]”中构造文本提示。,用K个类名,使用CLIP文本编码器提取特征 t ∈ R K × C t\in R^{K×C} tRK×C
然后,使用语言兼容的特征图 z \mathbf{z} z和文本特征 t t t来计算像素-文本分数图 (pixel-text score maps):
s = z ^ t ^ ⊤ , s ∈ R H 4 W 4 × K \mathbf{s}=\hat{\mathbf{z}} \hat{\mathbf{t}}^{\top}, \quad \mathbf{s} \in \mathbb{R}^{H_4 W_4 \times K} s=z^t^,sRH4W4×K
其中 z ^ \hat{\mathbf{z}} z^ t ^ \hat{\mathbf{t}}^{} t^ z \mathbf{z} z t \mathbf{t} t沿着通道维度的L2 normalization
score maps描述了像素-文本匹配的结果。首先,score maps可以看作是分辨率较低的分割结果,因此我们可以使用它们来计算辅助分割损失。其次,我们可以将score maps连接到最后一个特征映射,以显式地合并语言先验,例如:
x 4 ′ = [ x 4 , s ] ∈ R H 4 W 4 × ( C + K ) \mathbf{x}_4^{\prime}=\left[\mathbf{x}_4, \mathbf{s}\right] \in \mathbb{R}^{H_4 W_4 \times(C+K)} x4=[x4,s]RH4W4×(C+K)

上下文感知提示 (Context-Aware Prompting)

在DenseCLIP中并没有使用人工预定义模板,而是寻求其他方法来改进文本特征。

  • Language-domain prompting
    受到CoOP的启发,在DenseCLIP框架中使用可学习的文本上下文(learnable textual contexts)作为基线,它只包括语言域提示 (language-domain prompting)。然后文本编码器的输入变成:
    [ p , e k ] , 1 ≤ k ≤ K \left[\mathbf{p}, \mathbf{e}_k\right], \quad 1 \leq k \leq K [p,ek],1kK
    其中 p ∈ R N × C \mathbf{p} \in \mathbb{R}^{N \times C} pRN×C是 learnable textual contexts, e k ∈ R C \mathbf{e}_k \in \mathbb{R}^C ekRC k k k-th 个类别的名称嵌入.
  • Vision-to-language prompting
    包括视觉上下文的描述可以使文本更准确。例如,“一张猫在草地上的照片。比“一张猫的照片”更准确。
    因此,我们研究了如何使用视觉上下文来优化文本特征。一般来说,我们可以使用Transformer解码器中的交叉注意机制(cross-attention mechanism)来模拟视觉和语言之间的交互。

作者提出了两种不同的上下文感知提示策略
在这里插入图片描述

  • 第一个策略是模型前提示(pre-model prompting)。
    我们将特征 [ z ‾ , z ] [\overline{\mathbf{z}}, \mathbf{z}] [z,z]传递给Transformer解码器来编码视觉上下文:
    v pre  = TransDecoder ⁡ ( q , [ z ‾ , z ] ) \mathbf{v}_{\text {pre }}=\operatorname{TransDecoder}(\mathbf{q},[\overline{\mathbf{z}}, \mathbf{z}]) vpre =TransDecoder(q,[z,z])
    其中 q ∈ R N × C \mathbf{q} \in \mathbb{R}^{N \times C} qRN×C 是一组 learnable queries, v pre  ∈ \mathbf{v}_{\text {pre }} \in vpre  R N × C \mathbb{R}^{N \times C} RN×C 是提取的visual contexts. (其实就是将Language-domain prompting中的 p \mathbf{p} p替换为 visual context v pre  \mathbf{v}_{\text {pre }} vpre 
    由于修改了文本编码器的输入,我们将此版本称为pre-model prompting

在这里插入图片描述

  • 第二种策略是模型后提示post-model prompting),是在文本编码器之后细化文本特征。在这个变体中,我们使用CoOp来生成文本特征,并直接将它们用作Transformer解码器的查询:
    v post  = TransDecoder ⁡ ( t , [ z ‾ , z ] ) \mathbf{v}_{\text {post }}=\operatorname{TransDecoder}(\mathbf{t},[\overline{\mathbf{z}}, \mathbf{z}]) vpost =TransDecoder(t,[z,z])
    这种策略促使文本特征找到最相关的视觉线索。
    然后,我们通过残差连接更新文本特征:
    t ← t + γ v post  \mathbf{t} \leftarrow \mathbf{t}+\gamma \mathbf{v}_{\text {post }} tt+γvpost 
    其中 γ ∈ R C \gamma \in \mathbb{R}^C γRC 是控制残差缩放的可学习参数, γ \gamma γ 初始化为非常小的值(例如, 1 0 − 4 10^{-4} 104 ),以最大限度地保留文本特征中的语言先验。

虽然这两种策略的目标相同,但我们更倾向于模型后提示 post-model prompting,主要有两个原因:
(1)模型后提示更高效的。模型前提示需要文本编码器在推理期间进行额外的前向传递,因为它的输入依赖于图像。在模型后提示的情况下,我们可以在训练后存储提取的文本特征,从而减少文本编码器在推理过程中带来的开销。
(2)实证结果表明,模型后提示比模型前提示效果更好。

应用实例

  • 语义分割
    DenseCLIP框架是模型不可知(model-agnostic)的,可以应用于任何密集的预测管道。
    此外,作者提出使用一个辅助目标函数来更好地在分割任务重利用像素文本分数图。
    由于分数映射 s ∈ R H 4 W 4 × K \mathbf{s} \in \mathbb{R}^{H_4 W_4 \times K} sRH4W4×K可以看作是较小的分割结果,因此我们计算其分割损失:
    L aux  seg  = CrossEntropy ⁡ ( Softmax ⁡ ( s / τ ) , y ) \mathcal{L}_{\text {aux }}^{\text {seg }}=\operatorname{CrossEntropy}(\operatorname{Softmax}(\mathbf{s} / \tau), \mathbf{y}) Laux seg =CrossEntropy(Softmax(s/τ),y)
    式中 τ = 0.07 \tau=0.07 τ=0.07 是 temperature coefficient , y ∈ { 1 , … , K } H 4 W 4 \mathbf{y} \in\{1, \ldots, K\}^{H_4 W_4} y{1,,K}H4W4 是ground truth label。
    辅助分割损失可以帮助特征映射更快地恢复其局部,有利于分割和检测的密集预测任务。
  • 目标检测 & 实例分割
    在这种情况下,我们没有ground truth label。为了构建与分割中类似的辅助损失,我们使用边界框和标签来构建一个二元目标 y ~ ∈ { 0 , 1 } H 4 W 4 × K \tilde{\mathbf{y}} \in\{0,1\}^{H_4 W_4 \times K} y~{0,1}H4W4×K。辅助目标可以定义为二值交叉熵损失:
    L aux  det  = BinaryCrossEntropy ⁡ ( Sigmoid ⁡ ( s / τ ) , y ~ ) \mathcal{L}_{\text {aux }}^{\text {det }}=\operatorname{BinaryCrossEntropy}(\operatorname{Sigmoid}(\mathbf{s} / \tau), \tilde{\mathbf{y}}) Laux det =BinaryCrossEntropy(Sigmoid(s/τ),y~)
  • 应用到任何骨干模型
    我们可以用任何骨干(例如,ImageNet预训练模型和自监督模型)替换CLIP的图像编码器。虽然视觉主干的输出与文本编码器之间可能没有很强的关系,但在语言指导下主干可以更好更快地学习。换句话说,我们可以利用预训练文本编码器的语言先验来提高任何预训练图像主干的性能,这使得DenseCLIP成为一个更通用的框架,可以利用从大规模预训练中学习到的自然语言先验来改进密集预测的性能。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最全软件测试面试问题和回答,适合全文背诵

求职,类似于打仗,是一场挑战自己的战斗,也是一场跟用人单位的博弈,更是一场千人过独木桥的厮杀、混战。《孙子谋攻篇》中早就说了:"知己知彼,百战不殆;不知彼而知己,一胜一负&a…

python数据分析——数据的选择和运算

数据的选择和运算 前言一、数据选择NumPy的数据选择一维数组元素提取示例 多维数组行列选择、区域选择示例 花式索引与布尔值索引布尔索引示例一示例二 花式索引示例一示例二 Pandas数据选择Series数据获取DataFrame数据获取列索引取值示例一示例二 取行方式示例loc() 方法示例…

error LNK2001: 无法解析的外部符号 “__declspec(dllimport) public: __cdecl ......

运行程序时,报如上图所示错误,其中一条是: ReflectionProbe.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: __cdecl osg::Object::Object(bool)" (__imp_??0ObjectosgQEAA_NZ) 报这个错误一般是因为…

10.轮转数组

文章目录 题目简介题目解答解法一:使用额外的数组代码:复杂度分析: 解法二:数组反转代码:复杂度分析: 题目链接 大家好,我是晓星航。今天为大家带来的是 轮转数组 相关的讲解!&#…

Gradle基础学习(六) 认识任务Task

理解Gradle中的任务 Gradle的构建过程基于任务(Task)的概念,而每个任务都可以包含一个或多个动作(Action)。 任务是构建中执行的一些独立的工作单元,例如编译类、创建JAR、生成Javadoc或将存档发布到仓库…

达梦数据库限制用户登录IP测试

达梦数据库创建用户时可以限制登录ip和时间段。 创建测试测试用户 create user test1 identified by Test_1234 ALLOW_IP "192.168.100.101"; 限定该用户只能通过192.168.100.101地址登录数据库 连接测试 上图可见,192.168.100.101客户端可以连接上19…

【数据结构】 二叉树的顺序结构——堆的实现

普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储 。 一、堆的概念及结构 父节点比孩子结点大 是大堆 父节点比孩子结点小 是小堆 堆的性质 堆中某…

java学习笔记反射机制

2.关于反射的理解 Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何 类的内部信息,并能直接操作任意对象的内部属性及方法。 框架 反射 注解 设计模式。 3.体会反射机制的“动态性” //…

什么是限流?常见的限流算法

目录 1. 什么是限流 2. 常见限流算法 3. 固定窗口算法 4. 滑动窗口算法 5. 漏桶算法 6. 令牌桶算法 7. 限流算法选择 1. 什么是限流 限流(Rate Limiting)是一种应用程序或系统资源管理的策略,用于控制对某个服务、接口或功能的访问速…

WordPress插件:链接自动识别转为超链接

WordPress插件&#xff1a;链接自动识别转为超链接 <?phpfunction open_links_in_new_tab() {add_filter(the_content, make_clickable);function autoblank($text) {$return str_replace(<a, <a target"_blank", $text);return $return;}add_filter(th…

【Python】selenium爬虫常见用法和配置,以及常见错误和解决方法

欢迎来到《小5讲堂》 这是《Python》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言无执行文件代码报错信息错误路径手动下载自动下载 选项配置Ch…

面试笔记——类加载器

基础 类加载器&#xff1a;用于装载字节码文件(.class文件)运行时数据区&#xff1a;用于分配存储空间执行引擎&#xff1a;执行字节码文件或本地方法垃圾回收器&#xff1a;用于对JVM中的垃圾内容进行回收 类加载器 &#xff1a;JVM只会运行二进制文件&#xff0c;类加载器的…

组件目录存放问题

目录 一、思考引入 二、组件分类 三、组件分类的目的 一、思考引入 .vue文件本质无区别&#xff0c;而路由相关的组件&#xff0c;为什么要放在views目录呢&#xff1f; 二、组件分类 .vue文件分2类&#xff1a;页面组件和复用组件。注意&#xff1a;都是.vue文件&#xff…

调试记录 CPU PCIE 找不到设备,AC 耦合电容的问题

1. 问题 现象&#xff1a; 1. 国产CPU的主板&#xff0c;主板内的PCIE 设备找的到&#xff0c;但是另一块板子上连接的PCIE 设备找不到。 2. 排查问题在哪里的计划 1. 检查原理图先排除信号定义的问题&#xff0c; TXRX是否反接。 2. 示波器检查PCIE 的时钟频率是否正确。 3. …

蒸汽工厂的新翼:数字孪生锅炉引领未来

在飞速发展的工业4.0时代&#xff0c;数字孪生技术已经深入到我们生产生活的方方面面。而对于那些承载着重工业血脉的蒸汽工厂来说&#xff0c;一项新的技术正在悄然改变它们的未来。 走进蒸汽工厂&#xff0c;感受传统与现代的交融 蒸汽工厂&#xff0c;这个充满力量与热情的…

翻译《The Old New Thing》 - Restating the obvious about the WM_COMMAND message

Restating the obvious about the WM_COMMAND message - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20060302-10/?p32093 Raymond Chen 2006年03月02日 关于 WM_COMMAND 消息的显而易见的知识点补充 简要 本文详细解释了 WM_COMMAND 消息…

一文读懂ipv4和ipv6的区别

IPv4和IPv6是互联网协议的两个主要版本&#xff0c;它们在多个方面存在显著的差异。以下是关于IPv4和IPv6之间区别的详细探讨&#xff1a; 一、地址空间 IPv4使用32位地址&#xff0c;理论上可以表示约42.9亿个不同的地址。然而&#xff0c;由于地址分配的不均衡以及网络技术的…

清华团队开发首个AI医院小镇模拟系统;阿里云发布通义千问 2.5:超越GPT-4能力;Mistral AI估值飙升至60亿美元

&#x1f989; AI新闻 &#x1f680; 清华团队开发首个AI医院小镇模拟系统 摘要&#xff1a;来自清华的研究团队最近开发出了一种创新的模拟系统&#xff0c;名为"Agent Hospital"&#xff0c;该系统能够完全模拟医患看病的全流程&#xff0c;其中包括分诊、挂号、…

element ui的确认提示框按钮样式修改

修改确认提示框的默认按钮样式&#xff0c;使用css强制修改 例&#xff1a; js代码&#xff1a; deleteUser(params){this.$confirm("您确定要删除吗&#xff1f;此操作无法撤销并且将永久删除所有数据。", "提示", { type: "warning", cancel…

批量自定义重命名,一键添加顺序编号,文件夹管理更高效!

我们经常需要对文件夹进行管理和整理。然而&#xff0c;当面对大量需要改名的文件夹时&#xff0c;手动逐个修改不仅效率低下&#xff0c;还容易出错。那么&#xff0c;有没有一种方法能够批量自定义重命名文件夹&#xff0c;并在名称后自动添加顺序编号呢&#xff1f;答案是肯…