LDVC

创新点

视觉共识:路由注意力。视觉特征离散,容易出现较多碎片化掩码。
文本驱动视觉:文本作为查询。视觉特征不够结构化,应该让视觉特征对齐文本。
在这里插入图片描述

动机

  • 之前的工作仍然有对不可见类的过拟合
  • 这归咎于解码器的不合理设计:解码器使用文本嵌入进行查询,不适合零样本任务。因为视觉空间相比文本并不足够结构化用于分割。
  • 让文本嵌入对齐视觉嵌入,会造成较大的嵌入空间迁移,损害分割性能
    在这里插入图片描述

在这里插入图片描述

方法

视觉-语言提示

  • 就是视觉和语义编码器中都引入了提示token
  • 初始化时,视觉提示与VPT中的初始化形式一样
  • 对文本侧,作者还做了一个关键 trick:用“手工 prompt 模板”的中间层特征来初始化ep(i)e_p^{(i)}ep(i),比如把 “a photo of a {class}” 送入预训练 CLIP 文本编码器,取各层中 template token 的 embeddings 作为初始化,比随机高斯初始化效果好很多。

在这里插入图片描述
在这里插入图片描述

文本适配器

  • 将关系描述符表达为文本适配器,与ZegCLIP完全一致,毫无区别

在这里插入图片描述

视觉共识解码器

总体流程

  • VjV_jVj视觉编码器中的某一层输出作者好像没有具体给出j的取值?
    在这里插入图片描述
    在这里插入图片描述

视觉共识自注意力

  • 基于路由注意力的机制
  • 简单来说就是关注图片中相关的区域,例如“草”的区域关注“草”的区域。
  • 首先要对图像窗口化,然后计算注意力权重保留权重高的窗口,还原得到高度相关的KsK_sKsVsV_sVs(只有部分patch)
    在这里插入图片描述

掩码产生机制

  • 掩码产生机制几乎完全一样
    在这里插入图片描述

实验

对比实验

  • 在归纳设置下,可见类和不可见类都有一定提升
  • 在转导设置下,几乎没有任何有效提升
    在这里插入图片描述
    在这里插入图片描述

消融实验

  • 交叉注意力图可以学习一下。
    在这里插入图片描述

在这里插入图片描述

GPT总结

  1. 摘要翻译

预训练视觉-语言模型(如 CLIP)通过在 transformer 解码器中将视觉特征与类别嵌入对齐来生成语义掩码,从而推动了零样本语义分割的发展。然而,这一范式下现有方法仍然存在两个问题:在已见类别上过拟合以及分割掩码出现小碎块。为缓解这些问题,作者提出了一种语言驱动的视觉共识(Language-Driven Visual Consensus, LDVC)方法,以促进视觉与语言信息的更好对齐。具体地,他们利用类别嵌入的离散且抽象的特性,将其视为锚点,引导视觉特征向类别嵌入靠拢。为了获得更加紧凑的视觉空间,他们在 transformer 解码器中引入了**路径注意力(route attention)**来寻找视觉共识,从而提升同一物体内部的语义一致性。配合一种视觉-语言提示策略,该方法显著提升了分割模型在未见类别上的泛化能力。实验结果表明,与最新方法相比,该方法在 PASCAL VOC 2012 和 COCO-Stuff 164K 数据集的未见类别上分别提升了 4.5% 和 3.6% 的 mIoU。


1. 方法动机

1.a 为什么要提出这个方法?

一阶段 CLIP-based ZS3(如 ZegCLIP)已经能把 CLIP 的图像级零样本能力迁移到像素级,但仍有两个关键痛点:

  1. 过拟合已见类别

    • 训练时只有已见类标签,解码器不断把“视觉空间”/“文本空间”往训练类别方向挤,未见类的判别边界被破坏,推理时泛化能力变差。
  2. 掩码“小碎块”(fragmentation)严重

    • 同一物体内部像素的特征不够一致,导致解码器在同一个物体里划出一堆零散的小块,视觉效果差、mIoU 也受影响。

作者认为:关键不只是用 CLIP,而是“怎么在像素层面对齐视觉与文本空间、调谁的空间”。之前方法主要动的是“类嵌入空间”;他们则想反过来——尽量固定文本空间,用文本去“拉拢”视觉空间。再加上在视觉特征内部做“语义聚类”,减少碎块。

