GroundVLP论文精读

基本信息

摘要

视觉定位是一项关键的视觉-语言任务,要求模型根据查询捕捉视觉上下文中的对象及其空间和属性信息。然而,由于视觉接地任务的标注数据受限于耗时且劳动密集的标注过程,导致训练模型的泛化能力受限,难以应对更广泛的领域。为解决这一挑战,我们提出了 GroundVLP,一种简单但有效的零样本方法,利用从图像-文本对和纯对象检测数据中获取的视觉接地能力,这两者相比视觉接地标注数据更易获取且覆盖更广的领域。GroundVLP 提出了一种融合机制,结合 GradCAM 的热图和开放词汇检测器(OVD)的对象提议。我们证明该方法在 RefCOCO/+g 数据集上显著优于其他零样本方法,在 RefCOCO 和 RefCOCO+ 的测试集上平均提升约 28%。此外,GroundVLP 的表现甚至优于一些非 VLP 基础的监督模型在 Flickr30k Entities 数据集上的表现。

现有方法的问题,作者的动机

  • 零样本视觉定位(Zero-shot Visual Grounding): 得益于自监督预训练的出现,预训练模型显著提升了视觉定位的结果 (Chen et al. 2020a; Kamath et al. 2021; Li et al. 2022b)。此外,尽管预训练目标与定位任务无关,但存在各种在视觉-语言对齐方面具有强大能力的预训练模型 (Zhang et al. 2021; Radford et al. 2021)。因此,提出了利用其优势进行零样本视觉定位的工作,例如 CPT 和 ReCLIP (Yao et al. 2021; Subramanian et al. 2022)。值得注意的是,存在另一种与我们不同的零样本定义,这种定义预测在训练期间未见的物体,并且仍然需要在定位数据集上进行训练 (Sadhu, Chen, and Nevatia 2019; Shi et al. 2022)。而 CPT、ReCLIP 和我们则没有在任何定位数据集上进行训练,但可以通过触发 VLP 的能力来执行定位任务。
  • 依赖大规模标注数据:视觉定位任务通常需要大量人工标注的训练数据,这些数据包括视觉场景中的对象及其与自然语言查询的对应关系。然而,这种标注过程耗时且劳动密集,导致可用的标注数据非常有限。
  • 模型泛化能力受限:过去的研究中,在有限的视觉定位数据上训练的 visual grounding 模型对未见过的分布泛化能力差、应用领域受限。

在这里插入图片描述


  • 减少对标注数据的依赖:在海量图文对数据上预训练的CLIP、ALBEF、BLIP等视觉-语言预训练模型(VLP)具备强大的零样本图文匹配能力,不需要微调即可很好地应用到新的领域上,同样在海量目标检测数据上训练的 Dectic 等开放词汇目标检测器(OVD)也具备出色的零样本泛化能力。
  • 提升模型泛化能力:直观地来看,VLP 擅长匹配整张图片和整个描述图片的句子,OVD 则从图片中提取局部对应的实体(检测框)并给出单词级别的描述,而 visual grounding 要做的是根据短语级别的描述,从整张图片中框出对应的实体,该任务与图文匹配、OVD 高度相关。
  • 因此本研究希望利用 VLP的语义理解能力OVD 的类别特定检测能力 来执行视觉定位,以无需训练的方式迁移到 visual grounding 这一数据贫瘠的相关任务上来。
  • 用于定位的 GradCAM(GradCAM for Grounding): GradCAM (Selvaraju et al. 2017) 被提出用于可视化模型针对特定输出头所关注的区域。当它用于 VLP 模型的 ITM 头时,GradCAM 可以表示一种从文本到图像的模态映射,这适用于视觉定位。因此,一些工作在弱监督设置下 (Li et al. 2021; He et al. 2022) 以及在机器人 3D 导航中 (Ha and Song 2022) 应用了它。与他们的不同,我们的方法 (1) 使用了提出的视觉-词注意力聚合来优化文本到图像的映射。(2) 可以通过章节中描述的方法,为任何用 ITM 预训练的 VLP 模型生成热图,这是一种通用方法。 (3) 引入了加权得分来改进热图与候选框之间的匹配,而不是像其他方法那样直接计算框包围的热图值。
    在这里插入图片描述

方法部分

GroundVLP要在无需大规模视觉定位标注数据的情况下,准确捕获图像中与语言查询相关的对象区域。它的方法主要由三个部分组成,初步介绍如下:

  1. VLP 模型:利用 GradCAM 技术从预训练的视觉语言模型中识别与给定表达式([expression])语义最相关的图像区域。通过 视觉词注意力聚合(Visual-Word Attention Aggregation) 优化文本到图像的模态映射,生成与语言查询相关的图像区域注意力热图(Heatmap)。在本文中,[query] 指的是由指代数据集提供的查询句子,[expression] 指的是我们需要进行指代的具体目标物体。对于REC任务,[expression] 等同于 [query] ;而在短语指代(phrase grounding)任务中,[expression] 表示 [query] 中包含的某个实体短语。
  2. 开放词汇检测器(OVD):根据预定义的对象类别检测候选对象区域,生成候选框(Bounding Boxes),从而减少噪声候选。OVD 可以利用预先定义的类别(ground-truth category),或通过 NLP 工具(文中使用的是 Stanza) 从查询中自动提取类别(predicted category)(但还是需要映射为评估数据集里预先定义的类别)
  3. 融合机制:结合 VLP 模型生成的热图和 OVD 的候选框,通过加权评分(Weighted Grade)选择最优的预测结果。具体步骤包括:①从 VLP 模型的 GradCAM 获取注意力图,并优化为热图。②使用 OVD 根据类别生成候选框。③通过加权评分机制融合热图和候选框信息,计算每个候选框的分数,最终选择得分最高的框作为预测结果。

几个需要注意的细节:

  • 仅针对视觉上可辨别的文本对象进行聚合GradCAM的注意力值,以优化从文本到图像的模态映射
  • OVD筛选框仅保留属于给定物体类别的候选框,以减少噪声候选物体
  • 作者探讨了在不使用 预先定义的类别(ground-truth category) 时性能下降的原因,并发现了 RefCOCO/+/g 数据集中固有的噪声和偏差。
  • 作者进行了详细的消融研究,以验证每个提出的组件的有效性,并展示了 OVD solely 较弱的视觉定位能力。
  • 出色的实验结果证明:我们可以利用易于获取的数据(例如图文对和纯目标检测数据)来处理传统上受 有限数据标注 限制的视觉定位任务。

在这里插入图片描述

Figure 3展示了GroundVLP的总体概况。我们首先通过GradCAM获取G。然后对其尺寸进行裁剪,并应用我们提出的视觉词注意力机制(visual-word attention aggression)来获取VLP的热力图。对于OVD模块,我们将参考目标的类别输入其中,以获得包括边界框和置信度分数在内的n个实例。最后,我们融合两部分,计算每个实例的加权分数,并输出分数最高的实例。

1. 注意力图

注意力图(attention map): 就是在一次注意力计算中,对每个查询token(query)在所有键token(key)上的关注度分布。具体地,它就是将查询矩阵 Q Q Q 与键矩阵 K K K 的点积按头(head)分别计算后,经过除以 d h \sqrt{d_h} dh 缩放并做 softmax 得到的权重矩阵 A A A。矩阵中每个元素 A h , i , j A_{h,i,j} Ah,i,j 表示第 h h h 个注意力头里,第 i i i 个查询 token 对第 j j j 个键 token 的注意力强度。把这些权重可视化,就得到了常说的注意力热图,反映模型在做预测时关注输入中各部分的程度。

给定一个文本-图像对,我们将其输入 VLP,并将 T 和 I 分别定义为文本和图像输入 token 的数量。某个层的注意力图,表示为 A,可以通过 Q 和 K 的乘积以及进一步的后处理来计算,具体定义在以下等式中: A = softmax ( Q K T d h ) A = \text{softmax}(\frac{Q K^T}{\sqrt{d_h}}) A=softmax(dh QKT),其中 Q ∈ R N h × s × d h Q \in \mathbb{R}^{N_h \times s \times d_h} QRNh×s×dh K ∈ R N h × q × d h K \in \mathbb{R}^{N_h \times q \times d_h} KRNh×q×dh A ∈ R N h × s × q A \in \mathbb{R}^{N_h \times s \times q} ARNh×s×q N h N_h Nh 是多头注意力的注意力头数, d h d_h dh 表示隐藏状态的维度, s s s q q q(分别是查询token和键token的序列长度)在不同的VLP模型架构中被赋予不同的值:

