写在前面
因为我自身水平有限,如果本文存在错误,请直接指正,不胜感激!
这篇文章也是2022年CVPR的一篇对比学习文章,可以从中看出很多 clip 的影子。文章是针对 Referring Image Segmentation 任务的zero-shot transfer。通过只训练一个图像编码器(Group-VIT)和类似于clip给定的 text feature 来 ”生成” mask,也是第一个只使用文本监督,不需要任何 pixel-level 的图像信息,以 zero-shot transfer 的方式进行多标签词语义分割。文章也证明了这种方法的 zero-shot transfer 效果非常好。
创新点
- 首先是第一个尝试只使用文本监督,不需要任何 pixel-level 的图像信息,以 zero-shot transfer 的方式进行多标签词语义分割的工作。
- 提出了 Group-ViT,采用 Transformer 层和 Grouping Block (类似于 Cross-attention 操作,可学习矩阵 $g_i$ 作为 query)交替融合图像块(每次两两聚合,实验最好是从 64 个 group 融合到 2 个 group)的方法。
对比学习中正负标签的构建,文章使用了两种构建方法:
- 采取类似于 clip 的正负标签构建,直接将 text 丢到 text encoder 中,image 丢到 Group-ViT 中,做对比。
- 对于一个 text 中包含多个标签的情况,文章是将 text 的名词取出来(实验中取的是三个),分别经过 Prompt 层后获得 text,然后每个text 分别经过 text encoder 和 image 经过 Group-ViT 的特征做类似于 clip 的对比。
具体做法
文章主要的创新在于提出了一个自底而上、分层合并的 Group-ViT 架构。
Group-ViT
初始化。
作者首先将图像切割成多个 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$)。
一般化。
对于上一层的 $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 得到。
之后,用这个加权矩阵对 value 加权时,也不知直接加权,而是采取下面公式的方法。
首先转换 $A$。
再每个 group 聚合,得到 $s_i^{l+1}$ (下一个 Block 的输入)。
通俗来说,就是将上一层输出的 group 通过这样的方式合并到一个大 group,直到最后剩下两个最大的 group 。
最后输出。
当聚合到最后两个 group 后,经过个 transformer 层后做个平均池化,再经过一个两层的 MLP,就得到向量 $z^I$。
Text encoder
这个部分没啥特别之处,就 clip 的 Text encoder。text 经过 text encoder 后,经过两层的 MLP ,得到了向量 $z^T$。
对比学习正负样本构建
对比学习中正负标签的构建,文章使用了两种构建方法:
- 采取类似于 clip 的正负标签构建,直接将 text 丢到 text encoder 中,image 丢到 Group-ViT 中,做对比。
- 对于一个 text 中包含多个标签的情况,文章是将 text 的名词取出来(实验中取的是三个),分别经过 Prompt 层后获得 text,然后每个text 分别经过 text encoder 和 image 经过 Group-ViT 的特征做类似于 clip 的对比。
zero-shot transfer
(我没太看懂如何还原的,之后看看代码再补充)
文章没详细写如何还原,网上找了下看到别人也有相似疑惑,就这个两个 $z^I$ 如何还原?
其他
还是老样子,不喜欢看实验部分(笑)。之后应该会去看看代码,代码开源在:https://github.com/xvjiarui/GroupViT