image-20220531150823007

写在前面

因为我自身水平有限,如果本文存在错误,请直接指正,不胜感激!

这篇文章也是2022年CVPR的一篇对比学习文章,可以从中看出很多 clip 的影子。文章是针对 Referring Image Segmentation 任务的zero-shot transfer。通过只训练一个图像编码器(Group-VIT)和类似于clip给定的 text feature 来 ”生成” mask,也是第一个只使用文本监督,不需要任何 pixel-level 的图像信息,以 zero-shot transfer 的方式进行多标签词语义分割。文章也证明了这种方法的 zero-shot transfer 效果非常好。

创新点

  1. 首先是第一个尝试只使用文本监督,不需要任何 pixel-level 的图像信息,以 zero-shot transfer 的方式进行多标签词语义分割的工作。
  2. 提出了 Group-ViT,采用 Transformer 层和 Grouping Block (类似于 Cross-attention 操作,可学习矩阵 $g_i$ 作为 query)交替融合图像块(每次两两聚合,实验最好是从 64 个 group 融合到 2 个 group)的方法。
  3. 对比学习中正负标签的构建,文章使用了两种构建方法:

    1. 采取类似于 clip 的正负标签构建,直接将 text 丢到 text encoder 中,image 丢到 Group-ViT 中,做对比。
    2. 对于一个 text 中包含多个标签的情况,文章是将 text 的名词取出来(实验中取的是三个),分别经过 Prompt 层后获得 text,然后每个text 分别经过 text encoder 和 image 经过 Group-ViT 的特征做类似于 clip 的对比。

具体做法

image-20220531160208863

文章主要的创新在于提出了一个自底而上、分层合并的 Group-ViT 架构。

Group-ViT

  1. 初始化。

    image-20220531160805939

    作者首先将图像切割成多个 patch 后铺平 ,然后通过一个 linner projection 得到 image tokens $s_i^1$(类似于 ViT 做法,比如可以用 patch size 大小卷积核,patch size 大小步长来代替这个操作)。随后生成多个可学习的矩阵 $g_i^1$ (每一层 $g_i$ 的数量等于下一层 $s_i$ 的数量,实验效果最好的 $g_i^1$ 数目是 64 个,从而做到多层聚合,最后聚合到 2 个 $s_i$)。

  2. 一般化。

    image-20220531160225887

    对于上一层的 $s_i$ 和 $g_i$ ,首先都经过 transformer 层做 self-attention,得到 $\hat{s_i}$ 和 $\hat{g_i}$;然后将得到的 $\hat{s_i}$ 和 $\hat{g_i}$ ,做类似于 cross-attention 操作,也就是 image 生成的 $\hat{s_i}$ 作为 key 和 value,可学习矩阵生成的 $\hat{g_i}$ 作为 query。将 key 和 query 计算得到加权矩阵,不过这个加权矩阵不是用 softmax,而是用 Gumbel-softmax 得到。

    image-20220531160303466

    之后,用这个加权矩阵对 value 加权时,也不知直接加权,而是采取下面公式的方法。

    首先转换 $A$。

    image-20220531160434840

    再每个 group 聚合,得到 $s_i^{l+1}$ (下一个 Block 的输入)。

    image-20220531160455411

    通俗来说,就是将上一层输出的 group 通过这样的方式合并到一个大 group,直到最后剩下两个最大的 group

  3. 最后输出。

    image-20220531160831065

    当聚合到最后两个 group 后,经过个 transformer 层后做个平均池化,再经过一个两层的 MLP,就得到向量 $z^I$。

Text encoder

这个部分没啥特别之处,就 clip 的 Text encoder。text 经过 text encoder 后,经过两层的 MLP ,得到了向量 $z^T$。

对比学习正负样本构建

image-20220531161558890

对比学习中正负标签的构建,文章使用了两种构建方法:

  1. 采取类似于 clip 的正负标签构建,直接将 text 丢到 text encoder 中,image 丢到 Group-ViT 中,做对比。
  2. 对于一个 text 中包含多个标签的情况,文章是将 text 的名词取出来(实验中取的是三个),分别经过 Prompt 层后获得 text,然后每个text 分别经过 text encoder 和 image 经过 Group-ViT 的特征做类似于 clip 的对比。

zero-shot transfer

(我没太看懂如何还原的,之后看看代码再补充)

image-20220531161704469

文章没详细写如何还原,网上找了下看到别人也有相似疑惑,就这个两个 $z^I$ 如何还原?

其他

还是老样子,不喜欢看实验部分(笑)。之后应该会去看看代码,代码开源在:https://github.com/xvjiarui/GroupViT

最后修改:2022 年 05 月 31 日 04 : 48 PM