( s , q ) = { ( T + I , T + I ) 单流架构VLP模型 ( T , I ) 双流架构VLP模型 ( 1 ) (s, q) = \begin{cases} (T+I, T+I) & \text{单流架构VLP模型} \\ (T, I) & \text{双流架构VLP模型} \end{cases} \quad (1) (s,q)={(T+I,T+I)(T,I)单流架构VLP模型双流架构VLP模型(1)

单流(One-Stream)VLP 模型: 在单流模型中,文本和图像各自被分词、编码后,直接拼接在同一个序列里,输入到同一个 Transformer 中共同建模。此时:

  • 注意力范围
    • 查询(Query)token 序列长度: s = T + I s = T + I s=T+I
    • 键/值(Key/Value)token 序列长度: q = T + I q = T + I q=T+I
      也就是说,每个查询 token(无论是文本还是图像)都能同时对所有文本和所有图像 token 进行注意力计算。
  • 特点与优劣
    • 优点:能够在最底层就学习跨模态的细粒度交互。
    • 缺点:计算量大, O ( ( T + I ) 2 O((T+I)^2 O((T+I)2 的注意力开销,且当文本和图像长度很大时,效率瓶颈明显。

双流(One-Stream)VLP 模型: 文本和图像分别进入各自的编码器进行 独立建模,在此过程中通常只做同模态的自注意力;在后续阶段或特定层才引入跨模态的交互(如交叉注意力)。 此时:

  • 注意力范围
    • 文本自注意层内:查询长度 s = T s=T s=T,键/值长度 q = T q=T q=T
    • 图像自注意层内:查询长度 s = I s=I s=I,键/值长度 q = I q=I q=I
    • 若做跨模态交叉注意(Text→Image 或 Image→Text):通常查询来自一端,键/值来自另一端,此时 ( s , q ) = ( T , I ) (s,q)=(T,I) (s,q)=(T,I) ( I , T ) (I,T) (I,T)
  • 特点与优劣
    • 优点:自注意阶段只在各自模态内部进行,计算更高效;可以灵活控制跨模态交互的时机和频次。
    • 缺点:可能漏掉一些底层的细粒度跨模态依赖,需要精心设计计算交叉注意力的位置和方式。

接下来,我们通过反向传播计算梯度图: ∇ A = ( ∂ L i t m ∂ A ) + \nabla A = (\frac{\partial L_{itm}}{\partial A})^{+} A=(ALitm)+,其中 L i t m L_{itm} Litm 表示 VLP 模型 ITM 头的输出值,我们移除负贡献。最后,结果图 G ∈ R s × q G \in \mathbb{R}^{s \times q} GRs×q 由下式给出:

G = E h ( ∇ A ⊙ A ) G = \mathbb{E}_h(\nabla A \odot A) G=Eh(AA)

其中 E h \mathbb{E}_h Eh 表示跨头部维度的平均计算, ⊙ \odot 表示逐元素乘法。

总而言之,对于编码器中的给定层,我们可以通过 GradCAM 获得一个图 G ∈ R s × q G \in \mathbb{R}^{s \times q} GRs×q。(具体解释见附1)

为了定位 [expression],我们提示 [query] 并将其与图像一起输入到模型中,通过 GradCAM 获得 G。然后我们可以为 VLP 生成热力图。首先,我们将 G ∈ R s × q G \in \mathbb{R}^{s \times q} GRs×q 裁剪为 G ′ ∈ R T × I G' \in \mathbb{R}^{T \times I} GRT×I,其中 G’ 表示图像 tokens 对每个文本 token 的影响:

G ′ = { G [ i , j ] 1 ≤ i ≤ T I ≤ j < T + I 单流VLP模型 G 双流VLP模型 ( 2 ) 具体解释见附 2 G' = \begin{cases} G[i, j]^{I \le j < T+I}_{1 \le i \le T} & \text{单流VLP模型} \\ G & \text{双流VLP模型} \end{cases} \quad (2) \quad具体解释见附2 G={G[i,j]1iTIj<T+IG单流VLP模型双流VLP模型(2)具体解释见附2

在这里插入图片描述

接下来,G’ 需要进一步压缩到 G ~ ∈ R I \tilde{G} \in \mathbb{R}^{I} G~RI,以便它可以表示整个 [expression] 和每个图像 token 之间的连接。为此,我们提出了视觉词-注意力聚合(Visual-word attention aggregation),这与以前的方法不同,以前的方法要么使用对应于 [CLS] token 的行 (Subramanian et al. 2022),要么平均所有文本 tokens 的行分数 (Li et al. 2021; He et al. 2022),如图 4 所示

2. 视觉词-注意力聚合(Visual-Word Attention Aggregation)如何做的?

视觉词-注意力聚合(Visual-Word Attention Aggregation): 为了更精确地将语言查询映射到图像区域,作者提出了视觉词注意力聚合方法。一个 [expression] 由带有不同词性(POS)标签的词语组成,其中一些词语可以很容易地映射到特定的图像区域。例如,对于短语“black and white cat”,很容易定位“black”、“white”和“cat”,但“and”就不那么清晰。因此,我们推测 VLP 模型在将视觉上可识别的词语映射到图像时也会表现良好。(动机: 语言查询中的某些词(如名词、形容词)更容易与图像中的特定区域对应,而其他词(如介词)则对视觉区域的定位贡献较小。)

我们将 V \mathcal{V} V 定义为一组词性标签,包括名词、形容词、动词、专有名词和数词,这些词性相对容易可视化。利用现成的 NLP 处理工具箱来解析 [expression] 中每个词的词性标签,并且只有词性标签包含在 V \mathcal{V} V 中的词语会保留下来。我们将 W \mathcal{W} W 表示为 [expression] 的文本 tokens 集合。经过 V \mathcal{V} V 过滤后,原始集合 W \mathcal{W} W 缩减为 W ′ \mathcal{W}' W,并且我们在进行 REC 时进一步将 [CLS] token 添加到 W ′ \mathcal{W}' W 中,因为它能代表所有 tokens 的通用表示。之后, G ~ ∈ R I \tilde{G} \in \mathbb{R}^{I} G~RI 可以计算为:

G ~ = E t ∈ W ′ ( G ′ ) \tilde{G} = \mathbb{E}_{t \in \mathcal{W}'}(G') G~=EtW(G)

其中 E t \mathbb{E}_t Et 表示跨文本维度(text dimension)的平均计算,并且我们只计算包含在 W ′ \mathcal{W}' W 中的文本 tokens。

实现小结: ①使用 NLP 工具 (文中使用的是 Stanza)解析查询中的词性(Part-of-Speech, POS)标签。②仅保留视觉上可识别的词,例如名词、形容词、动词等。③对于 REC 任务,还保留表示整体语义的 [CLS]标记。④聚合这些词对应的注意力图,生成一个综合的注意力向量 G ~ \tilde{\mathbf{G}} G~(一个一维向量)。

3. 如何利用综合的注意力向量 G ~ \tilde{\mathbf{G}} G~ 生成热图(heat map)的?

首先回顾一下:

  • 我们之前计算得到了 G ~ \tilde{G} G~,这是一个向量(可以想象成一串数值)。这个向量的每个数值对应于输入图像中的一个图像 token
  • G ~ \tilde{G} G~ 中的每个数值表示:这个图像 token 对于理解输入的文本表达、做出最终的任务判断有多重要。数值越高,说明这个图像 token 越重要。
  • 我们的最终目标是生成一个热图 (Heatmap) H H H,它是一个和原始图像一样大小的 2D 图片。通过颜色深浅或亮度,这张图可以直接在图像上可视化地显示出图像的哪些区域是模型认为最关键、最重要的。

现在,问题在于如何把 G ~ \tilde{G} G~ 这个“重要性列表”(一串数值)映射回原始的 2D 图像空间,变成一个看得到的“重要区域图”。这取决于 VLP 模型最初是如何“看待”图像的。

我们将 G ~ \tilde{G} G~ 重塑(reshape)为 H ∈ R h × w H \in \mathbb{R}^{h \times w} HRh×w,使其具有与输入图像相同的尺寸。VLP模型 可以根据是否依赖外部目标检测器来获取视觉输入,分为基于区域(region-based)和端到端(end-to-end)两种,这两种类型应该应用不同的重塑模式。我们在 GroundVLP 中引入了这两种类型,并为每种类型使用了不同的模式。

基于区域模型的热图(Heat-map for Region-Based Models): 基于区域的 VLP 模型(依赖检测器的VLP模型)将图像转换为一组区域提议(region proposals)作为视觉特征。因此,我们选择具有高注意力值的一部分图像 tokens,并将其值按对应的注意力区域上叠加以生成热图

为此,我们将 G ~ \tilde{G} G~ 的每个元素按其注意力值降序排序,并从中选择前 m m m 个 tokens,定义为 { ( v k , b k ) } k = 1 m \{ (v_k, b_k) \}_{k=1}^m {(vk,bk)}k=1m,其中 v k v_k vk b k = ( x k 1 , y k 1 , x k 2 , y k 2 ) b_k = (x_{k1}, y_{k1}, x_{k2}, y_{k2}) bk=(xk1,yk1,xk2,yk2) 是提议的相应注意力值和坐标。基于区域模型的热图 H R H_R HR 计算如下:

H R [ i , j ] = { v k ( i , j ) ∈ b k 0 otherwise ( 3 ) H_R[i, j] = \begin{cases} v_k & (i, j) \in b_k \\ 0 & \text{otherwise} \end{cases} \quad (3) HR[i,j]={vk0(i,j)bkotherwise(3)

H R = ∑ k = 1 m H k H_R = \sum_{k=1}^m H_k HR=k=1mHk,其中 H k H_k Hk 是一个 h × w h \times w h×w 矩阵,R 表示基于区域,而 H k H_k Hk 的求和计算是通过逐元素相加实现的。

端到端模型的热图(Heat-map for End-to-End Models): 端到端 VLP 模型使用 Vision Transformer (Dosovitskiy et al. 2020) 将视觉输入处理为一组 patch embeddings。其图像 tokens 是一系列图像 patches。参照 (Li et al. 2021; He et al. 2022),我们对 G ~ \tilde{G} G~ 进行双三次插值(bicubic interpolation),将其重塑为 H E ∈ R h × w H_E \in \mathbb{R}^{h \times w} HERh×w,其中 E 表示端到端。

1. 基于区域模型(Region-Based Models)的处理方式:

  • 模型如何看图: 基于区域的模型不是直接看原始像素,而是先用一个机制(通常像目标检测器)在图像中找出一些可能的物体或区域,生成一堆“区域提议”(bounding boxes)。模型后续的计算(包括提取图像特征、与文本交互等)都是基于这些被框选出来的区域进行的。
  • 所以,在我们计算出的 G ~ \tilde{G} G~ 中,每一个数值其实是对应于图像中的一个具体的区域提议(一个框)。比如 G ~ \tilde{G} G~ 的第一个值对应第一个区域提议的重要性,第二个值对应第二个区域提议的重要性,以此类推。
  • 如何生成热图 H R H_R HR
    • 我们首先从 G ~ \tilde{G} G~ 中找出重要性最高的 m m m 个数值(以及它们对应的区域框 b k b_k bk)。排序就是为了找到这些最重要的。
    • 想象我们有一张空白的、和原图一样大的画布(这就是初始的 H R H_R HR 矩阵,里面都是 0)。
    • 然后,我们把这 m m m 个最重要的区域框 b k b_k bk 画到这张空白画布上。对于每个框内的所有像素位置 ( i , j ) (i, j) (i,j),我们都给它们填上这个框对应的重要性数值 v k v_k vk(来自 G ~ \tilde{G} G~)。
    • 如果不同的重要区域框 b k b_k bk 有重叠的地方,这些重叠像素位置的数值就会叠加起来(公式 H R = ∑ H k H_R = \sum H_k HR=Hk 就是这个叠加过程)。

2. 端到端模型(End-to-End Models)的处理方式:

  • 模型如何看图: 端到端模型(特别是基于 Vision Transformer 的)通常会把图像切分成很多个小的、固定大小的方块,叫做“图像 patch”。模型是基于这些图像 patch 来提取特征和进行计算的。
  • 所以,在我们计算出的 G ~ \tilde{G} G~ 中,每一个数值是对应于图像中的一个图像 patch
  • 这些图像 patch 在原图上是按照一个2D 的网格排列的。 G ~ \tilde{G} G~ 虽然是一个 1D 的向量,但它里面的数值顺序是和这些 2D 网格上的 patch 对应起来的。我们可以想象把 G ~ \tilde{G} G~ 里的数值按照 patch 在原图上的位置重新排列成一个2D的 小网格
  • 如何生成热图 H E H_E HE
    • 我们现在有一个对应于图像 patch 网格的“重要性小网格”(由 G ~ \tilde{G} G~ 的值构成)。
    • 要把这个小网格变成和原图一样大、而且看起来平滑的热图,我们就需要进行插值 (Interpolation)
    • 双三次插值 (Bicubic Interpolation) 是一种常用的图像缩放和平滑技术。它不是简单地放大像素,而是根据周围已知像素的值来估计新像素的值。这里就是根据小网格上每个 patch 的重要性值,平滑地估计出放大后图像上每个像素的重要性值。
  • 类比: 就像你在房间地板上均匀地放了很多温度计(图像 patch),每个温度计都有个读数( G ~ \tilde{G} G~ 的数值)(离散的)。你要画一张整个地板的温度分布图(连续的)。你不能只在温度计位置画点,你需要根据已知温度点的读数,平滑地“推算”出没有放温度计的地方的温度,然后用颜色深浅表示出来,形成一张连续平滑的温度云图。

更多细节解释见附3和附4。

4. 热图与开放词汇检测器(OVD)输出的结果的融合(Heatmap Fusion with Open-Vocabulary Detectors)

开放词汇检测器(OVD)是什么?见附5。

获得热图 H ∈ R h × w H \in \mathbb{R}^{h \times w} HRh×w 后,我们接着生成一组候选框,计算每个候选框所包围区域的加权分数,并输出得分最高的框。我们仅关注属于预定类别的框,从而简化了最终答案框的选择,因为它减少了候选框的数量。考虑到用户在实际应用中应该有一个特定的类别,我们在 REC 任务中使用了真实(ground-truth)类别来模拟用户的输入。同时,当没有提供类别时,我们还提出了一种从 [expression] 中提取目标单元作为预测类别的替代方法。

在这里插入图片描述

类别提取(Category Extraction): 受 (Sun et al. 2021) 的启发,我们利用一个 NLP 工具箱来提取 [expression] 的目标单元作为预测类别。具体来说,由 NLP 工具箱生成的 [expression] 的依存树(dependency tree)中,最左下方名词短语(Noun Phrase, NP)节点的最右边的普通名词(Normal Noun, NN)节点被视为预测类别。Figure 5 中展示了一个例子。

此外,我们将提取的预测类别映射到评估数据集的类别词汇表,以符合真实类别(Ground truth)。设 C C C 是评估数据集的类别词汇表集合, c i ∈ C c_i \in C ciC 是其中一个类别, c p c^p cp 是提取的预测类别。接下来,我们利用 CLIP (Radford et al. 2021) 将 c i c_i ci c p c^p cp 嵌入为 e c i ∈ R D e_{c_i} \in \mathbb{R}^{D} eciRD e c p ∈ R D e_{c^p} \in \mathbb{R}^{D} ecpRD将它们投影到统一的嵌入空间中,其中 D D D 表示 CLIP 嵌入的维度。根据 CLIP 的做法,在嵌入之前,将提示“a photo of”作为前缀添加到 c i c_i ci c p c^p cp 中。然后,我们将从 c p c^p cp 映射到 C C C 的类别定义为 c m a p c^{map} cmap,将 c p c^p cp c i c_i ci 之间的相似度定义为 s i m i sim_i simi,它们的定义如下:

s i m i = P ( c m a p = c i ∣ c p ) = exp ⁡ ( e c i T e c p ) ∑ j = 1 ∣ C ∣ exp ⁡ ( e c j T e c p ) ( 4 ) sim_i = P(c^{map} = c_i \mid c^p) = \frac{\exp(e_{c_i}^T e_{c^p})}{\sum_{j=1}^{|C|} \exp(e_{c_j}^T e_{c^p})} \quad (4) simi=P(cmap=cicp)=j=1Cexp(ecjTecp)exp(eciTecp)(4)

c m a p = c i , i = argmax i ( s i m i ) c^{map} = c_i, \quad i = \text{argmax}_i(sim_i) cmap=ci,i=argmaxi(simi)

通过这个等式,每个 c p c^p cp 可以映射到一个特定的类别。例如,图 5 中的“table”在使用 COCO 词汇表时将被映射到“dining table”。

生成候选框(Generating Candidate Boxes): 给定图像 I \mathcal{I} I、预定类别 c c c 和分数阈值 θ \theta θ,OVD 被允许检测 n n n 个实例:

{ ( s k , box k ) } k = 1 n = OVD ( c , θ , I ) ( 5 ) \{ (s_k, \text{box}_k) \}_{k=1}^n = \text{OVD}(c, \theta, \mathcal{I}) \quad (5) {(sk,boxk)}k=1n=OVD(c,θ,I)(5)
box k = ( x k 1 , y k 1 , x k 2 , y k 2 ) ( 6 ) \text{box}_k = (x_{k1}, y_{k1}, x_{k2}, y_{k2}) \quad (6) boxk=(xk1,yk1,xk2,yk2)(6)
s k = P ( o k ∈ c ∣ I ) , s k > θ ( 7 ) s_k = P(o_k \in c \mid \mathcal{I}), s_k > \theta \quad (7) sk=P(okcI),sk>θ(7)

其中 o k o_k ok 表示包含在 box k \text{box}_k boxk 中的物体实体, s k s_k sk 表示 o k o_k ok 属于类别 c c c 的置信度分数,该分数应大于 θ \theta θ

加权得分(Weighted Grade): 我们现在面临的一个关键挑战是确定阈值 θ \theta θ 的值。如果设置得太低,可能包含不属于类别 c c c 的多余框。反之,如果 θ \theta θ 太高,可能会漏掉一些属于类别 c c c 的框。针对这个问题,我们提出了一个公式,该公式设置了一个相对较低的阈值,并将 s k s_k sk 作为 r k r_k rk 的权重,其中 r k r_k rk 被定义为由 box k \text{box}_k boxk 包围的区域的总热图值。通过它,我们在不遗漏属于 c c c 的框和防止低得分框干扰结果之间取得平衡。最后,我们计算表示 ( s k , box k ) (s_k, \text{box}_k) (sk,boxk) 加权得分的 g k g_k gk,并输出得分最高的 box p r e d \text{box}_{pred} boxpred 作为 GroundVLP 的预测框:

r k = ∑ i = x k 1 x k 2 ∑ j = y k 1 y k 2 H [ i , j ] ( 8 ) r_k = \sum_{i=x_{k1}}^{x_{k2}} \sum_{j=y_{k1}}^{y_{k2}} H[i, j] \quad (8) rk=i=xk1xk2j=yk1yk2H[i,j](8)

g k = 1 A k α s k ⋅ r k ( 9 ) g_k = \frac{1}{A_k^\alpha} s_k \cdot r_k \quad (9) gk=Akα1skrk(9)

box p r e d = box k , k = argmax k ( g k ) ( 10 ) \text{box}_{pred} = \text{box}_k, \quad k = \text{argmax}_k(g_k) \quad (10) boxpred=boxk,k=argmaxk(gk)(10)

其中 A k A_k Ak 表示 box k \text{box}_k boxk 的面积,用于避免倾向于选择大面积的框; α \alpha α 是一个超参数。

α 是计算候选框最终得分 g k g_k gk 公式中的一个参数,它用来控制对候选框面积大小的惩罚(或偏好)力度

  • 公式中有一个项是 1 A k α \frac{1}{A_k^\alpha} Akα1,其中 A k A_k Ak 是框的面积。
  • α 值越大,当框的面积 A k A_k Ak 越大时,这个项 1 A k α \frac{1}{A_k^\alpha} Akα1 的值就会下降得越快。这意味着,面积大的框在计算最终得分 g k g_k gk 时会受到更强的“惩罚”,得分会相对更低。这使得模型更倾向于选择面积小的框。
  • α 值越小(例如接近 0),面积对最终得分的影响就越小。当 α 等于 0 时, A k 0 = 1 A_k^0 = 1 Ak0=1,面积完全不影响得分。

所以,通过调整 α 的值,可以在鼓励选择面积较小、更紧凑的框不因面积大小过度惩罚之间找到一个平衡。


类别提取

为了确定检测目标,OVD 需要从语言查询中提取类别信息,方法分为两种:

  • 手动指定:在 REC 任务中,可以直接使用 ground-truth 类别(数据集定义的真实类别)。
  • 自动提取
    • 使用 NLP 工具生成文本token查询的依赖树(dependency tree)。
    • 从依赖树中选择最左下角的名词短语(NP)节点,并提取其中最右边的普通名词(NN)作为预测类别。
    • 使用 CLIP 模型将提取的类别映射到评估数据集的类别词汇表

在得到热图(heatmap)和OVD输出的候选框及其置信度后,最终的融合机制是怎样的?

融合机制是 GroundVLP 的核心创新之一,它将 VLP 模型生成的热图与 OVD 的候选框结合起来,生成最终的预测结果。

加权评分(Weighted Grade)

动机: OVD 的候选框可能包含噪声(例如低置信度的框),而热图可能无法精确边界。加权评分旨在平衡两者的优势。

实现
  • 对于每个候选框,计算其内部热图值的总和 r k r_k rk
  • 计算加权评分:
    g k = 1 A k α ⋅ s k ⋅ r k g_k = \frac{1}{A_k^\alpha} \cdot s_k \cdot r_k gk=Akα1skrk
    其中:
    • A k A_k Ak 是候选框的面积;
    • α \alpha α 是超参数,用于控制面积的影响;
    • s k s_k sk 是 OVD 的置信度得分;
    • r k r_k rk 是热图值总和。
  • 选择加权评分 g k g_k gk 最高的候选框作为最终预测结果。
阈值 θ \theta θ 的选择
  • 低阈值:可能引入噪声框,但加权评分可以减轻其影响。
  • 高阈值:可能遗漏正确的候选框。
  • 作者建议使用较低的阈值,并依靠加权评分机制进行筛选。
创新点

GroundVLP 的方法在以下几个方面具有显著创新:

  1. 视觉词注意力聚合:通过聚焦于视觉上可识别的词,优化了文本到图像区域的映射。
  2. 类别提取与映射:从查询中自动提取类别并映射到评估数据集的类别词汇表,增强了方法的灵活性。
  3. 加权评分机制:有效融合 VLP 模型的语义信息和 OVD 的定位能力,提高了预测的准确性。

实验部分

实验设置

GroundVLP 使用了两类视觉语言预训练模型:

  • 基于区域的模型:VinVL。这类模型依赖外部对象检测器生成的区域提议(region proposals)来处理图像。
  • 端到端模型:ALBEF。这类模型直接处理图像的 patch 嵌入(patch embeddings),无需外部检测器。

指代表达理解(Referring Expression Comprehension): 我们采用三个广泛使用的数据集:RefCOCO、RefCOCO+ 和 RefCOCOg (Yu et al. 2016) (Mao et al. 2016)。

短语定位(Phrase Grounding): 我们采用 Flickr30k Entities 数据集 (Plummer et al. 2015) 进行此任务,并以 Recall@1, 5 来评估性能。在 Flickr30k 中,一句话包含多个需要定位的短语,其中每个短语可能对应多个边界框。因此,之前的研究提出了 M detr (Kamath et al. 2021) 的两个协议:ANY-BOX 和 MERGED-BOX。在我们的评估中,我们使用 ANY-BOX 协议。

选定的 VLP 模型和提示模板(Selected VLP models and Prompt Templates): I , T \mathcal{I}, \mathcal{T} I,T 被定义为输入的图像和文本。我们引入了基于区域和端到端两种类型的典型模型。我们采用 VinVL (Zhang et al. 2021) 和 ALBEF (Li et al. 2021) 作为两个模型的检查点。VinVL 的输入格式是三元组 { w , q , v } \lbrace w, q, v \rbrace {w,q,v},并输入为两种类型。我们采用 VQA-assemble 方式并修改查询以适应这种格式。具体来说,在 REC 任务上,我们将 T = \mathcal{T} = T= “there is a [query]?” 设置为提示,并将 q q q 总是设置为“yes”。在短语定位上,我们将 T = \mathcal{T} = T= “[query]” 设置为提示,其中 [query] 表示数据集提供的查询句子。

1. ANY-BOX 和 MERGED-BOX?

ANY-BOX 和 MERGED-BOX 是在评估物体定位或短语定位任务时,特别是在 ground truth(真实标注)中一个文本描述可能对应多个边界框的情况下,用来衡量模型预测结果是否正确的两种评估协议(Evaluation Protocols)

  • 情景: 在 Flickr30k Entities 这样的数据集中,一个短语(比如“草地上的两只狗”)可能对应图像中的多个物体实例(两只狗),或者一个物体的多个部分(比如“自行车的轮子”可能对应前后两个轮子的框)。模型的预测结果可能是一个或多个边界框。

  • ANY-BOX 协议: 这是比较宽松的协议。如果模型的任何一个预测框与 ground truth 提供的任何一个对应的真实框之间存在足够大的重叠(通常用 IoU,交并比来衡量,比如 IoU > 0.5),那么这次预测就被判定为正确。它的目标是评估模型能否找到至少一个与描述相符的物体实例。

  • MERGED-BOX 协议: 这是更严格的协议。它可能有不同的实现方式,但核心思想是评估模型能否找到所有或更完整的对应物体实例。一种常见的方式是,先将同一个短语对应的所有 ground truth 框合并成一个大的框(或者计算它们的联合区域),然后要求模型的预测框与这个合并后的区域有足够的重叠。或者,它可能要求模型预测的框集合与 ground truth 框集合之间的整体匹配度达到一定标准。

2. 三元组 { w , q , v } \lbrace w, q, v \rbrace {w,q,v} 和 VQA-assemble方式 是什么?

  • VinVL 的输入格式介绍(Introduction of the Input Format to VinVL): I , T \mathcal{I}, \mathcal{T} I,T 被定义为输入图像和文本。VinVL 的输入格式是一个三元组 { w , q , v } \lbrace w, q, v \rbrace {w,q,v},可以有两种解释方式:(1) w w w 表示 I \mathcal{I} I 的一个标题(caption), q q q 表示其 OD(物体检测)模块检测到的物体标签, v v v 是由 OD 获得的视觉特征。VinVL 可以通过 ITM 头预测 w − v w-v wv 是否是匹配的图文对,并输出logit分数。我们将这种方式命名为 ITM-assemble。(2) w w w 表示关于 I \mathcal{I} I 的一个问题, q q q 表示 w w w 的答案, v v v 是由 OD 获得的视觉特征。VinVL 可以通过 ITM 头预测 w − q w-q wq 是否是匹配的问答对,并输出logits分数。我们将这种方式命名为 VQA-assemble。关于选择这种输入格式的原因以及关于 VinVL 的更多信息,请参阅原始论文 (Zhang et al. 2021)。

GradCAM 层(GradCAM Layer): 对于 ALBEF,我们使用跨模态编码器的第 3 3 3 层进行 GradCAM。对于 VinVL,我们使用跨模态编码器的第 20 20 20 层进行 GradCAM 并选择 m = 7 m = 7 m=7(指在生成热图时,从计算出的重要性向量 G ~ \tilde{G} G~ 中,选择了最顶部的 7 个图像 token(区域提议) (即重要性得分最高的 7 个,每一个数值其实是对应于图像中的一个具体的区域提议(一个框))。所有设置均基于在 RefCOCOg val数据集上的调优。

类别预测方法(Methods for Category Prediction): 我们采用 Stanza (Qi et al. 2020) 来提取预测类别。在 RefCOCO/+/g 上测试时,我们使用公式 4 将预测类别映射到 COCO 类别。对于 Flickr30k entities,考虑到其真实类别略显抽象(They are: people, clothing, bodyparts, animals, vehicles, instruments, scene, and other.),我们直接使用预测类别。此外,为了更好地检测人物实体,如果 e p e^p ep e p ∗ e^{p^*} ep 的余弦相似度大于 0.9,我们将 c = { c p , person } c = \{c^p, \text{person}\} c={cp,person},其中 e p ∗ e^{p^*} ep 表示“a photo of person”的文本 CLIP 嵌入。

特性直接使用预测类别相关预测类别协助类别到COCO类别
输入词汇开放、原始、可能非常规封闭 (COCO词汇表)、标准化
信息粒度保留原始预测的细节和特异性可能丢失细粒度,特异性降低,被泛化到COCO类别
OVD能力发挥更充分地发挥其开放词汇检测能力在COCO词汇范围内运作,对这些输入的“开放性”有所限制
适用场景当希望利用预测的全部语义或在无固定词汇表场景下检测当需要与基于COCO的任务/评测对齐,或OVD对COCO类别有特别优化时
错误率依赖原始类别预测的准确性除了原始预测的准确性,还引入了映射过程可能产生的错误

选定的开放词汇检测器(Selected Open-vocabulary Detector): 我们选择 Detic (Zhou et al. 2022) 作为我们的开放词汇检测器 (OVD)。其他 OVDs 也可以考虑 (Li et al. 2022b; Zhao et al. 2022a)。对于 REC,当使用真实类别时,我们设置 α = 0.5 , θ = 0.15 \alpha = 0.5, \theta = 0.15 α=0.5,θ=0.15;当使用预测类别时,我们设置 θ = 0.3 \theta = 0.3 θ=0.3。对于短语定位,我们设置 α = 0.25 \alpha = 0.25 α=0.25 θ = 0.15 \theta = 0.15 θ=0.15。如果 Detic 没有检测到达到置信度要求的框,我们使用所有提议(Proposals)作为候选框。对于 RefCOCO/+/g,我们采用来自 MAttNet (Yu et al. 2018) 的提议。对于 Flickr30k entities,我们使用所有由 Detic 检测到的提议。

对比基线(Compared Baseline): 我们选择两个之前的零样本 REC 方法进行对比——ReCLIP (Subramanian et al. 2022) 和 CPT (Yao et al. 2021)。CPT 用不同的颜色遮盖每个提议的区域,并在“[query] is in [MASK] color”中预测颜色词;而 ReCLIP 则利用 CLIP 的对比评分能力对每个提议进行评分。此外,我们构建了一个 CPT-adapted 基线用于短语定位进行对比。Flickr30k 上的一个 [query] 包含 N N N 个短语,表示为 { [ expression i ] } i = 1 N \{ [\text{expression}_i] \}_{i=1}^N {[expressioni]}i=1N。然后我们将 [query] 复制 N N N 次,并在第 i i i 次复制后添加“where [expression] i _i i is in [MASK] color”。CPT-adapted 的一个例子在 Example of CPT-adapted 中展示(我们在Figure 9 中展示了一个对 CPT 进行短语定位提示的例子。黄色的词语是我们需进行定位的短语)。我们使用由 Detic 检测到的所有提议和由 colored blocks (Yao et al. 2021) 生成的块作为 CPT-adapted 的输入。
在这里插入图片描述

主实验

在这里插入图片描述

指代表达理解(Referring Expression Comprehension): Table 2 显示了在 RefCOCO/+g 上的结果。GroundVLP 优于其他零样本方法,尤其是在 RefCOCO 和 RefCOCO+ 的 testA 分割集上。当使用真实类别时,GroundVLP 与一些非 VLP 的监督模型性能相当或更优。

然而,也注意到与使用真实类别(ground-truth category)相比,使用预测类别(predicted category)时性能不可避免地会下降。这可归因于几个因素:(1) 指代目标不明确:查询中目标单元的词语可能无法清楚地指示指代目标。例如,查询“black hat”指示一个戴黑帽子的人,并且会提取出词语“hat”。然而,“hat”不能精确地映射到“person”,从而导致错误。(2) 不规范的语法:有一部分粗糙的查询,在这种情况下,NLP 工具箱无法准确提取目标单元。例如,“woman red coat”是一个不规范的表达,应该是“穿红外套的女人(woman in red coat)”或“woman wearing red coat”,它会导致 NLP 工具箱将“woman”视为一个用来修饰“red”的名词性形容词,而把“coat”当作目标。(3) 查询中没有目标: 有一些查询只包含纯空间信息,不包含指代目标(例如,“left”、“the closest to you”)。我们认为这些数据集固有的包含偏差和噪声,这使得将预测类别准确地映射到 COCO 类别变得困难,从而导致性能下降。我们在“Noise to Disturb the Category Extraction”部分(Figure 10)进行了更详细的论证。

在这里插入图片描述

短语定位(Phrase Grounding): 表格 3 显示了在 Flickr30k entities 数据集上的结果。GroundVLP 在 R@1 得分上遥遥领先于 CPT,在 val 和 test 分割集上分别超出 38.29% 和 37.79%。此外,GroundVLP 的性能与一些非 VLP 的监督方法相比,性能相当甚至更优。最后注意到,我们仅使用预测类别进行短语定位,这证明了我们提出的融合方法对于定位任务的有效性,以及 Flickr30k 数据集上规范的表达有利于我们的预测类别提取。

在这里插入图片描述

R@1 和 R@5 是在物体检测或定位任务中常用的评估指标,特别是在模型会输出多个带有置信度得分的候选结果时。在这里的短语定位任务中,模型为给定的文本短语可能会预测出多个可能的边界框,并给每个框一个得分,表示它认为是正确目标的可能性。

R@k 代表 Recall at k,直译是“在第 k 个位置上的召回率”。它的意义是检查模型排在前 k 位的预测结果中,是否包含了正确的答案。

具体到短语定位任务:

  1. 模型会生成一系列候选边界框以及它们对应的置信度得分。
  2. 模型会根据这些置信度得分,将候选框从高到低进行排序。
  • R@1 (Recall@1): 这个指标是检查模型排序第一位(置信度得分最高)的那个预测框是不是正确的。

    • 如果排名第一的框与地面真实(ground truth)框有足够的重叠(例如 IoU 大于某个阈值,并且符合之前提到的 ANY-BOX 或 MERGED-BOX 协议),那么这次预测在 R@1 上就是成功的。
    • R@1 衡量的是模型给出最佳单一预测的准确率。
  • R@5 (Recall@5): 这个指标是检查模型排序前 5 位的预测框中,是否至少有一个是正确的。

    • 只要排在前 5 位中的任何一个预测框是正确的(与地面真实框有足够的重叠),那么这次预测在 R@5 上就是成功的。
    • R@5 衡量的是模型在前 5 个最佳猜测中找到正确答案的能力。
  • R@1:只看最靠前的那个预测是不是对的。是更严格的指标。

  • R@5:看前 5 个预测中,有没有一个是对的。比 R@1 宽松。

拓展到其他VLP模型: 为了验证我们方法的通用性,我们进一步将更多 VLP 模型整合到 GroundVLP 中。我们在表 4 中展示了使用 TCL (Yang et al. 2022)、PTP(Wang et al. 2022)和 Lxmert(Tan and Bansal 2019) 的结果,其中 TCL 和 PTP 属于端到端模型,Lxmert 属于基于区域模型。这些模型的简要描述和实现细节在“Other Pre-trained Models 的描述和实现细节”中给出(附6)。我们发现 GroundVLP 与所有模型结合的性能均优于表 2 中记录的其他零样本方法,显示了其可以有效应用于各种 VLP 模型的通用性。我们还在最后一列报告了在 RefCOCO 和 RefCOCO+ 上获得的模型准确性差异。正如前文“数据集”部分所述,RefCOCO 包含更多空间信息,而 RefCOCO+ 包含更多外观相关的查询。因此,这种差异可以表明模型更擅长处理位置信息还是外观属性。可以观察到,Lxmert 更擅长识别空间信息,而其他两个端到端模型则相反。我们推测,OD (目标检测)模块在图像中对物体的初步建模可以促进基于区域模型对视觉上下文的理解,并使其对位置更敏感。(Yao et al. 2022; Wang et al. 2022)。

在这里插入图片描述

消融实验

本节中的评估使用了所有数据集的 val 分割集以及 RefCOCO/+/g 数据集上的真实类别(ground-truth category),除非有补充说明。

1. θ \theta θ s k s_k sk s k s_k sk是 OVD 的置信度得分) 的不同组合方式(Different Assembly of θ \theta θ and s k s_k sk): 表格 5 研究了 θ \theta θ 的值和加权得分使用方法的影响。可以观察到,OVD 的低阈值( θ = 0.15 \theta = 0.15 θ=0.15)会导致检测到多余的框,如果我们直接将 r k r_k rk 作为得分,这会损害性能。在这种情况下,我们提出的同时考虑 s k s_k sk r k r_k rk 的加权得分可以有效减轻冗余框的干扰。另一方面,使用加权得分( θ = 0.5 \theta = 0.5 θ=0.5 且使用了 s k s_k sk)的高阈值提高了检测框的质量,但可能会排除正确答案框。因此,最优的组合方式是使用加权得分的相对较低的阈值。Figure 6 展示了使用加权得分对最终结果的影响。可以观察到,当采用加权得分时,GroundVLP 产生了正确答案。

在这里插入图片描述


在这里插入图片描述

2. 候选框类型(Type of Candidate Boxes): 表格 6 研究了不同候选框的影响。在通过预定类别缩小候选框数量后,性能得到了提升。我们观察到,在使用预测类别时,在 RefCOCO 和 RefCOCO+ 上的提升不如在 RefCOCOg 和 Flickr30k entities 上那么显著。结合前面关于数据集的简要说明,很明显,在像 RefCOCOg 和 Flickr30k entities 这样表达具体且规范的数据集上(这些数据集在现实世界中更实用和常见),类别提取更精确。

在这里插入图片描述

3. 注意力聚合类型(Type of Aggregating Attention): 表格 7 研究了使用视觉词-注意力聚合带来的改进。对比基线是通过对所有文本 tokens 的注意力分数进行平均来实现的(即图 4 (b))。PTP (Wang et al. 2022) 是我们集成的另一个 VLP 模型。可以观察到,我们的方法取得了更好的性能,尤其是在 PTP 上,这表明基于视觉上可识别词语的过滤可以促进模型进行文本到图像的映射,这对于定位任务是有益的

在这里插入图片描述

4. 将 OVD 应用于视觉定位: 为了弄清楚 OVD 是否可以应用于视觉定位,我们专门使用 Detic 在 RefCOCO/+/g 上进行了测试。最初,我们将真实类别(Ground-truth category)输入给 Detic,以生成一组候选框。随后,我们将 [query] 输入给 Detic,在评估每个提议与 [query] 的文本嵌入之间的相似度分数时,仅考虑这些候选框。得分最高的框是最终输出。表 8 中的结果表明,OVD 只能检测特定类别,并且在没有 ITM 提供的语义洞察力的情况下,难以掌握视觉定位复杂的语义信息。

在这里插入图片描述

5. 微调 GroundVLP(Fine-tuning GroundVLP): 虽然我们提出了 GroundVLP 作为一种零样本方法,但它仍然可以使用标注数据进行微调以提高性能。使用 RefCOCO+ 训练集,我们将查询与图像配对作为图文对,使用 ITM 损失直接微调 ALBEF,并在 RefCOCO+ 的 val 和 test 集上观察到性能提升,如表 9 所示。

在这里插入图片描述

可视化实验

我们在Figure 7 中可视化了 GroundVLP 使用不同 VLP 模型时的预测结果。VinVL 是一个基于区域的模型,与 ALBEF 相比,它在包含位置信息的查询上表现出色;ALBEF 属于端到端模型,在以外观属性描述的查询上表现良好。我们观察到, GroundVLP 与这两个模型结合后,对于长且具体的查询都能取得优异的性能,这表明我们的方法利用了 VLP 模型的预训练能力,在提供更多语义信息时,能促进文本与区域的对齐。

在这里插入图片描述

我们进一步展示了短语定位的可视化结果(Figure 8)

在这里插入图片描述

Conclusion and Limitations

我们注意到图文对和物体检测数据的易得性,然后提出了 GroundVLP,这是一种通过结合使用这些数据集训练的模型来实现零样本视觉定位的方法。GroundVLP 利用 VLP 模型的 GradCAM 来识别图像区域,引入一个开放词汇物体检测器来生成属于给定类别的物体提议,并通过加权得分将这两个组件融合。实验结果显示了 GroundVLP 的最先进性能,它优于其他零样本方法,并且与一些非 VLP 的模型性能相当。未来,我们计划改进类别预测方法,并继续引入多样化的 VLP 模型和开放词汇物体检测器,以提高零样本定位模型的性能,并将其应用于具身智能体等领域。

尽管 GroundVLP 取得了很高的准确性,但仍存在一些潜在的局限性。GroundVLP 可能会无意中继承这些基础模型中存在的偏差或错误,如表 10 所示的结果。然而,我们注意到 VLP 和 OVD 在我们的实现中都作为即插即用模块。这种模块化设计意味着 GroundVLP 可以受益于这两个领域的进步。如果未来有更鲁棒或改进的基础模型,可以将其无缝集成到我们的框架中,以替换任何表现出错误或偏差的现有模型。此外,如表 9 所示,GroundVLP 在微调其 VLP 主干网络后性能有所提升,表明所使用的基础模型可以进行微调,以有效缓解这些不足。

GroundVLP 设计了精巧的推理机制,成功地将在大规模图文对与目标检测数据上预训练的 VLP 和 OVD 模型组合在一起用于视觉定位,未进行任何参数训练就破解了视觉定位领域稀疏的困局,为实现领域通用的视觉定位基础模型迈出了坚实一步。
针对视觉定位标注数据稀缺其实还有一条由微软发布的 Kosmo2 指出的模式——使用 OVD 模型自动生成弱监督的grounding 数据(Kosmo2 做了一个叫 GRIT,数量级大约为 100M 的 groudning 弱监督预训练数据集),将 bounding box 坐标转化为自然语言 token,在其上训练大语言模型用于视觉定位。
和 GroundVLP 相比,Kosmo2 的这条路需要的资源消耗更大(大规模弱监督预训练数据的生成和大模型的训练都需要大量的计算资源,Kosmo2 的总参数量也远大于 GroundVLP),但让人惊喜的是 GroundVLP 在 REC 子任务上的性能甚至优于 Kosmo2:同样为零样本推理,RefCOCO 的 testA 上为 69.21 对 57.42,RefCOCO+ 的 testA 上为 70.56 对 50.73,RefCOCOg 的 test 上为 68.98 对 61.65
这启示我们,ALBEF、VinVL 这样的视觉-语言基础模型虽然没有显式在涉及局部对齐的目标上训练,但其中间表示蕴含着丰富的局部对齐信息以完成视觉定位这样的细粒度任务。

在这里插入图片描述

附录

附1: G = E h ( ∇ A ⊙ A ) G = \mathbb{E}_h(\nabla A \odot A) G=Eh(AA) 细节是怎样的?

  1. 首先前向传播计算注意力图 A A A
  • 就是一张二维表格,行列分别是文本token和图像区域token,表格里的数值就是注意力分数。
  • 在VLP模型里,A 是在交叉注意力模块中计算的,它表示了文本中的每个词语与图像中每个区域之间的关联强度。数值越高,表示文本的某个词和图像的某个区域“联系”越紧密,模型越“关注”这个关联。
  1. 再反向传播计算梯度图 ∇ A \nabla A A
  • L i t m L_{itm} Litm 是来自 VLP 模型的 ITM 头的结果值(判断文本和图像是否匹配的得分)。梯度 ( ∇ A = ( ∂ L i t m ∂ A ) + \nabla A = (\frac{\partial L_{itm}}{\partial A})^{+} A=(ALitm)+) 衡量的是:如果把注意力图 A 上的某个位置的数值(即某个文本词语和图像区域的关联分数)稍微改变一点点,那么最终的任务结果 L i t m L_{itm} Litm 会改变多少?
  • 如果改变 A 上某个位置的数值,能导致 L i t m L_{itm} Litm 发生很大的变化,说明注意力图的这个位置(即文本词语和图像区域的这个关联)对最终结果非常重要
  • ( ⋅ ) + (\cdot)^{+} ()+ 表示我们只考虑那些对最终结果产生正面影响的关注点。正的偏导数 ∂ L i t m ∂ A i , j > 0 \frac{\partial L_{itm}}{\partial A_{i,j}}>0 Ai,jLitm>0 表明:如果我们略微增大注意力图上位置 ( i , j ) (i,j) (i,j) 的值(即加强该文本词–图像区域的关联),最终的匹配得分 L i t m L_{itm} Litm 会升高,即“正面”推动模型判断它们匹配(可通过ReLU实现, 文章代码是通过tensor.clamp(min=0)实现的,去掉所有负的注意力梯度值,只留下“正影响”的部分,用于计算 Grad-CAM 热图 )。滤掉负值后,梯度图更直观地告诉我们“哪些点上的注意力最能促进模型做出正确的匹配判断”。
阶段张量名形状含义
原始 maskmask[B, 1, L, 1, 1]文本有效 token(L),扩成 5 维为后续广播用
原始 attention & gradscams/grads[B, H, Q, K]Q=文本 token 数,K=图像 token 数(含 CLS)
去 CLS、reshape+mask 后cams/grads[B, H, Q, P, P]P×P 是 spatial 网格,Q 依然是每个文本 token
Grad-CAM 乘积gradcams[B, H, Q, P, P]最终的 attention×gradient 热力图
gradcams = cams * grads # shape == [B, H, Q, P, P]
'''
在每个 head(H)和每个文本 token(Q)上,attention 强度(cams)×对应梯度(grads),
就是 Grad-CAM 的核心,
哪个 token 在第几层、第几个 head 上,把注意力投到了图像的哪些 spatial patch 上,
并且对最终结果影响有多大。
'''
  1. 将“注意力”和“影响力”结合 ( ∇ A ⊙ A \nabla A \odot A AA):
  • ⊙ \odot 表示逐元素乘法,也就是把注意力图 A 和梯度图 ∇ A \nabla A A对应的位置上相乘
  • 如果某个位置,注意力 A 很高(模型很关注这里)并且 梯度 ∇ A \nabla A A 也很高(这里对结果影响很大),那么相乘后的值会非常高。这说明这里是模型又看重,又对其结果贡献大的地方。
  • 如果某个位置,注意力 A 很高(模型很关注),但 梯度 ∇ A \nabla A A 很低(这里对结果影响小),相乘后的值就不会很高。这说明模型虽然看了这里,但它对最终结果的贡献不大。
  • 如果某个位置,注意力 A 本身就很低(模型没怎么看),那么不管 ∇ A \nabla A A 有多高,相乘后的值也会很低。
  • 这一步的结果,是一个新的图,它强调了注意力图中那些对最终结果贡献最大的区域,同时“抑制”了那些对结果贡献不大的区域。
  1. 平均多个“头”的结果 ( E h \mathbb{E}_h Eh):
  • 如果模型使用了多头注意力机制(就像从不同的角度去理解关联),那么每个“头”都会计算出一个结合后的图 ( ∇ A ⊙ A \nabla A \odot A AA)。
  • E h \mathbb{E}_h Eh 就是把这些不同“头”的结果平均起来,得到一个综合的图,反映了从多个角度看,哪些地方最重要。
  1. 最终的图 G:
  • 经过上面所有步骤,得到的图 G 信息就更丰富。它不像原始注意力图 A 那样只告诉你模型重点“看”了哪里,而是更精确地告诉你,在模型所有“看”过的地方中,哪些是真正起作用、真正决定了模型最终判断的关键区域或关键关联

附2:裁剪图 G G G G ′ G' G 的说明

单流 (One-stream) VLP 模型:

  • 文本和图像的 token 通常会被拼接在一起,形成一个长的序列,然后一起输入到一个 Transformer 或类似的编码器中。
  • 注意力机制在这个长的序列上计算。这意味着注意力图 (A) 显示的是序列中任意 token 之间的关联。
  • 如果总共有 T T T 个文本相关的 token 和 I I I 个图像相关的 token,那么拼接后的序列长度就是 T + I T+I T+I。计算出的注意力图 A (以及由此得到的 G) 的维度就是 ( T + I ) × ( T + I ) (T+I) \times (T+I) (T+I)×(T+I)。这个 ( T + I ) × ( T + I ) (T+I) \times (T+I) (T+I)×(T+I) 的矩阵包含了文本 token 之间、图像 token 之间、以及文本 token 与图像 token 之间的所有注意力关系。
  • 然而,为了生成表示“图像 token 对每个文本 token 的影响”的 G’ ( T × I T \times I T×I),我们只需要从这个大的 ( T + I ) × ( T + I ) (T+I) \times (T+I) (T+I)×(T+I) 矩阵中提取出对应于“文本作为查询 (Query),图像作为键 (Key)”的那一部分。这部分通常位于矩阵的特定子区域,所以需要进行裁剪 (cropping)。公式 G ′ = G [ i , j ] 1 ≤ i ≤ T I ≤ j < T + I G' = G[i, j]^{I \le j < T+I}_{1 \le i \le T} G=G[i,j]1iTIj<T+I 就是在提取这个子矩阵(选取前 T T T 行,对应文本查询,选取从第 I I I 列开始到 T + I − 1 T+I-1 T+I1 列的列,对应图像键)。

双流 (Two-stream) VLP 模型:

  • 文本和图像首先分别由独立的编码器进行处理(形成文本表示和图像表示)。
  • 文本和图像的交互(通常在融合编码器中)是通过交叉注意力 (Co-attention) 机制实现的。在这种机制下,文本 token 可以作为查询 (Query),图像 token 作为键 (Key)(或者反过来),直接计算文本 token 与图像 token 之间的注意力。
  • 在这种直接的交叉注意力计算中,查询序列的长度是文本 token 的数量 ( T T T),键序列的长度是图像 token 的数量 ( I I I)。因此,计算出的注意力图 A (以及由此得到的 G) 的维度天然就是 T × I T \times I T×I,它直接表示了文本 token 与图像 token 之间的关联。
  • 由于 G 本身的维度已经是我们需要的 T × I T \times I T×I,并且它直接反映了图像对文本的影响(如果文本是查询),所以不需要额外的裁剪步骤 G ′ G' G 就直接等于 G。

附3: H k H_k Hk 是如何得到的?

在基于区域的模型中, G ~ \tilde{G} G~ 中的每一个数值 v k v_k vk 都对应于模型识别出的图像中的一个特定的区域框 b k b_k bk(这个框有它自己的坐标,比如左上角和右下角的像素位置)。

H k H_k Hk 是一个与原始图像尺寸完全相同 ( h × w h \times w h×w) 的矩阵,它是为了表示 k k k 个重要区域 b k b_k bk 的贡献而临时构建的。

它是这样得到的:

  • 首先,我们创建一个空白的矩阵 H k H_k Hk,大小和原图一样,矩阵里的所有数值都初始化为 0。
  • 然后,我们找到 G ~ \tilde{G} G~ 中排序后的第 k k k 个最重要的值 v k v_k vk 以及它对应的区域框 b k b_k bk 的坐标。
  • 接着,我们遍历 H k H_k Hk 矩阵中的每一个像素位置 ( i , j ) (i, j) (i,j)
  • 如果像素 ( i , j ) (i, j) (i,j) 位于区域框 b k b_k bk 所定义的矩形范围之内,那么我们就将 H k [ i , j ] H_k[i, j] Hk[i,j] 的值设置为 v k v_k vk
  • 如果像素 ( i , j ) (i, j) (i,j) 在区域框 b k b_k bk 的范围之外,那么 H k [ i , j ] H_k[i, j] Hk[i,j] 的值就保持为 0。

所以, H k H_k Hk 这个矩阵看起来就像一张黑色的图片,但在区域框 b k b_k bk 的位置有一个和框一样形状的区域,里面的所有像素值都是 v k v_k vk

最终的热图 H R = ∑ k = 1 m H k H_R = \sum_{k=1}^m H_k HR=k=1mHk 就是把这 m m m 个这样的矩阵 H k H_k Hk 逐个像素地相加起来。如果图像的某个像素点位于多个重要区域框的重叠部分,那么这个像素在 H R H_R HR 中的值就会是它所在的所有区域框对应的 v k v_k vk 值的总和。

附4:双三次插值 (Bicubic Interpolation) 具体是如何做的?

双三次插值是将 G ~ \tilde{G} G~(一个表示每个图像 patch 重要性的向量/低分辨率网格)平滑地放大到原始图像尺寸 ( h × w h \times w h×w) 的一种技术。

  • 在端到端模型中,图像被分成许多小块(patch), G ~ \tilde{G} G~ 中的每个数值代表一个 patch 的重要性。这些 patch 在原图上是按照网格排列的。所以,你可以把 G ~ \tilde{G} G~ 的数值想象成一个低分辨率的重要性格点图
  • 我们的目标是得到一个高分辨率的、平滑的热图 H E H_E HE,它覆盖原图的每一个像素。
  • 双三次插值就是用来计算高分辨率图上每一个新像素点的值的。它不像简单的缩放那样只看看最近的几个点。
  • 对于高分辨率图上的每一个待计算的像素点,双三次插值会考察它在低分辨率重要性格点图上周围的 16 个最近的点(也就是周围的 16 个图像 patch 的重要性值)。
  • 然后,它会使用一个 更复杂的数学公式(基于三次多项式),结合这 16 个点的数值以及它们之间的变化趋势,来 精确地“推算” 出这个新像素点的值应该是多少。

附5:开放词汇检测器(OVD)是什么?

传统的目标检测器(如 Faster R-CNN, YOLO 等)有一个严重的局限性:只能识别训练集上标注过的有限类别(闭集,Closed Vocabulary),一旦测试阶段出现了训练集未见过的新类别(例如,“独角兽”、“新能源卡车”),传统检测器将无法识别。现实世界中,目标类别是开放的(Open World),难以穷尽标注所有可能对象。

开放词汇检测器(Open-Vocabulary Detector, OVD) 打破了这个限制。它是一种能够识别和定位任意给定文本描述所代表的物体类别的检测器,即使这个类别在训练时从未见过。它具备一种泛化能力,可以将对文本概念的理解应用到图像中的物体检测上。

OVD系统的核心挑战

  • 跨模态对齐: 需要将视觉特征(图片)和语言特征(文本描述)有效对齐,模型需要理解文本“企鹅”指的是图像中哪些像素区域所代表的视觉模式。比如区域–文本对齐损失(常用对比学习Loss,比如Contrastive Loss、Focal Loss(用于难例挖掘,平衡负样本)
  • 定位精度(Localization Accuracy)/ 细粒度定位: OVD 不仅要识别出新类别,还需要精确地定位它(给出准确的边界框),这要求模型能够将文本语义“定位”(Grounding)到图像的具体空间位置。
  • 从未见过的类别泛化(Generalization to Unseen Classes)/(Zero-shot Detection): 模型必须仅基于有限的“基类”(Base Classes,训练时见过的类别)学习到的知识,泛化到无数的“新类”(Novel Classes,训练时未见过、测试时通过文本指定的类别)。
  • 区分细粒度类别(Distinguishing Fine-grained Classes): 对于视觉上相似但语义不同的新类别(例如不同种类的鸟、不同型号的汽车),模型需要足够强的语义理解能力来区分它们。

OVD 的关键在于它利用了强大的视觉-语言模型(如 CLIP、ALIGN 等)的能力。这些模型在海量的图像和文本数据上进行预训练,学会了如何将图像内容和文本描述映射到同一个“理解空间”(称为嵌入空间)中。在这个空间里,含义相关的图像区域特征和文本概念特征会比较接近。OVD也可以用蒸馏的方式实现,例如在 ViLD(Vision and Language knowledge Distillation)中,先用大模型(如 CLIP)计算图像的全局特征和文本特征。再将其知识蒸馏到一个更小的检测器上(如 Faster R-CNN),指导检测器学习视觉–语言对齐。这样训练后的小检测器具备了跨类别泛化能力。一些新的方法(如 DetCLIPv2)不再靠蒸馏,而是直接在开放词汇上做端到端对齐训练,输入:图像 + 大量文本(类别名,短语,句子),输出:直接预测匹配度+回归框坐标。

开放词汇目标检测器(Open-Vocabulary Object Detectors, OVD)的训练过程比较复杂,通常不仅仅依赖于传统的目标检测(Object Detection, OD)数据。简单来说,OVD旨在检测训练时未明确见过的物体类别。为了实现这一目标,它们的训练通常结合了多种数据和方法:

  1. 基础目标检测数据(OD Data):许多OVD模型会使用传统的目标检测数据集(例如COCO、LVIS等)进行训练。这些数据集包含带有边界框标注的图像,用于学习检测一组“已知”或“基础”的物体类别。这为模型提供了定位和识别基本物体的能力。

  2. 视觉语言模型(Vision-Language Models, VLMs):OVD的核心在于其泛化到新类别的能力。这通常通过利用预训练的视觉语言模型(如CLIP)来实现。这些模型在大规模的图像-文本对上进行了训练,能够理解图像内容和自然语言描述之间的关系。弱监督数据(weak supervision),有些方法也会利用只有图像级标签而没有详细边界框标注的数据来辅助训练,通过图像中的文字信息来学习物体的存在和大致位置。

  3. 图像-文本数据:除了有边界框标注的OD数据外,OVD还经常利用大量的图像-文本对(例如从网络上抓取的图片及其描述文字/CLIP 的训练数据)。通过学习图像和文本之间的关联,模型能够建立起视觉概念和任意文本描述之间的联系,这为检测新颖类别奠定了基础。

  4. 伪标签(Pseudo-Labeling)和自训练(Self-Training):为了在新类别上进行学习,OVD常采用伪标签技术。这意味着模型(或一个辅助的VLM)会为未标注数据或仅有图像级标签的数据生成候选的边界框和类别标签。然后,这些伪标签被用于进一步训练检测器。自训练策略使得模型能够从未标注或弱标注数据中学习,扩展其词汇量。

  5. 区域级标注数据与语言模型协同训练:一些先进的方法,如LLMDet,会使用区域级别的标注数据,并与大型语言模型(LLM)协同训练,通过生成图像的详细描述来提升性能。

传统的OD数据是OVD训练的一部分,主要用于学习检测基础类别和物体定位。然而,为了实现“开放词汇”的能力,即检测未见类别,OVD必须结合视觉语言模型、大规模图像-文本数据以及伪标签、自训练等先进技术。因此,OVD并不仅仅是用OD数据训练出来的,而是OD数据与其他类型数据和训练策略相结合的产物。 这种结合使得模型能够将其学到的知识泛化到训练数据集中未包含的新物体类别。

ViLD (Vision-Language Detection): 一个早期的代表作,通过知识蒸馏将 CLIP 的知识迁移到 Faster R-CNN 检测器中。它将 RPN 提出的区域图像块送入 CLIP 的图像编码器,并将得到的嵌入作为“教师”信号,指导检测器自身的区域特征学习。分类时,比较区域特征与 CLIP 文本嵌入的相似度。
OV-DETR: 将开放词汇能力引入 DETR 架构。它利用 DETR 的 query embeddings 与 CLIP 的文本/图像嵌入进行交互和对齐。
RegionCLIP: 提出先用 CLIP 对图像区域和对应的短语进行预训练,然后再微调检测器。
Grounding DINO / GLIP: 这类模型将检测任务表述为“短语定位”(Phrase Grounding),能够直接接受更复杂的文本描述(如“红色的苹果在绿色的碗旁边”)并定位对应的物体,天然具备开放词汇能力。

方法核心特点备注
ViLD蒸馏 CLIP 视觉–语言知识到检测器经典两阶段思路
RegionCLIP区域级别对齐,文本增强融合 Region Proposal 和 CLIP
GLIP检测+短语定位统一训练端到端视觉–语言学习
DetPro可学习提示提升对齐质量提示学习(Prompt Tuning)
DetCLIP v2真正端到端开放词汇检测无需伪标签,纯对齐训练
YOLO-WorldYOLO架构中集成开放词汇能力轻量且实时

为什么OVD推理可以泛化到新类别?

  • 因为文本编码器没限制类别数量。只要你输入新的文本(新类别名),它就能在共享语义空间中找出最接近的区域。
  • 因为视觉特征和文本特征在统一空间,可以跨类别迁移(Zero-shot Capability)。

OVD训练阶段:假设以一个两阶段检测器(如 Faster R-CNN)为基座:

步骤1:区域提取(Region Proposal)
  • 用 RPN(Region Proposal Network)生成大量候选框 / 区域提议(Region Proposals)。使用一个标准的检测器组件(如 Faster R-CNN 的 RPN 或 DETR 的解码器)来生成图像中可能包含物体的候选区域(Region Proposals)或预测框。
步骤2:区域特征提取(Region Feature Extraction)
  • 为每个候选区域提取视觉特征。这通常通过一个视觉骨干网络(如 ResNet, Swin Transformer)完成,并可能使用 RoIAlign 等技术获取区域特定的特征。
步骤3:视觉–语言对齐(Feature Alignment)
  • 输入:
    • 区域视觉特征 f r e g i o n f_{region} fregion(可能需要通过一个适配层或投影层转换到与文本嵌入相同的空间)
    • 类别文本特征 f t e x t f_{text} ftext(如 “zebra” 或 “a close-up of a zebra”):文本编码(Text Encoding)使用 VLM 的文本编码器(如 CLIP Text Encoder)将用户提供的目标类别名称(通常会放入一个模板,如 “a photo of a {class_name}”)编码成文本嵌入(Text Embedding)。
  • 计算相似度(如:余弦相似度 s i m ( f r e g i o n , f t e x t ) sim(f_{region}, f_{text}) sim(fregion,ftext)
步骤4:对比学习(Contrastive Learning)或 知识蒸馏/微调(Knowledge Distillation/Fine-tuning)
  • 对齐正确的区域–文本对,推开错误的配对。常用Loss: InfoNCE 或 Triplet Loss。
    数学上形式:
    L c o n t r a s t i v e = − log ⁡ exp ⁡ ( s i m ( f r e g i o n + , f t e x t + ) ) ∑ n e g exp ⁡ ( s i m ( f r e g i o n n e g , f t e x t n e g ) ) \mathcal{L}_{contrastive} = -\log \frac{\exp(sim(f_{region}^+, f_{text}^+))}{\sum\limits_{neg} \exp(sim(f_{region}^{neg}, f_{text}^{neg}))} Lcontrastive=lognegexp(sim(fregionneg,ftextneg))exp(sim(fregion+,ftext+))
    其中 + + +表示正样本对, n e g neg neg是负样本对。

  • 知识蒸馏/微调(Knowledge Distillation/Fine-tuning): 通常,检测器会在包含“基类”标注的检测数据集上进行微调。在这个过程中,可能会利用 VLM 的知识(例如,强迫区域的视觉嵌入与 VLM 对该区域图像块的嵌入对齐,或者与对应基类的文本嵌入对齐),使得检测器学习到的视觉特征能够更好地与 VLM 的语义空间对齐,从而提高对新类的泛化能力。

步骤5:分类 + 框回归(Detection Head)
  • 该区域是什么类别(基于开放词汇的logits)
  • 该区域的更精确边界框(Bounding Box)

OVD推理阶段流程如下:

1. 输入
  • 图像
  • 一组待检测类别的文本描述
    • 如 [“dog”, “cat”, “airplane”]
    • 或复杂一点的句子 [“a white sports car”, “a golden retriever in the park”]
2. 特征提取
  • 图像特征提取
    • 对整张图用 backbone(如ViT、ResNet)提取多尺度特征图。
  • 候选区域提取
    • 用RPN(或者是YOLOv8的anchor-free方案:“每个点都有潜力成为目标的中心点。”,直接在特征图上,让每个像素点(或位置)预测目标中心点、大小、类别。)生成N个候选框。
  • 区域特征提取
    • 用 RoIAlign 等方法对每个候选框提特征。
3. 文本编码(类别文本特征提取)
  • 把输入的文本类别描述,输入到文本编码器(通常是Transformer),得到文本嵌入向量。
    • 可包含提示词(prompt,如"A photo of a {class}")。
  • 文本向量通常是L2归一化的(Unit Norm)。
4. 匹配与得分(Matching and Scoring)
  • 计算每个候选区域特征与每个文本特征的相似度得分(通常是余弦相似度)。
  • 区域特征和文本特征在向量空间里接近 → 说明这个区域是这个类别。
5. 框筛选与NMS(Post-processing)
  • 根据相似度得分,筛选得分高的候选框。
  • 同类别之间的重叠框(IoU高)进行非极大值抑制(NMS,只保留置信度最高的框,抑制那些高度重叠、得分低的框),去除冗余重叠检测框(Bounding Boxes)。①拿到所有预测框,每个都有一个类别得分。②按照得分从高到低排序。③选中得分最高的框,作为一个最终检测结果。④移除与它IoU(交并比)大于一定阈值的其他框(这些被认为是重复检测)。⑤重复2-4步骤,直到没有剩余框。
  • 输出最终检测框+类别+置信度。

附6:其他VLP模型

  • TCL (Yang et al. 2022) 是一个双流端到端模型,是 ALBEF 的增强版本,它引入了三个对比模块:跨模态对齐(Cross-modal Alignment, CMA)、模内对比(Intramodal Contrastive, IMC)和局部互信息最大化(Local Mutual Information Maximization, LMI)。这些模块旨在最大化匹配图像和文本之间的互信息以及最大化全局互信息。与 ALBEF 一致,我们使用跨模态融合编码器的第 3 层进行 GradCAM。我们采用其 TCL-4M 检查点,输入提示与正文中描述的 ALBEF 相同。
  • PTP (Wang et al. 2022) 利用位置引导的文本提示,使 VLP 模型在训练期间嵌入位置信息。它有两个版本,分别以 ViLT (Kim, Son, and Kim 2021) 和 BLIP (Li et al. 2022a) 作为主干网络。我们选择引入 BLIP 的版本,这是一个双流端到端模型,并在其跨模态融合编码器的第 8 层使用 GradCAM。我们采用其 PTP-BLIP-4M 检查点,输入提示与正文中描述的 ALBEF 相同。
  • Lxmert (Tan and Bansal 2019) 是一个双流基于区域模型,依赖于广泛使用的自下而上和自上而下的物体检测器 (Anderson et al. 2018) 来生成视觉特征。该模型使用 ITM 和其他三个目标进行预训练。通常,双流模型中交叉注意力编码器的协同注意力模块从图像模态收集 K、V,从文本模态收集 Q,使得通过 Q ⋅ K ⊤ Q \cdot K^⊤ QK 计算得到的 A 的形状为 T × I。而 Lxmert 有两个协同注意力模块,其中一个像往常一样从图像模态收集 K、V,从文本收集 Q,另一个则相反。我们在前者中使用 GradCAM,以便注意力图能够像其他双流模型一样表示图像 tokens 对每个文本 token 的影响。此外,我们将 Lxmert 的 m 设置为 5,并使用其跨模态融合编码器的第 3 层。我们采用其 Lxmert-20epochs 检查点,输入提示与正文中描述的 ALBEF 相同。

TCL 是一个基于 ALBEF 模型改进而来的双流 (Dual-stream)端到端 (End-to-end) 的视觉-语言预训练模型。

  • 双流与端到端: “双流” 指的是模型有两条独立的处理通路,一条处理图像信息,另一条处理文本信息,之后再通过特定的模块(如跨模态融合编码器)将两者信息融合。“端到端” 在这里通常意味着模型直接从原始图像和文本输入,经过内部处理后直接输出结果(如匹配分数、生成的文本等),而不需要依赖像 Lxmert 那样需要外部预先提取好的区域特征。ALBEF 本身就是一个重要的双流 VLP 模型,以其有效的图文对齐和融合机制著称。
  • 核心创新点: TCL 引入了三个专门设计的对比学习模块来增强图文表示学习:
    • 跨模态对齐 (CMA): 目标是拉近匹配的图像和文本对在表示空间中的距离,推远不匹配的对。
    • 模内对比 (IMC): 在单一模态内部进行对比学习,例如确保不同图像(或文本)的表示具有区分度,增强表示的质量。
    • 局部互信息最大化 (LMI): 不仅关注全局(整个图像 vs 整个文本)的匹配,还关注图像局部区域和文本片段(如单词、短语)之间的细粒度对应关系,并最大化它们之间的互信息 (Mutual Information)互信息最大化: 在信息论中,互信息衡量两个变量之间共享的信息量。在这里,最大化互信息意味着模型要学习到这样的表示:当你看到图像(或其一部分)时,你能最大程度地推断出对应文本(或其一部分)的信息,反之亦然。这强制模型学习更深层次、更准确的跨模态关联。
  • 实验细节: 使用跨模态融合编码器的第 3 层进行 GradCAM 可视化分析,采用 TCL-4M 预训练检查点,输入提示与 ALBEF 使用的相同。

PTP 模型的核心思想是利用位置引导的文本提示 (Position-guided text prompts),在训练 VLP 模型时显式地将位置信息嵌入进去。

  • 位置引导的文本提示: 这意味着 PTP 在训练时使用的文本输入不仅仅是描述图像内容的语句,还包含了关于物体空间位置的信息。例如,可能将描述与物体坐标或空间关系词(如“左边”、“上方”)结合起来输入模型,或者设计特殊的提示格式来引导模型关注位置。这使得模型在学习图文关联时,能够更好地理解和利用空间布局信息。
  • 模型架构: PTP 可以基于不同的 VLP 骨干网络构建,这里选用的是基于 BLIP 的版本。BLIP 本身是一个强大的双流端到端 VLP 模型,擅长视觉语言理解和生成任务。因此,这个 PTP 版本也是一个双流端到端模型。
  • 实现细节: 使用 BLIP 跨模态融合编码器的第 8 层进行 GradCAM 分析,采用 PTP-BLIP-4M 检查点,输入提示与 ALBEF 使用的相同。

Lxmert 是一个双流 (Dual-stream)、但基于区域 (Region-based) 的 VLP 模型。

  • 基于区域: 与 TCL(ALBEF) 和 PTP (BLIP) 不同,Lxmert 不是直接处理整个图像。它首先依赖一个外部的物体检测器来识别图像中的显著物体或区域,并只提取这些区域的特征。模型的视觉输入是这些预先提取好的区域特征,而不是原始像素或网格特征。这是它与“端到端”模型的主要区别。
  • 核心特点 - 双协同注意力: Lxmert 的跨模态融合部分使用了两个协同注意力 (Co-Attention) 模块。
  • 协同注意力与双模块: 在标准的跨模态注意力中,通常一种模态提供查询向量 (Query, Q),另一种模态提供键 (Key, K) 和值 (Value, V) 来计算注意力。Lxmert 的特别之处在于它有两个这样的模块并行工作:
    • 模块一 (图像 K/V, 文本 Q): 图像区域特征提供 K 和 V,文本词元特征提供 Q。计算出的注意力图 A A A 形状为 T × I T \times I T×I(文本长度 T × 图像区域数 I),表示每个文本词元对各个图像区域的关注程度。这里使用 GradCAM 就是作用在这个模块上,以便观察图像区域对文本理解的影响,这与其他双流模型的可视化方式保持一致。
    • 模块二 (文本 K/V, 图像 Q): 文本词元特征提供 K 和 V,图像区域特征提供 Q。计算出的注意力图形状为 I × T I \times T I×T,表示每个图像区域对各个文本词元的关注程度。这种双向的协同注意力机制允许模型在早期融合阶段就进行更丰富的图文交互。
  • 训练目标: Lxmert 使用了包括图像文本匹配 (ITM) 在内的多个目标进行预训练。ITM 是一个常见的预训练任务,即判断给定的图像和文本是否匹配。
  • 实现细节: 将 Lxmert 的 m 设为 5,使用其跨模态融合编码器的第 3 层进行 GradCAM 分析,采用 Lxmert-20epochs 检查点,输入提示与 ALBEF 使用的相同。

附7:GradCAM(Gradient-weighted Class Activation Mapping)

Grad-CAM 是一种用于深度学习模型(特别是卷积神经网络 CNN)的可视化技术。它的主要目的是解释 CNN 为何做出特定的预测。它通过生成一个“类激活热力图”(Class Activation Heatmap),来高亮显示输入图像中对于模型做出最终决策(例如,识别图像中的某个物体)最重要的区域。

它也是一种强大且广泛使用的 CNN 可解释性技术。它通过巧妙地利用梯度信息来加权特征图,生成直观的热力图,揭示模型做出预测时所关注的图像区域。尽管存在一些局限性,但它在模型调试、建立信任和理解深度学习模型行为方面发挥着重要作用,是 Explainable AI 工具箱中的重要一员。

简单来说,Grad-CAM 可以告诉你:“模型在看图像的哪个部分,才得出了这个结论?”

为什么需要 Grad-CAM?

CNN 通常被认为是“黑箱”模型。我们知道它们在图像识别、目标检测等任务上表现优异,但很难直观地理解它们做出决策的具体依据。这种不透明性在很多关键领域(如医疗诊断、自动驾驶)是不可接受的。Grad-CAM 作为一种“可解释性 AI”(Explainable AI, XAI)技术,解决了以下问题:

  1. 模型调试: 检查模型是否关注了图像中正确的区域。如果模型将背景噪声识别为关键特征,说明模型可能存在问题。
  2. 建立信任: 在高风险应用中,理解模型的决策过程有助于建立用户对 AI 系统的信任。
  3. 获取洞见: 了解模型如何识别特定类别,可能揭示新的模式或特征。
  4. 偏见检测: 检查模型是否依赖了数据中不期望的偏见(例如,根据背景而不是主体来分类)。

Grad-CAM 的工作原理:

Grad-CAM 的核心思想是利用梯度信息来理解最后一个卷积层的特征图(Feature Maps)对于最终决策的重要性。步骤如下:

  1. 前向传播 (Forward Pass):

    • 将输入图像喂给训练好的 CNN 模型,进行一次完整的前向传播,得到最终的预测分数(例如,对于某个类别的分数)。
  2. 选择目标类别 (Target Class):

    • 确定你想要解释的类别。通常是被预测概率最高的那个类别,但也可以是任何你感兴趣的类别。
  3. 计算梯度 (Backward Pass):

    • 计算目标类别分数相对于最后一个卷积层输出的特征图的梯度。这个梯度表示了,如果最后一个卷积层的某个特征图上的某个像素值发生微小变化,目标类别的分数会改变多少。这个梯度反映了每个特征图通道对目标类别的“贡献方向”。
  4. 计算神经元重要性权重 (Neuron Importance Weights):

    • 对于最后一个卷积层的每一个特征图通道(假设有 k 个通道),计算其梯度的全局平均池化 (Global Average Pooling, GAP)。这会为每个通道生成一个单一的权重值 α k c \alpha_k^c αkc (c 代表目标类别,k 代表第 k 个通道)。
    • α k c = 1 Z ∑ i ∑ j ∂ y c ∂ A i j k \alpha_k^c = \frac{1}{Z} \sum_i \sum_j \frac{\partial y^c}{\partial A_{ij}^k} αkc=Z1ijAijkyc
      • y c y^c yc 是目标类别 c 的分数(在输入 Softmax 之前)。
      • A k A^k Ak 是最后一个卷积层的第 k 个特征图。
      • A i j k A_{ij}^k Aijk 是特征图 A k A^k Ak 在空间位置 (i, j) 的激活值。
      • Z 是特征图 A k A^k Ak 的像素总数 (width × height)。
    • 这个权重 α k c \alpha_k^c αkc 代表了第 k 个特征图对于目标类别 c 的整体重要性。
  5. 生成热力图 (Heatmap Generation):

    • 将最后一个卷积层的原始特征图 A k A^k Ak 与其对应的重要性权重 α k c \alpha_k^c αkc 进行加权求和。
    • L G r a d C A M c = ∑ k α k c A k L_{GradCAM}^c = \sum_k \alpha_k^c A^k LGradCAMc=kαkcAk
    • 这个加权组合 L G r a d C A M c L_{GradCAM}^c LGradCAMc 得到的是一个粗糙的定位图,其中包含了对目标类别 c 有重要贡献的特征图信息。
  6. ReLU 激活:

    • 将 ReLU (Rectified Linear Unit) 函数应用于加权组合后的定位图: R e L U ( L G r a d C A M c ) ReLU(L_{GradCAM}^c) ReLU(LGradCAMc)
    • 这一步很关键,因为它只保留了对目标类别有正向影响的特征。我们只关心哪些特征的存在会增加目标类别的分数,而不是哪些特征会减少分数。
  7. 上采样与可视化:

    • 将生成的 ReLU 处理后的热力图(通常分辨率较低)通过上采样(如双线性插值)调整到与原始输入图像相同的尺寸。
    • 将这个热力图叠加到原始输入图像上(通常使用颜色映射,如从蓝到红表示从低到高的重要性),即可直观地看到模型关注的区域。红色区域通常表示对该类别预测贡献最大的区域。

Grad-CAM 的主要优点:

  1. 无需修改模型结构或重新训练: 可以在任何基于 CNN 的架构(如 VGG, ResNet, Inception, DenseNet 等)上应用,只要能获取特征图和梯度即可。
  2. 类别区分性 (Class-discriminative): 生成的热力图是针对特定类别的,能很好地定位与该类别相关的区域。
  3. 通用性: 不仅限于图像分类任务,也可以应用于图像描述生成、视觉问答等涉及 CNN 的任务。
  4. 结合高分辨率细节: 可以与 Guided Backpropagation 等技术结合(形成 Guided Grad-CAM),生成既具有类别区分性又包含高频细节的可视化结果。

Grad-CAM 的局限性:

  1. 分辨率较低: 由于通常使用最后一个卷积层的特征图,其空间分辨率可能较低,导致生成的热力图比较粗糙,不能精确勾勒物体边界。
  2. 可能只关注部分区域: 对于图像中同一类别的多个实例,Grad-CAM 可能只高亮显示其中最具有判别性的一个或几个区域。
  3. 梯度饱和问题: 在某些情况下,梯度可能饱和(变得很小),导致计算出的重要性权重 α k c \alpha_k^c αkc 不够准确。
  4. 依赖于最后一个卷积层: 主要反映了最后一个卷积层的信息,可能忽略了浅层卷积层捕捉到的细粒度特征的重要性。

附8:核心源代码段解析

with torch.no_grad():
    # Reshape and move attention mask to CPU
    mask = text_input.attention_mask.view(text_input.attention_mask.size(0), 1, -1, 1, 1).cpu()

    # Get attention map and attention gradients from the specified transformer block
    cams = model.text_encoder.encoder.layer[block_num].crossattention.self.get_attention_map().cpu()
    grads = model.text_encoder.encoder.layer[block_num].crossattention.self.get_attn_gradients().cpu()

    # Reshape and apply mask
    cams = cams[:, :, :, 1:].reshape(image.size(0), 12, -1, num_patch, num_patch) * mask
    grads = grads[:, :, :, 1:].clamp(0).reshape(image.size(0), 12, -1, num_patch, num_patch) * mask

    # Compute gradcam
    gradcams = cams * grads

这段代码是在计算“注意力梯度加权类激活图”(Grad-CAM),这是一种可视化技术,用来理解模型在做决策时关注了输入数据的哪些部分,这里特指文本和图像之间的交叉注意力。

with torch.no_grad():

  • 解释: 这句话告诉PyTorch:“接下来括号里的这些计算,请不要追踪它们的梯度(导数)。”
  • 为什么这么做? 在模型推理、评估或者像这里一样仅仅是提取中间结果(如注意力图)并进行后处理时,我们不需要计算梯度。关闭梯度计算可以:
    1. 节省内存: 因为不需要存储用于反向传播的中间值。
    2. 加快速度: 计算量会减少。简单说,就是进入一个“只计算,不学习”的模式。

mask = text_input.attention_mask.view(text_input.attention_mask.size(0), 1, -1, 1, 1).cpu()

  1. text_input.attention_mask:

    • 解释: 这是文本输入的“注意力遮罩”。在处理文本时,句子长度可能不同,短句子会用特殊标记(如padding token)补齐到固定长度。这个遮罩告诉模型哪些是真实的文本内容,哪些是填充的,模型应该忽略填充部分。
    • 可能的原始维度: (batch_size, sequence_length)
      • batch_size: 一批处理多少个文本样本。
      • sequence_length: 文本序列的最大长度(包括填充)。
  2. .view(text_input.attention_mask.size(0), 1, -1, 1, 1):

    • 解释: 这是在改变 attention_mask 的形状,以便后续能和注意力图(camsgrads)进行正确的广播(broadcast)和逐元素乘法。
    • 维度含义:
      • text_input.attention_mask.size(0): 批次大小 (Batch Size)。保持原始的批次大小。
      • 1: 为注意力头预留的维度。注意力机制通常有多个“头”(heads),这个 1 使得遮罩可以被广播到所有注意力头上。
      • -1: 文本序列长度 (Sequence Length)。这里的 -1 告诉PyTorch自动推断这个维度的大小,它会是原始的 sequence_length
      • 1: 为图像块高度预留的维度。这个 1 使得遮罩可以被广播到图像特征图的“高度”维度。
      • 1: 为图像块宽度预留的维度。这个 1 使得遮罩可以被广播到图像特征图的“宽度”维度。
    • 改变后的形状: (batch_size, 1, sequence_length, 1, 1)
  3. .cpu():

    • 解释: 把这个张量(mask)从GPU显存移动到CPU内存。
    • 为什么这么做? 后续的操作可能在CPU上进行,或者只是为了确保数据在期望的设备上。

cams = model.text_encoder.encoder.layer[block_num].crossattention.self.get_attention_map().cpu()

  1. model.text_encoder.encoder.layer[block_num].crossattention.self.get_attention_map():

    • 解释: 这是在从模型的特定部分提取“原始的注意力图 (attention map)”。
      • model.text_encoder...layer[block_num]: 指向模型中处理文本的编码器的第 block_num 个层。
      • .crossattention: 表明这是文本和图像(或其他模态)之间的交叉注意力机制。
      • .self.get_attention_map(): 调用一个方法来获取计算好的注意力权重。这些权重表示文本中的每个词(token)对图像(或其特征)的每个部分的关注程度。
    • 可能的原始维度(在被get_attention_map内部处理前或刚拿到时): 可能类似于 (batch_size, num_heads, num_text_tokens, num_image_tokens_or_patches)。这里的 num_image_tokens_or_patches 可以是图像被分解成的块(patch)的数量,或者还可能包含一个特殊的 [CLS]图像标记。
  2. .cpu():

    • 解释: 同样,将提取到的注意力图(cams)移动到CPU内存。

grads = model.text_encoder.encoder.layer[block_num].crossattention.self.get_attn_gradients().cpu()

  1. model.text_encoder.encoder.layer[block_num].crossattention.self.get_attn_gradients():

    • 解释: 与上面类似,但这次是获取“注意力权重的梯度”。在Grad-CAM类的方法中,梯度信息指示了哪些注意力权重对于最终决策(比如分类结果或某个损失函数)更为重要。
    • 可能的原始维度: 通常与对应的注意力图 cams 的维度相同。
  2. .cpu():

    • 解释: 将注意力梯度(grads)移动到CPU内存。

cams = cams[:, :, :, 1:].reshape(image.size(0), 12, -1, num_patch, num_patch) * mask

  1. cams[:, :, :, 1:]:

    • 解释: 这是在对原始的 cams 张量进行切片。
      • : 表示选择该维度的所有元素。
      • 1: 表示从索引为1的元素开始选择到最后。在第四个维度上,这通常意味着跳过第一个图像标记/块的注意力分数
    • 为什么跳过第一个? 在很多视觉Transformer模型中,序列的第一个元素可能是一个特殊的 [CLS] 标记(代表整个图像的概要特征)或者是一个全局平均池化特征。如果计算的是基于图像块(patch)的注意力,那么这个全局标记的注意力可能需要被排除或单独处理。这里假设后面的 num_patch * num_patch 个元素才是对应图像空间块的。
    • 切片后的维度(假设原始第四维是 num_image_patches + 1): (batch_size, num_heads, num_text_tokens, num_image_patches)
  2. .reshape(image.size(0), 12, -1, num_patch, num_patch):

    • 解释: 再次改变 cams 的形状,使其更符合“图像化”的表示,并明确注意力头的数量。
    • 维度含义:
      • image.size(0): 批次大小 (Batch Size)。通常与文本输入的批次大小相同。
      • 12: 注意力头的数量 (Number of Attention Heads)。这是一个硬编码的数字,表示模型在该层交叉注意力中使用了12个注意力头。
      • -1: 文本序列长度 (Number of Text Tokens)。PyTorch会自动推断这个维度的大小,确保总元素数量不变。它应该等于 num_text_tokens
      • num_patch (第一个): 图像块网格的高度。表示图像在垂直方向被分成了多少块。
      • num_patch (第二个): 图像块网格的宽度。表示图像在水平方向被分成了多少块。
      • 这里假设 num_image_patches (上一步切片后的第四维大小) 等于 num_patch * num_patch
    • 改变后的形状: (batch_size, 12, num_text_tokens, num_patch, num_patch)
  3. * mask:

    • 解释: 将调整好形状的 cams 与之前准备好的 mask 进行逐元素相乘。
    • 广播机制: mask 的形状是 (batch_size, 1, num_text_tokens, 1, 1)。在乘法时,mask 的维度会自动“扩展”(广播)来匹配 cams 的对应维度:
      • mask 的第2维(大小为1)会扩展以匹配 cams 的第2维(大小为12,即注意力头)。
      • mask 的第4维(大小为1)会扩展以匹配 cams 的第4维(大小为 num_patch,即图像块高度)。
      • mask 的第5维(大小为1)会扩展以匹配 cams 的第5维(大小为 num_patch,即图像块宽度)。
    • 作用: 这样做的效果是,对于文本序列中的填充部分(mask中对应值为0),其在 cams 中对应的注意力分数会被清零,确保模型不会关注这些无意义的填充内容。

grads = grads[:, :, :, 1:].clamp(0).reshape(image.size(0), 12, -1, num_patch, num_patch) * mask

这一行对 grads(注意力梯度)做了与 cams 非常相似的处理:

  1. grads[:, :, :, 1:]: 同样,跳过第一个图像标记/块的梯度。
  2. .clamp(0):
    • 解释: 将张量中的所有元素限制在某个范围内。这里是 clamp(0),意味着所有小于0的元素都会被设置为0,而大于等于0的元素保持不变。这等效于一个ReLU激活函数。
    • 为什么这么做? 在标准的Grad-CAM中,通常只关心对最终结果有“积极贡献”的梯度,即正梯度。负梯度可能会引入噪声或不直观的解释。
  3. .reshape(...): 与 camsreshape 目的和维度含义完全相同。
  4. * mask: 与 cams 的乘以 mask 的目的和广播机制完全相同,确保梯度的计算也忽略文本填充部分。

gradcams = cams * grads

  • 解释: 这是计算最终 Grad-CAM (或者一个变种) 的核心步骤。它将经过处理的注意力图 (cams) 与对应的经过处理和钳位的梯度 (grads) 进行逐元素相乘。
  • 维度含义: gradcams 的维度将与相乘前的 camsgrads 的维度完全相同,即:
    (batch_size, 12, num_text_tokens, num_patch, num_patch)
    • batch_size: 批次中的样本索引。
    • 12: 注意力头的索引。
    • num_text_tokens: 文本中特定词(token)的索引。
    • num_patch (第一个): 图像块网格的行索引(y坐标)。
    • num_patch (第二个): 图像块网格的列索引(x坐标)。
  • 结果的意义: gradcams 中的每个值表示,对于批次中的某个样本、某个注意力头、某个文本词,其对图像上某个特定 (patch_y, patch_x) 位置的关注程度,并且这个关注度是经过梯度加权的(即考虑了该关注对模型最终输出的重要性)。值越大,通常表示该文本词通过该注意力头重点关注了图像的该区域,并且这种关注对模型决策很重要。

for z, text in enumerate(texts):
    gradcam = gradcams[z]
    
    if find_words:
        gradcam = gradcam.mean(0)[all_focus_ids, ...].mean(0)
    else:
        gradcam = gradcam.mean(0)[:num_effective_text_token, ...].mean(0)
    
    gradcam = gradcam.view(1, 1, num_patch, num_patch)

假设在这段代码之前,gradcams 已经计算出来了,它可能是一个包含了批处理中所有样本的Grad-CAM结果的张量(tensor)。基于之前的讨论,gradcams 的维度可能是类似 (batch_size, num_heads, num_text_tokens, num_patch, num_patch) 这样的结构,其中:

  • batch_size: 一批处理的样本数量。
  • num_heads: 注意力机制中的头的数量。
  • num_text_tokens: 文本序列中token(词元)的数量。
  • num_patch (第一个): 图像在垂直方向上被划分的块(patch)的数量。
  • num_patch (第二个): 图像在水平方向上被划分的块(patch)的数量。

现在我们开始解释这几行代码:


for z, text in enumerate(texts):

  • 解释: 这是一个循环。texts 应该是一个包含多个文本的列表(比如一个批次里所有的句子)。enumerate 函数会同时给出每个文本的索引 z (从0开始) 和文本内容 text。循环的每一轮,都会处理列表中的一个文本。
  • z 的含义: 当前处理的样本在批次中的索引。
  • text 的含义: 当前处理的文本字符串。

gradcam = gradcams[z]

  • 解释: 从之前计算好的 gradcams 大张量中,根据索引 z 取出属于当前这个文本样本(第 z 个样本)的Grad-CAM数据。
  • 维度变化和含义:
    • 假设 gradcams 的原始维度是 (batch_size, num_heads, num_text_tokens, num_patch, num_patch)
    • gradcams[z] 会选取 batch_size 这个维度上索引为 z 的那部分数据。
    • 所以,执行后 gradcam 的维度会变成 (num_heads, num_text_tokens, num_patch, num_patch)
    • 具体含义: gradcam 现在存储了当前文本样本(第 z 个)在所有注意力头、所有文本token下,相对于图像所有patch的原始Grad-CAM值。它是一个四维的数据块。

gradcam = gradcam.mean(0)[all_focus_ids, ...].mean(0) if find_words else gradcam.mean(0)[:num_effective_text_token, ...].mean(0)

这行代码是核心,它根据 find_words 的值(一个布尔值,表示是否找到了需要特别关注的“焦点词”)来选择不同的方式处理 gradcam

我们先看共同的部分:gradcam.mean(0) (这部分在 ifelse 分支中都首先出现)

  1. gradcam.mean(0)
    • 解释: 沿着当前 gradcam 的第一个维度进行平均。
    • 维度变化和含义:
      • 此时 gradcam 的维度是 (num_heads, num_text_tokens, num_patch, num_patch)
      • .mean(0) 会对 num_heads 这个维度进行平均。也就是说,它把所有注意力头的效果平均起来了。
      • 执行后,gradcam(或者更准确地说是这个表达式的中间结果)的维度会变成 (num_text_tokens, num_patch, num_patch)
      • 具体含义: 这个三维数据块现在表示,对于当前文本的每一个token,它(平均了所有注意力头之后)对图像各个patch的关注热图。

现在看 if find_words: 分支 (如果 find_wordsTrue)

  1. [all_focus_ids, ...] (作用于上面 gradcam.mean(0) 的结果)

    • 解释: 从所有文本token对应的热图中,只挑选出那些被认为是“焦点词”的token(其索引存储在 all_focus_ids 列表中)对应的热图。
    • 维度变化和含义:
      • all_focus_ids 是一个包含“焦点词”token索引的列表。
      • 输入数据的维度是 (num_text_tokens, num_patch, num_patch)
      • [all_focus_ids, ...] 会沿着第一个维度(num_text_tokens)进行索引,选出 all_focus_ids 指定的那些行。... 表示保留后续所有维度(即 num_patchnum_patch)。
      • 执行后,维度会变成 (len(all_focus_ids), num_patch, num_patch),其中 len(all_focus_ids) 是焦点词的数量。
      • 具体含义: 现在的数据块包含了每个“焦点词”对应的、在图像所有patch上的关注热图。
  2. .mean(0) (作用于上面 [all_focus_ids, ...] 的结果)

    • 解释: 将所有“焦点词”各自的关注热图再进行平均,融合成一张单一的热图。
    • 维度变化和含义:
      • 输入数据的维度是 (len(all_focus_ids), num_patch, num_patch)
      • .mean(0) 会对第一个维度(len(all_focus_ids))进行平均。
      • 执行后,最终 gradcam 的维度会变成 (num_patch, num_patch)
      • 具体含义: 这是一张二维热图,代表了所有“焦点词”综合起来对图像各个patch的平均关注程度。

再看 else 分支 (如果 find_wordsFalse)

  1. [:num_effective_text_token, ...] (作用于 gradcam.mean(0) 的结果)

    • 解释: 如果没有特定的“焦点词”,那就选取文本中所有有效的(非填充的)token对应的热图。
    • 维度变化和含义:
      • num_effective_text_token 是当前文本中有效token的数量。
      • 输入数据的维度是 (num_text_tokens, num_patch, num_patch)
      • [:num_effective_text_token, ...] 会选取第一个维度(num_text_tokens)的前 num_effective_text_token 个元素。... 同样表示保留后续所有维度。
      • 执行后,维度会变成 (num_effective_text_token, num_patch, num_patch)
      • 具体含义: 现在的数据块包含了文本中每个有效token对应的、在图像所有patch上的关注热图。
  2. .mean(0) (作用于上面 [:num_effective_text_token, ...] 的结果)

    • 解释: 将所有有效token各自的关注热图进行平均,融合成一张单一的热图。
    • 维度变化和含义:
      • 输入数据的维度是 (num_effective_text_token, num_patch, num_patch)
      • .mean(0) 会对第一个维度(num_effective_text_token)进行平均。
      • 执行后,最终 gradcam 的维度会变成 (num_patch, num_patch)
      • 具体含义: 这是一张二维热图,代表了文本中所有有效词综合起来对图像各个patch的平均关注程度。

总结这行条件语句: 无论走哪个分支,最终 gradcam 都会变成一个二维张量,形状为 (num_patch, num_patch)。这张二维热图代表了文本(或者是焦点词,或者所有有效词)在图像空间上的一个聚合后的“关注点分布图”。


gradcam = gradcam.view(1, 1, num_patch, num_patch)

  • 解释: 改变 gradcam 的形状,给它增加两个维度,使其看起来更像一个标准的“单通道图像批次”。
  • 维度变化和含义:
    • 此时 gradcam 的维度是 (num_patch, num_patch)(一个二维热图)。
    • .view(1, 1, num_patch, num_patch) 将其重塑为四维张量。
    • 执行后,gradcam 的维度会变成 (1, 1, num_patch, num_patch)
    • 具体含义:
      • 第一个 1批次大小 (Batch Size)。表示这是一个包含1个样本的批次(这个样本就是我们刚生成的二维热图)。
      • 第二个 1通道数 (Channels)。表示这个“图像”是单通道的(比如灰度图,热图通常也是单通道的,表示强度)。
      • 第一个 num_patch高度 (Height)。热图的高度。
      • 第二个 num_patch宽度 (Width)。热图的宽度。
  • 为什么这么做? 很多图像处理函数或神经网络层(比如后续可能用到的图像缩放 F.interpolate)期望输入是这种4D格式 (N, C, H, W)。所以这里是为了适配后续操作。

总的来说,这几行代码的作用是:对于批次中的每一个文本样本,首先提取其原始的多头、多词元的Grad-CAM图,然后通过平均注意力头、选择特定词元(焦点词或所有有效词)并再次平均,最终生成一个单一的、聚合后的二维关注热图。最后,将这个二维热图调整为标准的四维图像格式,以备后续使用(比如可视化或进一步计算)。

MAIN_POS = ['NOUN', 'VERB', 'ADJ', 'PROPN', 'NUM']

def find_main_words(sent, start_idx, tokenizer):
    doc = nlp(sent)
    id_map = {}
    cursor = start_idx + 1
    main_words_ids = []
    for word in doc.sentences[0].words:
        temp = cursor
        cursor += len(tokenizer(word.text, return_tensors="pt").input_ids[0]) - 1
        id_map[word.id] = list(range(temp, cursor))
        if word.pos in MAIN_POS:
            main_words_ids.append(word.id)
    return main_words_ids, id_map

self.find_main_words(text, start_idx, tokenizer) 中的 text 参数,是来自 for z, text in enumerate(texts): 循环中的 text,这个 text 是原始的、不包含模板prompt的文本内容。

函数 find_main_words(sent, start_idx, tokenizer)

  • sent: 这个参数就是原始的、简短的文本内容(比如 “猫”,”红色的汽车”)。它包含任何模板的前缀或后缀。在你的代码中,它对应的是循环变量 text
  • start_idx: 这个参数的含义是模板前缀部分完整的、加了模板并已分词的提示语(即 text_input.input_ids[z])中所占据的最后一个token的索引。因此,sent(也就是 text)所对应的token,在 text_input.input_ids[z] 中是从 start_idx + 1 这个位置开始的。
  • tokenizer: 这是全局使用的分词器。

函数的核心任务和挑战:

  1. 对原始的 sent 进行语言学分析,找出其中的单词和“主要单词”。
  2. 确定 sent 中的这些单词,在经过分词器处理后,会变成哪些token。
  3. 最关键的是,将这些从 sent 产生的token,准确地映射到它们在最终的、完整的、加了模板的token序列(即 text_input.input_ids[z])中的正确位置。start_idx 在这里起到了桥梁和定位的作用。

我们再仔细看关键代码行的含义:

  • doc = nlp(sent):

    • 这一步正确地处理了原始的、不带模板的 sent 文本,对其进行分词、词性标注等语言学分析。
  • cursor = start_idx + 1:

    • cursor 被正确地初始化为 sent 文本内容在完整提示语的token序列 (text_input.input_ids[z]) 中的起始索引
  • for word in doc.sentences[0].words::

    • 遍历从原始 sent 中分析出来的每一个词(word)。

    • temp = cursor:

      • temp 存储了当前 word.text(来自原始 sent)在完整提示语的token序列中的起始索引。
    • cursor += len(tokenizer(word.text, return_tensors="pt").input_ids[0]) - 1:

      • 这里是对 word.text(比如原始 sent 中的单词 “奔跑的”)进行单独的分词
      • len(tokenizer(word.text, ...).input_ids[0]) - 1 的目的是计算出这个 word.text 在最终的、完整的token序列中会占据多少个token位置
        • 这个计算基于一个假设:单独对 word.text 分词得到的token数量(经过 -1调整,可能是为了去掉单独分词时tokenizer额外添加的如[CLS]等特殊token的影响),与它作为 sent 的一部分并随 sent 一起被嵌入到完整模板中再进行分词时所占据的token数量是相同的。对于大多数基于子词(subword)的分词器,一个词在不同上下文中的分词结果通常是比较稳定的,尤其是当它是一个完整的词时。
      • cursor 因此向前推进了相应数量的token位置。
    • id_map[word.id] = list(range(temp, cursor)):

      • 这一步非常关键:它将 nlp(sent) 分析出的 word.id(这个ID是相对于原始 sent 的)映射到一个token索引列表 [temp, temp+1, ..., cursor-1]
      • 重要的是,这些索引 tempcursor-1 是在 text_input.input_ids[z](即完整的、加了模板的提示语的token序列)中的位置。

所以,函数的整体逻辑是:

  1. 接收原始的、不带模板的文本 sent
  2. 知道这个 sent 的内容在最终的、加了模板的完整token序列中是从 start_idx + 1 开始的。
  3. 逐个分析 sent 中的单词(比如 sent=“快速 狐狸”,先分析"快速",再分析"狐狸")。
  4. 对于 sent 中的每个单词(比如"狐狸"):
    a. 它会估算这个单词(“狐狸”)自己会被分词器拆成多少个小片段(token)。
    b. 然后,它会在完整token序列中,从当前 cursor 指向的位置开始,数出那么多小片段,并将这些小片段的位置编号记录下来,与"狐狸"这个词(通过nlp分析得到的ID)关联起来存到 id_map
    c. 移动 cursor,让它指向下一个词在完整token序列中的起始位置。
    d. 同时判断"狐狸"是不是一个重要的词(比如名词),如果是,就记录下来。
  5. 最终返回重要词的列表和这个 id_map

id_map 的作用:

id_map 构建了一个桥梁。它告诉你,原始短文本 sent 里的某一个词(比如“狐狸”),对应到了最终长文本(加了模板的那个)token序列中的哪几个具体的token位置。

例如:

  • start_idx 可能是 5 (表示模板前缀有6个token,索引0-5)。
  • cursor 初始为 6。
  • sent = “红 猫”
  • 第一个词 word.text = “红”。假设 tokenizer("红") (减1后) 算出来它占1个token。
    • temp = 6。cursor 变为 7。
    • id_map 记录:“红” -> [6]
  • 第二个词 word.text = “猫”。假设 tokenizer("猫") (减1后) 算出来它占1个token。
    • temp = 7。cursor 变为 8。
    • id_map 记录:“猫” -> [7]

这里的索引 67 都是在 text_input.input_ids[z] 这个最终的、包含了模板的token序列中的位置。

明确 text 是不带模板的原始输入,对于准确理解 start_idx 的作用以及 id_map 如何建立映射至关重要。这个函数就是巧妙地利用 start_idx 作为偏移量,将对原始短文本的分析结果,准确地“定位”到完整长文本的token序列中。

附9:为什么论文作者要用prompt的来处理refcoco中的原始文本再输入给VLP呢?不用prompt行不行?

将 RefCOCO 数据集中的原始文本(即指代表达式,referring expressions)通过“prompt”(提示)处理后再输入给视觉语言模型(VLP),这在很多情况下确实是一个常见且有效的做法。至于为什么以及是否可以不用 prompt,我们可以从以下几个方面来理解:

为什么研究者倾向于使用 Prompt?

  1. 对齐预训练数据的格式和分布 (Aligning with Pre-training Paradigms):

    • 很多 VLP 模型(如 CLIP, ALIGN, BLIP, CoCa 等)是在大规模的“图片-文本对”上进行预训练的。这些文本通常是完整的描述性语句(比如 “一只猫在垫子上睡觉”)或者相对结构化的图文说明。
    • RefCOCO 中的原始指代表达式通常是短语(例如 “红色的那辆车”, “左边第三个男人”)。直接将这些短语输入给 VLP,可能与模型在预训练阶段接触到的数据形式不太一致。
    • 通过设计合适的 prompt(例如,将原始文本 T 转换为 “A photo of T”“An image where you can see T”,或者更针对任务的 “Localize: T” 等),可以使输入文本的格式更接近 VLP 预训练时所见过的样本,从而更好地激活模型已经学习到的知识和能力。
    • 通过 Prompt,可以将这些短语包装成更接近模型预训练时看到的句子结构。例如,可以将 “红色的那辆车” 转换为 “这张图片中,我指的是:红色的那辆车。” 或者 “定位:红色的那辆车。” 这样做有助于模型更好地理解任务,并激活在预训练阶段学到的相关知识。
  2. 明确任务指令 (Task Specification):

    • VLP 模型通常是多面手,可以执行多种视觉语言任务(如图像描述、视觉问答、图文匹配等)。
    • Prompt 可以清晰地告诉模型当前需要执行的具体任务是指代理解(referring expression comprehension/grounding)。例如,使用 “找到图中描述为 ‘{}’ 的物体” 这样的模板,其中 {} 用 RefCOCO 的原始文本替换。
    • 不同的任务可能需要模型关注文本的不同方面或以不同的方式处理文本。Prompt 可以作为一种明确的指令,引导 VLP 模型专注于当前任务的核心目标。例如,对于 GroundVLP 中使用 GradCAM 生成热图的部分,其依赖于图像-文本匹配(Image-Text Matching, ITM)的得分。Prompt 可以帮助优化 ITM 头判断图像区域与给定文本(经过 prompt 处理后)的匹配程度,从而产生更精确的热图。
    • 这有助于模型将注意力集中在定位物体上,而不是生成描述或回答问题。
  3. 提升模型性能和泛化性 (Improving Performance and Generalization):

    • 对于一些强大的预训练模型(尤其是那些基于 Transformer 并且具有一定指令遵循能力或者是在图文匹配任务上训练的模型),合适的 prompt 可以显著激活它们在下游任务(如 RefCOCO)上的零样本(zero-shot)或少样本(few-shot)学习能力。
    • Prompt Engineering 本身就是一门学问,好的 prompt 设计能引导模型产生更准确的输出。
  4. 利用模型的语言理解能力 (Leveraging Language Understanding Capabilities):

    • 通过将指代表达式嵌入到一个更完整的句子或问题结构中,模型可以更好地利用其强大的语言理解能力来解析表达式的细微差别和上下文依赖关系。
    • 例如,对于复杂的指代,如 “穿着和旁边女孩一样颜色衣服的男孩”,prompt 提供的句法结构可能有助于模型分解和理解这个表达。
  5. 上下文信息的补充 (Adding Contextual Information):

    • 虽然 RefCOCO 的指代表达式本身已经提供了定位所需的信息,但 prompt 模板有时也能提供一些微弱但有益的上下文。例如,“A photo of {}” 这样的模板虽然简单,但也为指代表达式提供了一个“这是一张照片中内容”的语境。

不用 Prompt 行不行?

理论上是可行的,并且在某些情况下确实是这么做的,但这取决于模型的架构和训练方式:

  1. 专门为指代理解设计的模型:

    • 有些模型的架构是专门为指代理解任务从头开始设计或进行深度定制的。这类模型可能不需要显式的自然语言 prompt。它们可能有特定的模块直接接收指代表达式(作为文本特征)和图像特征,并通过特定的机制(如注意力、融合模块)来关联它们并输出定位结果(如边界框坐标)。
    • 在这种情况下,任务指令是“硬编码”在模型结构和训练目标中的。
  2. Fine-tuning 阶段:

    • 即使一个 VLP 模型在预训练时见过更完整的句子,如果在 RefCOCO 数据集上进行 fine-tuning(微调)时,研究者也可以选择直接使用原始的指代表达式作为输入,而不加任何 prompt。
    • 通过在大量的 RefCOCO <图像, 指代表达式, 目标物体> 样本上进行训练,模型可以逐渐学会理解这些(可能是较短的)指代表达式,并直接将其与图像区域对应起来。此时,模型通过学习数据本身的分布来适应任务。
  3. 模型输入方式的差异:

    • 某些模型可能将文本输入视为一种“查询”,图像特征作为一种“知识库”,模型学习如何用查询在知识库中检索。这种情况下,原始指代表达式本身就可以作为查询。

总结与权衡:

  • 使用 Prompt 的优势:

    • 更好地利用大规模预训练模型的现有能力,尤其是在零样本/少样本场景下。
    • 可能使模型对任务的理解更清晰。
    • 有时能带来性能提升,使输入更符合模型“期望”的格式。
    • Prompt 可以为不同长度和结构的原始文本提供一个相对统一的输入框架,有时也有助于减少文本本身的歧义性,让VLP模型的解读更加一致。
  • 不用 Prompt 的可能:

    • 对于专门设计的模型或在特定任务上充分 fine-tuning 的模型是可行的。
    • 可以简化输入处理流程。
    • 可能导致输入与预训练数据分布不匹配,模型也可能没有得到清晰的任务指引。最终生成的特征或热图质量可能会受到影响,进而影响定位的准确性。

为什么研究者选择使用 Prompt 模板?

许多视觉语言任务中,研究者通过实验发现,合适的 prompt 工程(prompt engineering)能够显著提升模型的性能。这已经成为使用大型预训练模型的一个标准实践。他们可能发现:

  • 他们所使用的特定 VLP 模型在使用 prompt 时表现更好。
  • 他们的研究重点可能在于探索如何通过 prompt 来激发大型预训练模型的潜力。
  • 他们希望建立一个更通用的框架,通过改变 prompt 来适应不同的视觉语言任务,而不仅仅是指代理解。

在 GroundVLP 的论文中,他们利用 VLP 模型(如 ALBEF)的 ITM 头配合 GradCAM 来生成热图。这类模型对于输入文本的细微变化可能比较敏感,使用精心设计的 prompt 是确保模型发挥最佳性能、准确理解文本意图并将其与视觉内容正确关联起来的常用且有效手段。因此,虽然直接输入原始文本是可能的,但为了追求更好的效果和更鲁棒的性能,研究者通常会投入精力设计和优化针对特定任务和特定VLP模型的 prompt。

附10:文章中 using predicted category 和 using ground-truth category 这俩种设置的区别是什么?

using predicted category” 和 “using ground-truth category” 这两种设置的主要区别在于目标物体类别信息的来源不同,这会直接影响后续模型的处理流程和最终性能。

具体区别如下:

Using ground-truth category (使用真实类别)
  • 类别来源:直接使用资料集(如 RefCOCO/+/g)中已经标注好的、最准确的物体类别。这代表了在理想情况下,使用者能够精确提供希望寻找的物体类别。
  • 模拟场景:这种设置旨在模拟真实世界应用中,用户心中已有明确目标类别并能准确输入该类别信息的场景。
  • 目的:主要用于评估模型在获得了精确类别提示下的最佳性能,并与一些监督式学习模型进行比较。
  • 性能:通常情况下,使用真实类别的表现会更好,因为它为模型提供了最准确的初始信息,有效缩小了候选框的范围。
Using predicted category (使用预测类别)
  • 类别来源:当没有现成的真实类别可用时,模型会通过自然语言处理(NLP)工具(如 Stanza)来分析输入的查询语句(expression),并从中自动提取或预测出目标物体的类别。
    • 提取方法:该论文的方法是先生成查询语句的依赖关系树,然后将最左下方名词短语(NP)节点的最右边的普通名词(NN)节点作为预测类别。例如,在查询“a red and white checkered table with two wooden chairs”中,模型会提取出“table”作为目标类别。
  • 模拟场景:这更贴近于全自动化的真实应用场景,即系统需要独立理解自然语言查询,无需人工提供额外的类别标签。
  • 目的:测试模型的泛化能力和在更真实、更具挑战性场景下的实用性。
  • 性能
    • 由于自然语言的复杂性,这种设置的性能会受到预测准确度的影响,通常低于使用真实类别的性能。
    • 性能下降原因
      1. 目标不明确:查询语句中的目标词可能无法精确对应到实际物体类别。例如,查询“black hat”(黑帽子)实际指的是“戴着黑帽子的人”,但模型会提取出“hat”,导致后续无法正确定位到“person”。
      2. 语法不规范:口语化或不规范的语法,如“woman red coat”,可能导致NLP工具错误地将“coat”识别为核心目标,而不是“woman”。
      3. 查询中无目标:某些查询只包含空间信息(如“left”),完全没有可供提取的目标物体。

这两种设置代表了对模型在不同应用条件下的评估:

  • “using ground-truth category” 衡量的是模型在获得理想、精确类别信息下的上限性能。
  • “using predicted category” 衡量的是模型在自动化、真实语言理解场景下的实际表现和鲁棒性。

提取的类别信息主要输入到了开放词汇对象检测器 (Open-Vocabulary Object Detector, OVD) 中。

这么做的主要作用是:

  1. 生成候选框 (Candidate Boxes):OVD 会根据输入的类别,在图像中检测出所有属于该类别的物体实例,并生成对应的边界框 (bounding boxes) 和置信度分数。

  2. 缩小搜索范围,减少噪声:这是最关键的作用。视觉语言模型 (VLP) 通过 GradCAM 生成的热力图可能范围很广,而直接在整张图上搜索或使用所有候选框会引入大量无关的“噪声”。通过预先指定类别,模型可以只关注与该类别相关的物体,从而大大减少候选框的数量。这简化了后续的匹配和选择过程。

附11:关于“预测类别 (predicted category)”的“映射 (mapping)”过程的来龙去脉和细节

为什么需要进行映射?

这个映射过程主要是为了解决一个核心问题:NLP工具从自然语言查询中提取出的类别词(例如 “table”),与评测数据集官方定义的类别词(例如 “dining table”)可能不完全一致

如果不进行映射,直接使用提取出的“table”去物体检测器(OVD)中搜索,可能会因为词汇不匹配而找不到任何物体,或者找到了不相关的物体,从而导致评测失败。因此,需要一个机制将“预测类别”转换或“映射”到评测数据集的“标准类别词汇表”中,以确保后续步骤能顺利进行。

如何实现映射?

该论文采用了一种基于CLIP模型的语义相似度匹配方法来完成这个映射过程。整个流程可以分解为以下几个步骤:

1. 提取初始类别 (Category Extraction)
  • 首先,模型使用一个NLP工具(论文中提到的是Stanza)来分析查询语句的语法结构(依赖关系树)。
  • 它会定位到语法树中特定位置的名词作为预测类别( c p c^p cp)。
  • 例如,对于查询 “a red and white checkered table with two wooden chairs”,模型会提取出 “table”。
2. 利用CLIP进行语义嵌入 (Semantic Embedding)
  • 这是映射技术的核心。模型使用预训练好的CLIP模型,将预测出的类别词(如 “table”)和数据集中所有可能的标准类别词 c i c_i ci,例如COCO词汇表中的 “person”, “car”, “dining table” 等)分别转换成高维度的数学向量(嵌入)。
  • 一个关键细节是,在进行嵌入之前,模型会为每个词加上一个标准化的前缀提示语 “a photo of”。例如,它会分别计算 “a photo of table” 和 “a photo of dining table” 的向量。这有助于CLIP更好地理解这是一个物体的概念,从而生成更准确的向量表示。
3. 计算相似度并选择最佳匹配 (Similarity Calculation & Selection)
  • 在同一个语义空间中,模型会计算预测类别向量 ( e p e^p ep) 与数据集中每个标准类别向量 e c i e_{c_i} eci)之间的相似度。
  • 论文中使用了点积(dot product)并通过Softmax函数将其转换为概率分布,这个概率代表了预测类别 c p c^p cp被映射到某个标准类别 c i c_i ci的可能性。
  • 最后,模型会选择相似度得分最高的那个标准类别作为最终的映射结果( c m a p c^{map} cmap)。
示例:
  • 预测类别 c p c^p cp 是 “table”。
  • 计算 “a photo of table” 的向量。
  • 计算COCO词汇表中所有类别的向量,如 “a photo of chair”, “a photo of dining table” 等。
  • 通过比较相似度,模型发现 “a photo of table” 的向量与 “a photo of dining table” 的向量最接近。
  • 因此,预测类别 “table” 被成功映射为标准类别 “dining table”。
应用场景

值得注意的是,这个映射过程并非在所有情况下都会使用

  • 对于RefCOCO/+/g数据集:该过程是必须的,因为评测标准严格依赖于COCO数据集的官方类别词汇表。因此,预测出的类别必须被映射到COCO类别中。
  • 对于Flickr30k实体数据集:论文中提到,他们直接使用了预测出的类别,而没有进行映射。这是因为Flickr30k的类别定义本身比较抽象(如 “people”, “clothing”, “animals” 等),直接使用NLP提取的词可能效果更好。
总结

综上所述,这个映射机制通过利用CLIP强大的图文语义理解能力,巧妙地解决了自然语言中的口语化、同义词等问题与评测数据集的标准化类别之间的鸿沟,是模型能够处理更自由的自然语言输入并取得良好表现的关键技术之一。

附12:为什么Flickr30k不用映射而RefCOCO需要映射(评测数据集官方定义的标准类别词汇表)

1. 论文的直接陈述

论文在解释为什么对两种数据集采取不同策略时,直接将原因归结于类别的抽象性,而非任务类型。

  • 对于Flickr30k(PG任务,定位多个目标),论文明确写道:“……鉴于其真实类别稍微抽象,我们直接使用预测出的类别。” 脚注中进一步列出了这些抽象类别:“people, clothing, bodyparts, animals……”
  • 对于RefCOCO(REC任务,定位单个目标),论文的说法是:“……我们将提取出的预测类别映射到COCO的类别词汇表,以符合其真实类别。”

论文从未提及“因为是REC任务所以需要映射”或“因为是PG任务所以不需要映射”。它给出的唯一直接理由就是Flickr30k的类别太“抽象”。

2. 用一个思想实验来验证核心逻辑

我们可以通过一个思想实验来判断哪个是更根本的原因:

情况一:假设有一个新的REC(单目标)数据集,但它的官方类别和Flickr30k一样是“抽象”的。
  • 查询是:“左边那个穿红衣服的小女孩”。NLP提取出“女孩”。
  • 如果我们遵循“REC任务需要映射”的逻辑,我们会把“女孩”映射到抽象的“people”类别。这样一来,我们就丢失了“女孩”这个关键信息,指令的有效性反而降低了。
  • 在这种情况下,最优策略显然还是不映射,直接使用“女孩”这个词。这证明了,即使是REC任务,当目标词表是抽象的时候,不映射也是更优的选择。
情况二:假设有一个新的PG(多目标)数据集,但它的官方类别和COCO一样是“具体”的。
  • 查询是:“穿红衣的女士和穿蓝衣的男孩”。NLP提取出“女士”和“男孩”。
  • 如果遵循“PG任务不需要映射”的逻辑,我们会直接使用“女士”和“男孩”。这固然可行。
  • 但如果我们遵循“对齐具体词表”的逻辑,将“女士”和“男孩”都映射到标准的“person”类别,也同样合理。因为“person”是一个具体的类别,后续模型可以利用“穿红衣”、“穿蓝衣”等其他上下文信息来区分这两个“person”实例。
结论

任务类型(REC/PG)与处理策略(映射/不映射)在这篇论文的实验中恰好形成了对应关系

然而,驱动这个决策的、更底层的核心逻辑,并非任务是找一个还是找多个目标,而是如何最大化指令的「信息保真度」

  • 在RefCOCO上,“映射”是为了将多样化的口语化表达对齐到一个同样具体的标准化词汇上,这是在增加信息的有效性
  • 在Flickr30k上,“映射”会将一个具体的词稀释成一个抽象的类别,这是在损失信息的有效性,所以不映射。

Flickr30k 不用映射而 RefCOCO 需要映射,其核心逻辑在于 “信息保真度”“指令的有效性”

简单来说,处理的最终目标都是为了给后续的开放词汇对象检测器(OVD)一个 尽可能精确、有用的指令 来缩小搜索范围。两种数据集的类别定义特性,决定了“映射”这个操作在不同场景下扮演着完全相反的角色。

RefCOCO:映射是为了「提升指令的精确性与鲁棒性」
  1. 问题:用户语言多样,但目标类别是统一且具体的。

    • 用户在描述时可能会用不同的词,例如“the guy”、“the lady”、“the child”、“the man”。NLP工具会提取出“guy”、“lady”、“child”等不同的词。
    • 然而,在RefCOCO所依赖的COCO数据集中,这些对象都属于同一个具体、标准的类别:“person”。
  2. 映射的作用:多对一的“标准化”。

    • 通过映射,可以将“guy”、“lady”、“child”等各种非标准的、口语化的表达,全部统一到“person”这个标准类别上。
    • 这个“标准化”过程是有益的,因为目标类别“person”本身是一个非常具体、有意义的指令。告诉检测器去寻找“person”,是一个清晰、有效的任务。
  3. 核心逻辑:对齐到“具体”的词汇表。

    • 在这里,映射操作是在用一个标准的、具体的类别(person)去对齐用户多样化的自然语言输入。这增强了系统的鲁棒性(能理解各种说法),同时保证了给检测器的指令是精确的。
Flickr30k:不映射是为了「避免信息的严重损失」
  1. 问题:查询语言是具体的,但目标类别是模糊、抽象的。

    • Flickr30k的查询语句通常很具体,例如“A little girl climbing the stairs…”,NLP工具可以从中提取出非常精确的词,如“girl”。
    • 然而,Flickr30k的官方类别定义却非常抽象和高层,如“people”、“clothing”、“animals”等。
  2. 映射的危害:信息被“稀释”。

    • 如果强制把提取出的具体名词“girl”映射到Flickr30k的类别词汇表,它最匹配的类别将是“people”。
    • 这时,给检测器的指令就从“找到那个女孩”变成了“找到所有的人”。如果图片里还有其他人,那么关键的区分信息(“女孩”)就完全丢失了。这个映射过程导致了严重的信息损失
  3. 核心逻辑:保留原始的“具体”信息。

    • 因此,对于Flickr30k,最有效的策略是不进行映射,直接把NLP提取出的具体名词(如“girl”)作为指令交给开放词汇检测器(OVD)。
    • OVD能够理解“girl”这种开放词汇的含义,并直接在图像中寻找“女孩”。这最大程度地保留了原始查询中的精确信息,从而实现了更有效的候选框筛选。
总结对比
场景 (Scenario)RefCOCO(需要映射)Flickr30k(不需映射)
查询与类别关系查询词多样,但目标类别具体且统一查询词具体,但目标类别抽象且宽泛
映射操作的角色有益的标准化:将多种说法统一到一个精确的指令上。有害的信息稀释:将精确的细节合并到一个模糊的类别中。
最终给检测器的指令映射后的标准词,如“person”。NLP提取的原始词,如“girl”。
核心逻辑对齐具体词汇(Align to a Specific Vocabulary)避免信息损失(Avoid Information Loss)

附13:泛化性(Generalization)

什么叫泛化性(Generalization)

在机器学习领域,「泛化性」指的是 一个模型在从未见过的新数据上表现良好的能力

可以把它想象成一个学生学习数学的过程:

  • 没有泛化性(死记硬背):学生只会做练习册上出现过一模一样的题目。如果考试时数字或题型稍微变换一下,他就完全不会了。这代表他只是“记住”了答案,没有学到解题的根本方法。
  • 有泛化性(举一反三):学生通过练习掌握了核心的数学公式和逻辑。因此,无论考试题目怎么变化,只要核心概念不变,他都能运用已学知识解决新问题。

一个模型的泛化性越好,代表它学到的不是训练数据的表面特征,而是数据背后更深层次的、普适的规律和模式。

学习适应更广泛领域和场景的能力是什么意思?

这句话是「泛化性」在视觉定位这个具体任务上的体现。它指的是模型不应该只在与训练数据高度相似的图像和文本上工作,而应该能应对更多样化、更复杂的现实世界情况。

更广泛的领域(Broader Domain)

指的是数据的内容和类型。例如,如果一个模型主要用包含日常家居和街道场景RefCOCO 数据集训练,那么它的「领域」就比较窄。一个具备良好适应能力的模型,除了能处理家居和街道,还应该能理解医学影像、艺术画作、动漫截图、历史照片、特定商品等千变万化的图像领域,以及描述这些领域的专有词汇。

更广泛的场景(Broader Scenarios)

指的是任务的复杂度和上下文

  • 语言场景:不仅能理解“左边的猫”这种简单描述,还能处理包含多个对象、复杂空间关系、动作状态和抽象概念的长句,例如“那只正准备从沙发上跳下来追赶红色毛线球的白猫”。
  • 视觉场景:不仅能处理物体清晰、背景干净的简单图像,还能应对物体互相遮挡、光线昏暗、视角奇特、背景极其杂乱的复杂视觉环境。
这篇论文中提到的「泛化性」具体指什么?

在这篇论文中,作者提到的「泛化性」受限,特指由视觉定位(Visual Grounding)专用标注数据的局限性所导致的问题

核心论点是:

  1. 问题来源:视觉定位的专用数据集(如 RefCOCO 等)虽然质量高,但规模非常有限(约 22 万张图像)。这导致在这些数据集上训练的模型,其“眼界”和“知识”被限制在了这 22 万张图片所覆盖的物体、场景和语言风格中。
  2. 泛化性受限的体现:当这个模型遇到一个从未在训练集中出现过的新物体(比如一个罕见品牌的标志),或者一种新颖的描述方式时,它很可能会失败。这就是因为它缺乏泛化能力,无法将从有限数据中学到的知识应用到这个「更广泛的领域」之外。
  3. GroundVLP 的解决方案:作者提出的 GroundVLP 方法,其核心目的就是为了提升泛化性。它不直接在这些有限的视觉定位数据集上训练,而是巧妙地利用了在规模大几个数量级的数据集(如包含 62 亿图文对的 LAION)上训练好的 VLP 和 OVD 模型。因为这些基础模型见过了几十亿级别的、来自真实世界的、各种各样的数据,所以它们本身就具备了极强的泛化能力GroundVLP 通过融合它们的能力,从而让视觉定位这个任务也能享受到这种强大的泛化性,不再受制于那 22 万张图片的狭小“领域”。
### 论文精读与实验复现的方法 #### 方法概述 论文精读和实验复现是深入理解研究工作的重要手段。在IT领域,这种方法不仅有助于掌握技术细节,还能培养批判性思维能力以及实际动手能力。以下是针对论文精读和实验复现的具体方法。 --- #### 一、论文精读的核心步骤 1. **快速浏览全文** 阅读摘要、引言和结论部分,了解论文的研究背景、主要贡献和技术框架[^1]。这一步的目标是形成对整篇论文的大致印象。 2. **逐节细读** 对于任务规划模块或其他核心章节,仔细阅读其理论推导、算法设计和实验设置等内容。注意作者提到的局限性和未来工作的方向[^1]。如果发现某些方面未被充分讨论(如参数影响或任务依赖关系),可以记录下来作为后续探索的方向。 3. **绘制结构图** 使用流程图或者概念地图的方式整理出论文的技术路线及其组成部分之间的逻辑联系[^2]。这种可视化工具能够帮助记忆复杂的信息流,并便于与其他相关工作对比分析。 4. **质疑与思考** 提问自己几个关键问题:为什么选择了特定的方法?是否存在其他可能更优的选择?数据集选取是否合理?评价指标是否有偏倚等问题[^3]? --- #### 二、实验复现的关键环节 1. **环境搭建** 根据论文描述准备所需的软件库版本号、硬件配置需求等基础条件。很多时候官方开源代码附带详细的安装指南可以帮助加速此阶段进程[^2]。 2. **重现基线结果** 尝试按照文中提供的超参设定运行原始模型得到接近原作报告数值的表现水平。这是验证个人实现正确性的第一步也是最重要的一步[^1]。 3. **修改与优化** 基于自己的理解和前期提出的疑问尝试调整网络架构、损失函数定义甚至整个训练策略等方面的内容看能否进一步提升性能表现或是解决之前指出的一些不足之处例如增加对于不同类型输入适应性强弱测试等等[^3]。 4. **撰写总结文档** 不仅要记录下成功再现的结果也要包括失败案例的原因剖析这样既有利于自我反思也方便日后查阅参考资料时迅速定位重要知识点[^2]. --- #### 示例代码片段展示如何加载预训练权重文件(以PyTorch为例) ```python import torch def load_pretrained_weights(model, path_to_checkpoint): checkpoint = torch.load(path_to_checkpoint) model.load_state_dict(checkpoint['model']) epoch = checkpoint.get('epoch', None) loss = checkpoint.get('loss', None) return model, epoch, loss ``` 上述代码展示了怎样从磁盘上的checkpoint恢复先前保存的状态以便继续训练或者是直接用于推理模式下的预测操作[^2]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

frostmelody

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值