跳过正文
  1. 日常记录、技术札记与转载收藏。/

MaskFormer

目录

论文提出
#

问题 1:每像素独立分类忽略了区域层级的语义一致性
#

📖 论文中指出:语义分割任务的目标是识别具有语义一致性的区域(segment),而不是单独的像素。 然而 per-pixel 分类并没有显式地建模这些区域之间的关系。

具体表现:

  • 每个像素单独预测类别 → 缺乏“整体 mask”概念;

  • 导致边界模糊、语义不连贯;

  • 对大物体或纹理复杂的类别(如天空、建筑)常出现碎片化。

问题 2:无法统一语义分割、实例分割和全景分割(Panoptic)
#

换句话说,像素级分类缺少“对象级”的表达能力

📖 论文指出:不同任务的分割方法在架构和训练方式上割裂。

这些方法需要不同的头部结构、不同的损失函数,无法共享模型结构。 MaskFormer 希望用一个统一的框架同时解决这三类任务

模型架构
#

Image

核心一句话
#

MaskFormer 提出把语义分割从“每像素分类”转为“mask 分类(预测若干二进制 mask 并给每个 mask 一个类别)”,并用 Transformer decoder + per-pixel embedding 的设计实现这一范式;该方式能同时统一语义/实例/全像素(panoptic)分割,并在大类目数场景下优于传统 per-pixel 方法(如在 ADE20K 上取得 SOTA)

向前传播
#

Backbone
#

这个就是一个cnn网络来抽取特征,我们来看看代码里面是怎么做的,在论文中主要是使用了ResNet,和swin Transformer。本质上就是提前特征

Image

会根据配置文件,输出的是

C2:

\[B, 256, H/4, W/4\]

C3:

\[B, 512, H/8, W/8\]

C4:

\[B, 1024, H/16, W/16\]

C5:

\[B, 2048, H/32, W/32\]

,然后这个特征大小,一部分会送入Transformer decoder,一部分送入pixel decoder

Pixel Decoder
#

Image

这个就是对特征的解码形成mask

encoder_out = [

\[B, 256, H/32, W/32\]

,

\[B, 256, H/16, W/16\]

,

\[B, 256, H/8, W/8\]

,

\[B, 256, H/4, W/4\]

,

]

最后输出

\[B, 32, H, W\]

空白的mask用于和transformer找到的类别做点积

Transformer decoder
#

在 MaskFormer 中,Transformer 主要用于 将 N 个 learnable queries 与图像特征做交互,从而生成最终的 mask predictions 和类别预测。也就是说,它承担了 mask 配对 \(mask classification/matching\) 的核心任务。

Image

刚刚我们不是得到了backbone的图像特征(2048 × H/32 × W/32)这个时候这个就是充当我们KV,然后用N个Query去学习不同的类别mask。输出还是 N 个 query,但是这些 query 已经被更新过了,包含了从图像特征中聚合的信息。

MLP
#

类别预测 MLP
#

输入:query embedding (B, N, D)

输出:每个 query 对应类别 logits (B, N, num_classes)

每个 query 最终会预测它对应 mask 的类别

这里怎么去做loss呢?

其实这个是专门为实列分割设计的,语义分割也是一样的一个实例一个query,或者一个类别一个类别一个query,这样就可以直接从标签数据中获取。

Mask embedding MLP
#

输入:query embedding (B, N, D)

输出:每个 query 对应的 mask embedding (B, N, D_mask)

D_mask 可以是同维度 D 或者降维后的向量

后续会与 Backbone feature map 做点积或卷积,生成 **mask logits **(B, N, H, W)

Query embedding 就像 “我想找的图案模板”

Backbone 特征就像 每个像素的描述信息

点积就是 把模板放到每个像素上,看匹配度

匹配得好的地方就是 mask。

Pixel-level embedding
#

Pixel-level embedding = 每个像素的特征向量

Query embedding = “想找到的 mask 特征向量”

点乘 = 把 query 放到每个像素上,看看匹配度

匹配度高的地方就属于这个 query 对应的 mask

相当于是说,在通道特征的角度上来说,找相似的模板,然后再填上图像信息。!!!!!!!

binary mask loss
#

binary mask loss 是专门用来匹配 mask 的

Transformer decoder 输出 N 个 query,每个 query 对应一个 预测 mask

每张图像有 M 个真实实例 mask(M ≤ N)

问题:模型不知道哪个 query 对应哪个 GT mask

MaskFormer 使用 Hungarian Matching 来解决这个问题:

  1. 计算匹配成本

    • 每个 query mask 和每个 GT mask 的相似度

    • 成本可结合:

      • Mask 相似度(Dice / BCE loss)

      • 类别匹配(cross-entropy loss)

  2. 找最优匹配

    • Hungarian 算法在 N 个 query 和 M 个 GT mask 之间做一一匹配

    • 匹配后:

      • 匹配到 GT 的 query → 对应 mask 的 ground truth

      • 没匹配到的 query → 背景 / 无实例

Semantic Segmentation
#

MaskFormer 使用的是 线性融合(或点乘) 的思想:

  1. Mask logits

    • 每个 query 的 segment embedding 与 pixel-level features 点乘 → (H, W) mask

    • shape: (B, N, H, W)

  2. Class logits

    • 每个 query 的类别预测向量(经过 softmax) → (B, N, num_classes)
  3. 组合成最终 semantic segmentation

    • 每个 query 的 mask logits 与它的类别概率向量 点乘(或者广播乘法)

Mask 和类别是 可分离的特征

  • mask logits 描述 空间位置

  • class probability 描述 类别信息

点乘/广播后,可以同时得到 每个像素属于每个类别的概率

适合 semantic segmentation,因为:

  • 不区分实例

  • 每个类别的 mask 是所有 query 的叠加

效果分析
#

Image
Image
Image

怎么做Loss
#

Image

总结手绘
#

Image

相关文章