论文提出#
问题 1:每像素独立分类忽略了区域层级的语义一致性#
📖 论文中指出:语义分割任务的目标是识别具有语义一致性的区域(segment),而不是单独的像素。 然而 per-pixel 分类并没有显式地建模这些区域之间的关系。
具体表现:
每个像素单独预测类别 → 缺乏“整体 mask”概念;
导致边界模糊、语义不连贯;
对大物体或纹理复杂的类别(如天空、建筑)常出现碎片化。
问题 2:无法统一语义分割、实例分割和全景分割(Panoptic)#
换句话说,像素级分类缺少“对象级”的表达能力。
📖 论文指出:不同任务的分割方法在架构和训练方式上割裂。
这些方法需要不同的头部结构、不同的损失函数,无法共享模型结构。 MaskFormer 希望用一个统一的框架同时解决这三类任务。
模型架构#

核心一句话#
MaskFormer 提出把语义分割从“每像素分类”转为“mask 分类(预测若干二进制 mask 并给每个 mask 一个类别)”,并用 Transformer decoder + per-pixel embedding 的设计实现这一范式;该方式能同时统一语义/实例/全像素(panoptic)分割,并在大类目数场景下优于传统 per-pixel 方法(如在 ADE20K 上取得 SOTA)
向前传播#
Backbone#
这个就是一个cnn网络来抽取特征,我们来看看代码里面是怎么做的,在论文中主要是使用了ResNet,和swin Transformer。本质上就是提前特征

会根据配置文件,输出的是
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#

这个就是对特征的解码形成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\) 的核心任务。

刚刚我们不是得到了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 来解决这个问题:
计算匹配成本:
每个 query mask 和每个 GT mask 的相似度
成本可结合:
Mask 相似度(Dice / BCE loss)
类别匹配(cross-entropy loss)
找最优匹配:
Hungarian 算法在 N 个 query 和 M 个 GT mask 之间做一一匹配
匹配后:
匹配到 GT 的 query → 对应 mask 的 ground truth
没匹配到的 query → 背景 / 无实例
Semantic Segmentation#
MaskFormer 使用的是 线性融合(或点乘) 的思想:
Mask logits
每个 query 的 segment embedding 与 pixel-level features 点乘 →
(H, W)maskshape:
(B, N, H, W)
Class logits
- 每个 query 的类别预测向量(经过 softmax) →
(B, N, num_classes)
- 每个 query 的类别预测向量(经过 softmax) →
组合成最终 semantic segmentation:
- 每个 query 的 mask logits 与它的类别概率向量 点乘(或者广播乘法)
Mask 和类别是 可分离的特征:
mask logits 描述 空间位置
class probability 描述 类别信息
点乘/广播后,可以同时得到 每个像素属于每个类别的概率
适合 semantic segmentation,因为:
不区分实例
每个类别的 mask 是所有 query 的叠加
效果分析#



怎么做Loss#

总结手绘#