1.b 现有方法的痛点/不足

以 ZegCLIP 为代表的一阶段方法,大多:

  • 解码器设计

    • 用“类嵌入(文本)做 query,图像特征做 key/value” 的 cross-attention(基本沿用 SegViT / MaskFormer 风格)。
    • cross-attention 主要更新的是类嵌入 T,视觉特征 V 几乎不动。
  • 问题 1:类嵌入漂移(class embedding drift)

    • 文本空间原本在 CLIP 上已经对 ImageNet 等数据集具有很好泛化。
    • 训练时反复用噪声较大的视觉特征去“牵引”类嵌入,使得文本空间严重变形,破坏了 CLIP 原本良好的零样本结构(Fig.1 右侧示意)。
  • 问题 2:视觉空间不够结构化

    • 视觉特征冗余、噪声大,同一物体内部的像素点在特征空间并不紧凑——掩码容易碎。
    • 解码器几乎不改变视觉空间结构,导致 pixel–text 对齐变得困难。

1.c 论文的研究直觉 / 假设

作者的核心直觉可以概括为三点:

  1. 语言空间更抽象、更结构化
    → CLIP 文本编码器输出的类别嵌入,可以被视作视觉聚类中心(anchors)。

  2. 应该让视觉特征“向文本靠拢”,而不是反过来拉文本
    → 在 cross-attention 中以图像特征为查询、以类别嵌入为键和值,更新的是视觉特征,把视觉投射到由类嵌入张成的低秩空间中。

  3. 在对齐文本之前,先在视觉内部“达成共识”
    → 用 route attention 做局部/块级自注意力,强制同一物体内部的像素更多地互相关注,使得视觉特征域更紧凑,减少小碎块。


2. 方法设计(pipeline + 结构 + 公式)

整体架构见 Fig.2:上半部分是插入视觉 prompts 的图像编码器,下半部分是插入语言 prompts 的文本编码器,右侧是 Text Adapter + Visual Consensus Transformer Decoder(VCTD)。

我按“输入→编码→适配→解码→输出”五步讲,并穿插矩阵维度。

2.a 总体流程

记号:

  • 输入图像:(I \in \mathbb{R}^{H\times W \times 3})

  • 视觉编码器输出:

    • 稠密特征:(V_l \in \mathbb{R}^{h\times w \times d})
    • 多层中间特征:({V_j}_{j=1}^N),其中每个 (V_j \in \mathbb{R}^{h\times w \times d})(或尺度相近)
    • 全局特征:(V_g \in \mathbb{R}^{d})([CLS])
  • 文本编码器输出:

    • 类别嵌入:(T \in \mathbb{R}^{c\times d})(c 是类数)
  • 解码器最终输出:

    • logits:(S \in \mathbb{R}^{c \times h \times w})

第一步:带视觉/语言提示的 CLIP 编码

1)在每层 transformer 中插入深度 prompts

对任一层 (i),该层的输入序列拆成三部分:

[
e^{(i)} = [e_p^{(i)}; e_c^{(i)}; e_g^{(i)}]
]

  • (e_p^{(i)}):这一层的可学习 prompt token(视觉或语言)

  • (e_c^{(i)}):内容 token

    • 视觉侧:patch tokens(像素块)
    • 文本侧:词级 token,包括 class name 的词
  • (e_g^{(i)}):全局 token

    • 视觉侧:[CLS],代表整图
    • 文本侧:[EOS],代表整句

经过第 i 层 transformer:

[
[_;,e_c{(i)};,e_g{(i)}] = L_i([e_p^{(i-1)}; e_c^{(i-1)}; e_g^{(i-1)}])
]

  • 训练时 冻结所有 L_i 的参数,只更新每层的 e_p^{(i)}
  • 对文本侧,作者还做了一个关键 trick:用“手工 prompt 模板”的中间层特征来初始化 e_p^{(i)},比如把 “a photo of a {class}” 送入预训练 CLIP 文本编码器,取各层中 template token 的 embeddings 作为初始化,比随机高斯初始化效果好很多(表 IX 在 unseen 上 +4.5 mIoU)。

维度:

  • 视觉侧:假设 patch 数量为 (L = h\cdot w),视觉 prompt 长度为 (P_v),则每层输入长度为 (P_v + L + 1)(+1 是 CLS)。
  • 文本侧:假设文本 token 长度为 (L_t),语言 prompt 长度为 (P_t),则每层长度为 (P_t + L_t + 1)(+1 是 EOS)。

