DenseCLIP论文讲解

news/2024/5/20 22:15:39

文章目录

  • 简介
  • 方法
    • 总体框架 (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.mrgr.cn/p/33803571

相关文章

SQL脚本中存在很多括号,无法直观进行匹配。

解决方案1:SSMS中找到前括号按下空格或tab,会自动匹配到对应的后括号,如下图。解决方案2:使用在线格式化工具进行格式化,该工具格式化功能更强大且会自动去除多余无意义的括号组。 https://tool.oschina.net/codeformat/sql 在线代码格式化 (oschina.net)

怎样的跨网软件,可以实现网间数据的安全收发?

网络隔离已是较为常见的网络安全保护措施,比如防火墙、网闸、VLAN,云桌面虚拟环境等方面进行隔离。像一些科技研发型企业,不仅仅是内外网隔离,甚至还划分办公网、研发网、测试网、生产网等,防止研发资料、设计资料等敏感信息泄漏。但隔离后仍存在文件数据需要进行流转的场…

Fatal error in launcher: Unable to create process using d:\python38\python3.exe ...

使用场景:本地主机安装好的python3.8 版本的运行环境,迁移道其他主机执行pip install -r .\requirements.txt 运行一下命令解决:python3 -m pip install watchdog

Nexpose v6.6.251 for Linux Windows - 漏洞扫描

Nexpose v6.6.251 for Linux & Windows - 漏洞扫描Nexpose v6.6.251 for Linux & Windows - 漏洞扫描 Rapid7 Vulnerability Management, Release May 08, 2024 请访问原文链接:Nexpose v6.6.251 for Linux & Windows - 漏洞扫描,查看最新版。原创作品,转载请保…

Prometheus+Alertmanager+webhook-dingtalk实现钉钉告警

文章目录 一、前提准备及规划 二、安装及启动 2.1 Prometheus安装启动 2.2 Node_export安装启动 2.3 Alertmanager安装启动 2.4 Webhook-dingtalk安装启动 三、配置及测试 3.1 Webhook-dingtalk配置钉钉webhook地址 3.2 Alertmanager配置钉钉告警 3.3 Prometheus集成Alertmanag…

mac本地搭建ollama

mac本地搭建ollama webUI *简介:ollama-webUI是一个开源项目,简化了安装部署过程,并能直接管理各种大型语言模型(LLM)。本文将介绍如何在你的macOS上安装Ollama服务并配合webUI调用api来完成聊天。 开源地址https://github.com/812781385/ollama-webUI.git,开源不易感谢s…

docker 安装elasticsearch8.X

docker 安装elasticsearch8.X 安装elasticsearch8.X前言安装elasticsearch安装elasticsearch-analysis-ik安装kibana 安装elasticsearch8.X 前言 由于需要安装elasticsearch、IK分词插件、kibana。所以需要保持这三者的版本一致性。 elasticsearch 8.12.2 kibana 8.12.2 ela…

如何安全高效地进行企业文档外发,一文了解!

企业文档外发是指将企业的内部文件、文档或信息发送给企业外部的个人或组织。目前使用比较多的企业文档外发的方式有以下几种,可以了解看一下: 1.邮件系统:通过电子邮件发送文档,这是最传统的文档外发方式之一。 2.即时通讯工具:如微信、QQ、企业微信、钉钉、飞书等,这些工…

Gantt图和PERT图的相关知识

1、Gantt 图Gantt图以时间为基准描述项目任务,可以清晰的描述每个任务从何时开始,到何时结束,以及每个任务的并行关系,但是不能反映项目各任务之间的依赖关系,也无法确定整个任务的关键所在。2、PERT图计划评审技术(Program Evaluation and Review Technique,简称PERT)…

ESP32引脚入门指南(三):从理论到实践(Touch Pin)

引言 ESP32作为物联网领域的明星微控制器,不仅以其强大的网络通信能力著称,还内置了丰富的外设资源,其中就包括电容式触摸传感(Capacitive Touch)功能。本文旨在深入浅出地介绍ESP32的Touch引脚,带你了解其…

【训练与预测】02 - 完整的模型验证套路

02 - 完整的模型验证套路 模型图 验证一个模型就是指使用已经训练好的模型,然后给它提供输入。 test.py import torch import torchvision from PIL import Imagedevice torch.device("cuda" if torch.cuda.is_available() else "cpu") ima…

Github 2024-05-10 Java开源项目日报Top10

根据Github Trendings的统计,今日(2024-05-10统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目10C++项目2JavaGuide - Java 程序员学习和面试指南 创建周期:2118 天开发语言:Java协议类型:Apache License 2.0Star数量:140773 个…

Rust工作空间(workspace)实践

本文将介绍如何使用cargo workspace来管理多个package,并通过实践介绍workspace的一些基础场景下的使用、配置方式。在rust中编写某些中小型项目时,我们通常不会将一个工程拆分为多个package,而是通过一个package下不同的目录模块来实现模块拆分,尽管大部分场景下这种开发方…

C++三部曲|C++编程核心思想

| 导语 C 的起源可以追溯到 40 年前,但它仍然是当今使用最广泛的编程语言之一,C发明人Bjarne Stroustrup 一开始没想到 C 会获得如此大的成功,他说:“C 的成功显然令人惊讶。我认为它的成功取决于其最初的设计目标,就是…

一文读懂Vue生命周期(Vue2)

一文读懂Vue生命周期(Vue2) 目录 一文读懂Vue生命周期(Vue2)1 前言2 Vue生命周期2.1 基本生命周期2.1.1 8个生命周期2.1.2 案例 2.2 组件生命周期2.2.1 父子生命周期2.2.2 案例 2.3 keep-alive生命周期2.3.1 案例 2.4 其他 3 总结…

C#动态查询:巧用Expression组合多条件表达式

概述:在C#中,通过`Expression`类、`AndAlso`和`OrElse`方法可组合两个`Expression<Func<T, bool>>`,实现多条件动态查询。通过创建表达式树,可轻松构建复杂的查询条件。 在C#中,可以使用AndAlso和OrElse方法组合两个Expression<Func<T, bool>>类型…

《Decoupled Optimisation for Long-Tailed Visual Recognition》阅读笔记

论文标题 《Decoupled Optimisation for Long-Tailed Visual Recognition》 长尾视觉识别的解耦优化 作者 Cong Cong、Shiyu Xuan、Sidong Liu、Shiliang Zhang、Maurice Pagnucco 和 Yang Song、 来自新南威尔士大学计算机科学与工程学院、北京大学计算机学院多媒体信息处理国…

、、、、、

、、 Java虚拟机栈存储了Java方法调用时的栈帧&#xff0c;而本地方法栈存储的是native本地方法的栈帧。 这里的native本地方法、指的是&#xff1f; 在Java中&#xff0c;native本地方法指的是、使用其他语言&#xff08;如C、C等&#xff09;编写的方法&#xff0c;这些方…

Rocketmq 不同的topic要配不同的consumegroup

Rocketmq 不同的topic要配不同的consumegroup 使用Rocketmq一定要注意,如果项目中要订阅两个topic,一定要保证consumeGroup是两个不同的。这是因为,Consumer会定期发送心跳,默认是30s一次。心跳会像全部broker发送,心跳包内容包括groupname,topicname1。然后broker端会缓…

基于docker安装flink

文章目录 环境准备Flinkdocker-compose方式二进制部署 KafkaMysql Flink 执行 SQL命令进入SQL客户端CLI执行SQL查询表格模式变更日志模式Tableau模式窗口计算 窗口计算滚动窗口demo滑动窗口 踩坑 环境准备 Flink docker-compose方式 version: "3" services:jobman…