image-20220528154649386

写在前面

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

这篇文章是一篇将 clip 用于语义分割(确切来说是 Referring Image Segmentation)的工作,在各大榜单都刷到了很高的指数。很可惜的是,作者没有开放代码,包括推理代码。

文章的重点在于提出的方法:如何将 clip ”正确的“ 运用到 Referring Image Segmentation 任务上。 我感觉 clip 的对比学习方法类比 CNN 的话,更加像一个分类任务(正负标签的构建是根据类别来构建的,image feature 和 text feature 按照类别生成的 text feature 来 1:1构建标签),不太适应于要求精度的语义分割任务,于是作者类比传统的语义分割网络相对于分类网络,做 text feature 与 image pixel-level feature 的对比学习,成功拿下 SOTA 。

(这段存疑,纯粹个人猜测)

阅读这篇论文所需要的前置知识:

  1. 不用多说,clip 肯定是要知道的,至少知道 clip 做了什么和怎样做的。
  2. attention,主要是 self-attention ,至少知道输入输出是什么。
  3. 对语义分割任务有一定了解,应该说是知道 mask 与原图联系,也就是输入输出是什么。
  4. 相信玄学。

创新点

文章提出一种将 clip 运用于 Referring Image Segmentation 任务的方法,做到通过 fine-grained text 的信息和 pixel-level image 的信息来精准分割 image(开了个大坑)。

具体做法

先将 clip 的知识迁移一下(用一下 clip 的权重,毕竟4亿 image-text pair 也太多了)

image-20220528164317395

(下述维度表述均为 Pytorch 维度)

文章将框架分为两个部分:Image & Text Feature Extraction 和 Vision-Language Decoder

Image & Text Feature Extraction

首先是 Image & Text Feature Extraction。

这个部分分成三个模块:Image Encoder、Text Encoder 和 Cross-modal Neck

  1. Image Encoder:这个模块文章使用的是 resnet,并且在后面使用卷出来的 3 层特征矩阵,大小均为 [B, C, H, W]。
  2. Text Encoder:不用多说,一猜就知道是 transformer。后面使用了 text 经过 embedding 后的 tokens (大小为 [B, C, N],命名为 $F_s$)和 [EOS] tokens(大小为 [B, C, 1],命名为 $F_t$)。但值得注意的一点,文章虽然像 bert 这种网络用一个 embedding 后的 tokens 来当作 text 全局信息,但选取的不是第一个 [SOS],是最后一个 [EOS]
  3. Cross-modal Neck:这个模块就是用来处理上面两个模块处理后的特征(准确说在这里只使用了 Text Encoder 的 [EOS] 经过 embedding 后的 tokens )。做法也就是 Image Encoder 最后一层特征与 Text Encoder 的 [EOS] 经过 embedding 后的 tokens $F_t$ 分别经过一个全连接层生成的向量做点积,然后和其他 Image Encoder 的特征经过一个全连接层生成的向量做拼接操作(中间经过了一层平均池化)。然后将这个拼接出来的大特征矩阵做个卷积操作,得到了一个四维特征矩阵([B, C, H, W])。然后将这个四维特征矩阵的 C, H 维度铺平,就变成了 [B, C, N] (N=H*W)的特征(为了和 text 经过 transformer embedding 后的特征对齐,命名为 $F_v$)

Vision-Language Decoder

然后是 Vision-Language Decoder。

这个部分主要是对上述的特征矩阵做 Attention 操作。首先是对于上面 Cross-modal Neck 处理出来的 [B, C, N] 的特征矩阵 $F_v$ 以及 Text Encoder 处理出来但没在 Cross-modal Neck 中用到的 text 经过 embedding 后的 tokens (大小为 [B, C, N])$F_t$ ,分别加个位置编码。

然后,将 Cross-modal Neck 处理出来的 [B, C, N] 的特征矩阵做个 multi-head self-attention(三头)后的特征矩阵再和自己之前的特征矩阵 $F_v$ 相加,得到一个新的特征矩阵,命名为 $F_v'$ 。而如何利用 text 经过 embedding 后的 tokens ,文章是将 $F_v'$ 和 Text Encoder 的 [EOS] 经过 embedding 后的 tokens $F_t$ 做 multi-head cross-attention,也就是将 $F_v'$ 当作 query,$F_t$ 当作 key 和 value,这样得到的特征矩阵,命名为 $F_c'$ 。再将 $F_c'$ 经过一个 MLP,就得到最后的输出 $F_c$ ,大小为 [B, C, N],N=H*W。

Loss

最后就是loss部分。

先将上面的 $F_c$ 的 N 维度还原成 H*W,经过上采样层和一个全连接层,再加上一个可学习的偏置,得到 $z_v$;再将上面的 $F_s$ 经过一个全连接层再加上一个可学习的偏置,得到 $z_t$。将 $z_v$ 和 $z_t$ 进行点积,经过个 sigmod 层,得到的最后的 mask(应该说会有置信度转换下才能的到我们正常可视化的mask) ,然后正常二分类交叉熵损失优化即可。

实验部分

(实验部分看的不仔细)

实验部分自然是分数大大的高,在 RefCOCO,RefCOCO+,G-Ref 数据集上做了实验。

然后作者也描述了自己的实验环境:a batch size of 64 on 8 Tesla V100 with 16 GPU VRAM(羡慕)。

指标就采用的 IOU 和按置信度递增后得到的平均 Precision(threshold 从0.5开始,步长0.1)

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