2)得到最终编码结果

  • 视觉 encoder:

    • 最后一层 patch tokens reshape 成 (V_l \in \mathbb{R}^{h\times w\times d})。
    • 每一层对应的特征记作 (V_j) 供后续多层融合。
    • CLS token 作为 (V_g \in \mathbb{R}^d)。
  • 文本 encoder:

    • 每个类别名对应一条文本(带模板 + prompt),取其 [EOS] 或聚合后的向量作为类嵌入:(T \in \mathbb{R}^{c\times d})。

第二步:Text Adapter 融合图像全局信息与类别嵌入

在对像素做对齐之前,作者先用全图的视觉信息 (V_g) 对类嵌入 T 做一次“调味”:

[
T_{\text{new}} = \text{Proj}([T \odot V_g;,T]) \tag{3}
]

  • (T \odot V_g):广播逐元素乘,形状还是 (c \times d)。
  • ([T \odot V_g; T]):在通道维 concat,得到 (c \times 2d)。
  • Proj:线性层 (\mathbb{R}{2d}\to\mathbb{R}d),输出 (T_{\text{new}} \in \mathbb{R}^{c\times d})。

直观理解:每个类嵌入在不大幅变形的前提下,稍微根据当前图像的全局特征做一下偏移,提高“图像特定(image-specific)”的判别力。


第三步:Visual Consensus Transformer Decoder (VCTD)

这是本文的核心创新:更新的是视觉特征 V,而 T_new 基本视作稳定的 anchor。每个 decoder block 由:

  1. 1×1 Conv 融合 CLIP 中间层特征(增强局部语义)
  2. Visual Consensus Self-Attention(VCSA:带 route attention 的 self-attention)
  3. Cross-Attention(Q 来自图像,K/V 来自类别)
  4. MLP

设:

  • 进入该 block 的图像特征为 (V_\text{in} \in \mathbb{R}^{h\times w\times d}),展平成 (L\times d)(L=h·w)。
  • 该 block 对应的 CLIP 中间特征为 (V_j),通过 1×1 Conv 调整通道数。

Block 内公式:

1)多尺度融合

[
V = V_{\text{in}} + \text{Conv}(V_j) \tag{4}
]

  • Conv 的输出与 V_in 尺寸相同(h×w×d),做逐元素相加,相当于引入高层或低层的语义/细节。

2)Visual Consensus Self-Attention (VCSA)

[
V = V + \text{VCSA}(\text{Norm}(V)) \tag{5}
]

VCSA 是一个带 route attention 的自注意力模块,目标是:让每个区域主要跟与它语义相关的少数几个区域互相注意,从而增强同物体内部的“一致性”

VCSA 的具体步骤(在空间上做窗口分组):

  • 对 (V_{\text{in}}) 做平均池化,窗口大小 n×n(文中用 n=4,相当于把 h×w 切成 8×8=64 个窗口):

    [
    V_w = \text{AvgPool}(V_{\text{in}}) \in \mathbb{R}^{\frac{h}{n}\times \frac{w}{n}\times d} \tag{8}
    ]

    展平为 (M \times d),M=64。

  • 线性变换得到 Q,K,V:

    [
    Q, K, V = \text{Chunk}(\text{Proj}(V_{\text{in}})) \tag{9}
    ]

    • Proj 把 d 映射到 3d,Chunk 按最后一维切成三个 (L\times d) 矩阵。
  • 计算窗口间相似度 & 选出每个窗口最相关的 m 个窗口(文中 m=16):

    [
    \text{ids} = \text{Topk}(V_w V_w^\top,m) \tag{10}
    ]

    • (V_w V_w^\top \in \mathbb{R}^{M\times M}) 是窗口间的 Cos 类似度(或点积),Topk 取每一行最大的 m 个索引。
  • 根据 ids,从全局 K,V 里 只取与这些窗口对应的 token

    [
    K_s, V_s = \text{Gather}(K,\text{ids}),\ \text{Gather}(V,\text{ids}) \tag{11}
    ]

  • 最后做局部化的自注意力:

    [
    O = \text{Softmax}\left( \frac{Q K_s^\top}{\sqrt d} \right) V_s \tag{12}
    ]

维度直觉:

  • 原始 self-attention 的注意力图是 (L\times L),复杂度 O(L²)。
  • Route attention 只在 m 个窗口(以及窗口内 token)上计算,既降低计算量,也约束了注意范围,类似“语义簇内的聚类”。

3)跨模态 Cross-Attention(视觉向文本靠拢)

[
V = V + \text{CA}(\text{Norm}(V),\text{Norm}(T_\text{new})) \tag{6}
]

  • Query:图像特征 (V \in \mathbb{R}^{L\times d})
  • Key / Value:类嵌入 (T_\text{new} \in \mathbb{R}^{c\times d})

标准 cross-attention:

[
\text{Attention}(Q,K,V) = \text{Softmax}\left(\frac{QK^\top}{\sqrt d}\right)V
]

关键点:

  • 每个像素的更新是若干类嵌入的线性组合。
  • 因为 c(类数)远小于 L(像素数),像素特征被压进一个 由类别向量张成的低秩子空间,这就是作者说的“更紧凑的视觉空间”。

4)MLP 残差

[
V_{\text{out}} = V + \text{MLP}(\text{Norm}(V)) \tag{7}
]

多层 decoder 堆叠后得到最终特征 (V_o)。


第四步:点积生成像素级 logits

最后一步非常“CLIP 风格”:

  • 把 (V_o \in \mathbb{R}^{h\times w\times d}) 展平为 (\mathbb{R}^{L\times d}) 并转置为 (d\times L)。
  • 类嵌入 (T_\text{new} \in \mathbb{R}^{c\times d})。
  • 做矩阵乘法:

[
S = T_\text{new} V_o^\top \in \mathbb{R}^{c\times L} \tag{13}
]

再 reshape 回 (c\times h\times w),得到每类每像素的 logits,即分割结果。


第五步:损失函数

损失是 Focal Loss + Dice Loss 的加权和

  • Focal loss(按像素、按类):

[
L_\text{focal} = -\frac{1}{HW}\sum_{i=1}^{HW} (1-y_i)^\gamma \log y_i \tag{14}
]

  • Dice loss:

[
L_\text{dice} = 1 - \frac{2\sum_i y_i \hat y_i}{\sum_i y_i^2 + \sum_i \hat y_i^2} \tag{15}
]

  • 总损失:

[
L_\text{seg} = \beta \cdot L_\text{focal} + L_\text{dice} \tag{16}
]

实现中 (\beta = 100.0),Dice 权重 1.0。


2.b 模块作用总结

  1. Vision/Text Encoders + Deep Prompts(VLPT)

    • 冻结 CLIP 主体,利用每层少量 prompt token 调整其行为,达到 “小改动,大收益” 的参数高效微调。
    • 视觉 prompt 负责让视觉特征更适合分割;语言 prompt 负责改写文本空间但尽量不破坏原有的类结构。
  2. Text Adapter

    • 用全局图像特征 (V_g) 轻微调节类嵌入,使其图像相关,更容易对齐 pixel 特征。
  3. Visual Consensus Self-Attention(VCSA)

    • 通过 route attention 只在“语义相近”的窗口间做自注意力,增强同一物体内部的特征一致性,抑制掩码碎片(Fig.4 可视化确实噪声更少)。
  4. Cross-Attention with Image as Query

    • 把像素特征拉向类别 anchors,在保证文本空间相对稳定的前提下,使视觉空间更“按类别分簇”。
  5. Dot-Product Segmentation Head

    • 简单点积,保持与原始 CLIP 兼容的对齐方式。

3. 与其他方法对比

3.a 与主流方法的本质差异

  1. 与两阶段方法(如 MaskCLIP 系、ZS3 baseline)

    • 两阶段:

      • 先用一个分割网络产生 class-agnostic masks。
      • 再用 CLIP 对每个 mask cropped 出来的图或特征做图像级分类。
      • 优点:几乎不改 CLIP,零样本能力强;缺点:推理成本高(每个 mask 一次 CLIP),而且 mask proposal 与 CLIP 解耦。
    • LDVC:

      • 一阶段 end-to-end,把 CLIP 的视觉/文本编码器 + 解码器合成一个体系。
      • 通过 VLPT + VCTD 兼顾 低推理开销和较强的 zero-shot 能力
  2. 与 ZegCLIP / SegViT 式一阶段方法

    主要差别有三:

    • Cross-Attention 方向相反

      • ZegCLIP:query = 类嵌入,key/value = 图像特征 → 更新 T,V 不变。
      • LDVC:query = 图像特征,key/value = 类嵌入 → 更新 V,T 近乎稳定。
    • 显式的“视觉共识”模块

      • ZegCLIP 解码器的 self-attention 是 vanilla,全局关注易引入噪声,物体内不够一致。
      • LDVC 在 self-attention 中加入 route attention,仅在少数相关窗口内做注意力,更像“语义簇内部 refine”。
    • 视觉 + 语言双侧深度 prompt 调节

      • ZegCLIP 主要侧重视觉 prompt;
      • LDVC 同时在视觉和语言侧做 deep prompt tuning,并提出利用手工模板来初始化语言 prompts。

3.b 创新点与贡献

  1. Language-Driven Visual Consensus Decoder(VCTD+VCSA)

    • 以类嵌入为 anchor,用 cross-attention 把像素特征投射到低秩类别空间;
    • 在 self-attention 内用 route attention 做“局部语义聚集”,缓解 mask 碎片。
  2. Vision-Language Prompt Tuning (VLPT) 在 ZS3 任务上的系统性使用

    • 深度视觉+语言 prompt;
    • 语言 prompt 的“pretrain”初始化策略实验证明显著有益。
  3. 在相对更少参数下取得更好的性能 & 数据效率

    • 只有 11M 可学习参数,却在全监督 COCO-Stuff 164K 上 mIoU 比 ZegCLIP 高 3.7 点。
    • 只用 60% 训练数据就能超过 ZegCLIP 用 100% 数据的表现(表 VI)。

3.c 适用范围

更适合的场景包括:

  • 开放类别、训练数据有限的分割任务

    • 如需要泛化到新类别的自动驾驶、机器人场景。
  • 希望在单阶段框架下兼顾精度与效率

    • 不想每个 mask 再跑一次 CLIP。
  • 已有 ViT-B CLIP 权重,希望做参数高效微调

    • 对显存限制和部署成本敏感的场景。

相对不那么合适的情况:

  • 类别完全固定、没有 zero-shot 需求,且可以全参数微调一个分割模型时,一些更重的全监督架构可能略优。
  • 对实时性极端敏感、硬件极弱的场景(虽然他们的 GFLOPs/FPS 比 ZegCLIP 略优,但毕竟 CLIP+Transformer 本身不算“极轻量级”)。

3.d 方法对比表(概略)

方法 解码器 cross-attn 方向 是否显式视觉聚类 微调方式 优点 缺点
两阶段 CLIP 无像素级 cross-attn 多为冻结 CLIP 零样本强、设计简单 推理慢、pipeline 解耦
ZegCLIP Text→Image(Q=T) 视觉 prompt 为主 一阶段、性能不错 类嵌入漂移,未见类泛化受损,小碎块
LDVC Image→Text(Q=V) 是(VCSA) 视觉+语言深度 prompt 未见类 mIoU 提升明显、掩码更干净、参数更少 结构稍复杂、实现成本更高

4. 实验表现与优势

4.a 如何验证有效性(实验设计)

  • 数据集:PASCAL VOC 2012、COCO-Stuff 164K(GZS3 设置),以及 COCO-Stuff 10K(全监督对比)。

  • 设置

    • Inductive GZS3:训练时未知 unseen 类名字,只在 seen 类上训练,测试时评估 seen+unseen。
    • Transductive GZS3:训练时已知 unseen 类名字,并加一轮 self-training。
    • Fully-supervised:所有类别都视作 seen,测上限。
  • 指标

    • mIoU(S)(seen 类)、mIoU(U)(unseen 类)、hIoU(调和平均)。
  • 基线:SPNet, ZS3, SIGN, ZegFormer, DeOP, SPT-SEG, Cascade-CLIP, ZegCLIP, ZegOT, MAFT 等。

4.b 关键结果(代表性数字)

Inductive GZS3(表 I):

  • VOC 2012:

    • ZegCLIP:mIoU(S)=91.9, mIoU(U)=77.8, hIoU=84.3
    • LDVC:mIoU(S)=92.5, mIoU(U)=82.3, hIoU=87.2
      → 未见类 +4.5,hIoU +2.9。
  • COCO-Stuff 164K:

    • ZegCLIP:mIoU(S)=40.1, mIoU(U)=41.4, hIoU=40.8
    • LDVC:mIoU(S)=43.2, mIoU(U)=45.0, hIoU=44.1
      → 未见类 +3.6,seen 也 +3.1,说明不是单纯“迁就 unseen”。

Transductive(表 II):

  • 在 COCO-Stuff 164K 上,带 self-training:

    • ZegCLIP+ST:mIoU(S)=40.6, mIoU(U)=59.9
    • LDVC+ST:mIoU(S)=41.1, mIoU(U)=60.3
      → 仍然有小幅提升,说明方法与自训练兼容。

Fully-supervised(表 III & IV):

  • COCO-Stuff 164K:

    • ZegOT:40.1
    • ZegCLIP:42.7
    • LDVC:46.4(参数量仅 11M,少于 ZegCLIP 的 14M 和 ZegOT 的 21M)
  • COCO-Stuff 10K:

    • ViT-B backbone 时,LDVC 优于 RWS;
    • ViT-L 时,性能接近 SegViT。

数据效率(表 VI):

  • 在 COCO-Stuff 164K:

    • ZegCLIP(100% 训练数据):mIoU(S)=40.2, mIoU(U)=41.4
    • LDVC(仅 60% 训练数据):mIoU(S)=42.1, mIoU(U)=43.1
      → 用更少数据达到更好性能,说明对数据更友好。

定性可视化(Fig.3 & Fig.4):

  • Fig.3:在 COCO-Stuff 验证集上,LDVC 比 ZegCLIP:

    • 能更好地区分 “road” vs “pavement”、“clouds” vs “sky-other”。
    • 未见类区域(红色标记类)预测更准确,边界更干净。
  • Fig.4:有 VCSA 时的 cross-attention map 噪声明显更少,聚焦在语义一致的区域。

4.c 优势最明显的场景/数据集

  • GZS3 的未见类别,尤其是 COCO-Stuff 164K 上的 stuff 类(如 road, grass, sky 等):

    • 这些类空间上大、形态多变、容易碎片化,VCSA 对减少碎片尤其有帮助。
  • 数据不足场景

    • 60% 数据仍优于 ZegCLIP 的 100%,说明对标注比例不那么敏感。

4.d 局限性与不足

论文显式或隐含的不足包括:

  1. 复杂度仍不算极低

    • 虽然比 ZegCLIP 参数更少,但依然要跑 CLIP ViT-B + 多层 decoder + 视觉/语言 prompts。
    • 对极端实时场景仍有挑战。
  2. 路由注意力引入了额外超参数

    • 需要设定窗口大小 n、选窗数 m,过大时退化成普通 self-attention、会带来性能下降(表 XII)。
  3. 依赖 CLIP 的文本空间质量

    • 方法假设 CLIP 文本空间已经很好;如果底层 VLM 较弱,类嵌入作为 anchor 的假设就会变弱。
  4. 论文未详细讨论 OOD 类/长尾类极端情况

    • 主实验还是在 VOC/COCO 这类相对标准的数据集上。

5. 学习与应用

5.a 是否开源 & 复现关键步骤

论文中只提到“基于 MMSegmentation 实现,使用 CLIP ViT-B 作为默认编码器”,正文没有明确 GitHub 链接

建议:实际复现时你可以搜索论文题目 + GitHub,看是否已经放出代码;没有的话就参考 ZegCLIP/DenseCLIP 的实现框架改。

复现的关键步骤:

  1. 选取公开 CLIP 权重(如 ViT-B/16)。

  2. 在视觉 & 语言 encoder 的每层插入深度 prompts,并冻结所有原始参数。

  3. 实现 Text Adapter:(T_\text{new} = \text{Proj}([T\odot V_g; T]))。

  4. 实现 VCTD:

    • 多层 block,每层做 Conv 融合 + VCSA + cross-attn + MLP。
    • 注意 cross-attn 的方向:Q=视觉,K/V=类嵌入。
  5. 最终用 (S = T_\text{new} V_o^\top) 得到 logits,按像素 softmax + Focal+Dice 训练。

5.b 重要超参数 & 训练细节建议

根据实现细节(Sec. IV.A.3 & Ablation):

  • Prompt 相关

    • 视觉 prompt 数量:VOC 每层 60 个,COCO 每层 100 个。

    • 语言 prompt 数量:每层 6 个(表 X 中 6 左右性能基本饱和)。

    • 语言 prompt 初始化:

      • 强烈建议用“模板句子”的中间层 embedding 初始化,而不是随机。
      • 模板如 “a cropped photo of a {}”, “this is a photo of a {}”, “a photo of a {} in the wild” 等。
  • VCTD 相关

    • decoder block 数:2 层即可,更多层对 unseen 类不一定更好(表 XI)。

    • route attention:

      • window size n=4 → 8×8 窗口;
      • 总窗口数 M=64;
      • 选窗数 m=16 或 32,性能类似;m 太大(如 48)会退化。
  • 优化与数据处理

    • 图像 crop 大小:训练和测试都用 512×512。
    • 优化器:AdamW,初始 lr=2e-4,多项式衰减。
    • 迭代次数:COCO-Stuff 164K 80k iter,VOC2012 20k iter。
    • 损失权重:Focal=100.0, Dice=1.0。

实践建议:

  • 先在小数据集(如 VOC)上跑通,再扩展到 COCO。
  • 可以先只实现“Image as Query + Class as KV 的 cross-attn”,不加 VCSA,验证方向改变带来的增益,再逐步加入 route attention。
  • 训练时预先算好所有类文本嵌入并缓存起来,推理时直接加载,可大幅下降 GFLOPs(论文中从 166 降到 71)。

5.c 迁移到其他任务的可行性

这个思想比较通用,尤其是两点:

  1. “文本 anchor 引导视觉特征”

    • 可迁移到:

      • 零样本实例分割 / panoptic segmentation:用实例级特征做 Q,类嵌入做 K/V。
      • 开放词汇检测:proposal feature 作为 Q,文本类嵌入为 K/V。
  2. “视觉共识” / route attention

    • 任何需要“同一对象 / 区域内部特征更一致”的 dense 预测任务都能受益:

      • 视频分割:在时空上做 route attention;
      • 深度估计 / 光流:在空间上聚集相似局部区域。

迁移时重点保持两点:

  • 把 task-specific 的 region / object 特征当作 query;
  • 保证文本/标签空间相对稳定,让其作为 anchor。

6. 总结

6.a 一句话概括核心思想(≤20 字)

用类别向量做锚点,重塑像素特征并增强局部一致性。

6.b 速记版 Pipeline(3–5 步,尽量用自明词)

  1. 把图像和类别名称同时送入一个图文模型,得到每个像素的向量和每个类别的向量。
  2. 用整张图的向量稍微调整每个类别向量,使其更贴合当前图像。
  3. 在像素向量内部先让语义相近的区域互相关注,使同一物体内部的向量更相似。
  4. 再让每个像素根据所有类别向量重新计算自己的表示,使它更靠近某些类别。
  5. 用类别向量与像素向量做点积,得到每个像素属于各个类别的分数,生成分割图。

如果你之后想针对某一块(比如只看“Image as Query”的 cross-attn,或者 VCSA 的 route attention)单独推公式/画简化示意图,我们也可以分段再深挖一遍。

下面我将针对你指定的部分 “根据 ids,从全局 K,V 里只取与这些窗口对应的 token”
进行 (1)矩阵维度分析 + (2)实现逻辑解释 + (3)用一个小型具体例子说明,让你真正理解 “route attention” 在 VCSA 中是怎样实现的。


✅ 一、先回顾上下文:VCSA(Visual Consensus Self-Attention)

在 VCSA 中,为了减少注意力范围(让注意力只在“语义相似的 window 里”),作者进行了:

  1. 将图像 token 进行窗口池化 → 得到 window-level 特征
  2. 计算窗口间相似度 → 得到相关窗口 top-k
  3. 对于每个 window,只从 K, V 中选出对应窗口的 token
  4. 用这些 token 做局部 self-attention(而不是全局 L×L)

你关心的是 步骤 3


✅ 二、矩阵维度分析(逐步拆解)

我们假设:

  • 输入视觉特征 flatten 后为
    [
    V_{\text{in}} \in \mathbb{R}^{L \times d}
    ]

例如:
H = 32, W = 32 → L = 1024
d = 768(CLIP ViT-B 维度)


1. 对视觉特征做窗口平均池化

作者设定窗口大小 n=4,于是:

  • 特征图 H=W=32 → 32/4=8
  • 总窗口数:
    [
    M = 8\times 8 = 64
    ]

得到 window 特征:

[
V_w \in \mathbb{R}^{M \times d} = 64 \times 768
]


2. 计算窗口间相似度

[
A = V_w V_w^\top \in \mathbb{R}^{64 \times 64}
]


3. Top-k 选择最相关窗口(论文默认 m=16)

对每个 window i,找到最相似的 16 个窗口:

[
\text{ids}[i] \in \mathbb{R}^{16}
]

所以最终

[
ids \in \mathbb{R}^{64 \times 16}
]


4. 全局 K,V 的维度

Q、K、V 都来自一次线性变换:

[
K, V \in \mathbb{R}^{L \times d} = 1024 \times 768
]


5. Gather:根据 ids,只取对应窗口内的 token

关键点:

❗ 每个 window 包含 (n\times n = 16) 个 token

因为窗口大小为 4×4。

因此:

  • 每个 window i 选到的 16 个“相关窗口”
  • 每个相关窗口有 16 个 token
    → 所以每个 window 最终要取 16 × 16 = 256 个 token 参与注意力。

矩阵化后:

对于 window i:

[
K_s[i] \in \mathbb{R}^{256 \times d}
]
[
V_s[i] \in \mathbb{R}^{256 \times d}
]

扩展到全部 64 个窗口:

[
K_s \in \mathbb{R}^{64 \times 256 \times d}
]
[
V_s \in \mathbb{R}^{64 \times 256 \times d}
]


6. 最后的 attention 是:

对每个 window:

[
\text{Att}i = \text{Softmax}\left(\frac{Q_i K{s,i}^\top}{\sqrt{d}} \right) V_{s,i}
]

其中:

  • (Q_i \in \mathbb{R}^{16 \times d}) (window 内的 16 个 token)
  • (K_{s,i} \in \mathbb{R}^{256 \times d})
  • 输出为:

[
O_i \in \mathbb{R}^{16 \times d}
]

最后将所有 window 重新拼回 ((H \times W) \times d)。


✅ 三、具体例子(让你彻底理解 Gather)

我们用一个极简版本示范:

  • 图像特征:H = 4, W = 4(方便演示)
  • 窗口大小 n = 2 → 每个 window = 2×2 = 4 个 token
  • 总窗口数:4(划分为 2×2 grid)
  • 每个 window 选择 m = 2 个相关窗口
  • d = 3(embedding 维度)

1. 图像分成 4 个 window

window id token index(flatten后)
w0 [0,1,4,5]
w1 [2,3,6,7]
w2 [8,9,12,13]
w3 [10,11,14,15]

2. 假设 Top-k 的结果 ids 为

[
ids =
\begin{bmatrix}
1 & 2
0 & 2
0 & 1
1 & 3
\end{bmatrix}
]

含义:

  • window 0 的相关窗口是 w1 和 w2
  • window 1 的相关窗口是 w0 和 w2
  • ……

3. Gather K,V token

假设 K 的 token 索引:

window token index
w0 [0,1,4,5]
w1 [2,3,6,7]
w2 [8,9,12,13]
w3 [10,11,14,15]

举例:对 window 0

它相关窗口是:

ids[0] = [1, 2]

对应 token:

  • w1 → [2,3,6,7]
  • w2 → [8,9,12,13]

拼起来:

[
K_{s,0} = [K[2],K[3],K[6],K[7],\ K[8],K[9],K[12],K[13]]
]

维度:

[
K_{s,0} \in \mathbb{R}^{8 \times d}
]


对 window 1

ids[1] = [0, 2]

token:

  • w0 → [0,1,4,5]
  • w2 → [8,9,12,13]

[
K_{s,1} \in \mathbb{R}^{8 \times d}
]

……


✅ 四、从这个机制你应该理解的关键点

1. 不是对 K,V 取某些行,而是按“window → tokens”映射来取

也就是说:

  • ids 是 window-level(64×16)
  • Gather 会把这些 window 的所有 token(每窗 16 个)全部收集起来

2. 目的是限制 Q 只关注语义相关的局部 token,而不是全局

这样:

  • 计算量从 L² 降到 (L × 256)
  • 更强的局部一致性,同物体内像素更一致
  • 抑制噪声,减少 mask 碎片(论文 Fig.4 的效果)

3. 最终 attention 是分 window 独立计算的

这本质上是一种分块的、动态范围的稀疏注意力(sparse local attention)


Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