• 问答
  • 技术
  • 实践
  • 资源
语义分割、实例分割 “大一统”:Facebook&UIUC 提出 MaskFormer
技术讨论

作者丨小马
编辑丨极市平台

写在前面

在处理语义分割任务和实例分割任务的时候,以前的工作大多采用不同的任务范式。对于语义分割,大多都是作为per-pixel的分类任务来处理;对于实例分割,大多都是作为mask的分类任务来处理。

这种不同的处理范式使得语义分割和实例分割存在很大的gap,极大了影响力图像分割领域一起发展。因此作者就提出了,将实例分割任务和语义分割任务都用mask分类的范式来处理,并在性能上能够超过当前per-pixel分类的处理范式。

0. 基础知识

1)什么是语义分割(semantic segmentation)、实例分割(instance segmentation)、全景分割(panoptic segmentation)? (参考:https://zhuanlan.zhihu.com/p/368904941

语义分割 :对图像中的每个像素打上类别标签,如下图,把图像分为人(红色)、树木(深绿)、草地(浅绿)、天空(蓝色)标签。

实例分割 :目标检测和语义分割的结合,在图像中将目标检测出来(目标检测),然后对每个像素打上标签(语义分割)。对比上图、下图,如以人(person)为目标,语义分割不区分属于相同类别的不同实例(所有人都标为红色),实例分割区分同类的不同实例(使用不同颜色区分不同的人)。

全景分割 :语义分割和实例分割的结合,即要对所有目标都检测出来,又要区分出同个类别中的不同实例。对比上图、下图,实例分割只对图像中的目标(如上图中的人)进行检测和按像素分割,区分不同实例(使用不同颜色),而全景分割是对图中的所有物体包括背景都要进行检测和分割,区分不同实例(使用不同颜色)

1. 论文和代码地址

Per-Pixel Classification is Not All You Need for Semantic Segmentation

论文地址:https://arxiv.org/abs/2107.06278

代码地址:https://github.com/facebookresearch/MaskFormer

2. Motivation

目前语义分割大多被看做是一个像素级别的分类任务,而实例分割确是一个mask级别的分类任务。虽然都是分割任务,但是他们的结构却存在这么大的区别,因此作者就提出了这样的疑问:是不是可以都用mask分类来简化语义分割和实例分割的范式呢?是否mask分类能够在语义分割任务上表现比per-pixel分类的方法更好呢?

基于上面的问题,作者在这篇论文中提出,其实mask分类是非常通用的,完全可以用mask分类来统一语义分类和实例分类的范式。因此,作者提出了MaskFormer,能够将现有的per-pixel分类的模型转换为mask分类的模型。

为了验证MaskFormer的有效性,作者在五个语义分割的数据集(Cityscapes (19 classes), Mapillary Vistas (65 classes), ADE20K (150 classes), COCO-Stuff-10K (171 classes), ADE20K-Full (847 classes))上做了实验。在Cityscapes数据上,MaskFormer的性能和per-pixel分类的方式性能相近,因为这个数据集的类别比较少。在数据集中的类别比较多时,MaskFormer能够比per-pixel分类的模型性能更好。

基于Swin-Transformer的backbone,MaskFormer在ADE20K这个数据集上达到了新的SOTA性能(55.6mIoU),比相同backbone下per-pixel分类的方法性能高2.1mIoU,并且少了10%的参数量和40%的计算量。

在全景分割任务上,MaskFormer的性能也比DETR更好,并且在COCO数据集上达到了52.7PQ的SOTA性能,比原来的SOTA高出了1.6PQ。

3. 方法

3.1. Per-pixel classification formulation

如上图(左)所示,per-pixel的分类其实就是把分割任务看做是一个对每一个像素点都进行一次分类的任务,对于一张$H \times W$的图片,模型输出的结果就是${p_i | pi \in R^K}{i=1}^{H*W}$,其中$R^K$是一个K维的概率分布,K为数据集中类别的数量。

由于是一个分类任务,所以per-pixel的损失函数其实就是每个像素点的cross-entropy损失函数的和,也就是下面的公式:

3.2. Mask classification formulation

如上图(右)所示,mask分类的模型将分割任务转换成了两个步骤,第一是将图像划分成N个不同的区域,用binary mask表示(这一步只是划分出了不同类别的区域,但并没有做分类 ),第二是将区域作为一个整体与K个类别进行对应(这一步就是将不同区域分为不同的类 )。

最终模型的损失函数为第一步中分割任务的损失函数$L{mask}$和第二步中分类任务的损失函数$L{mask_cls}$的和,可以表示成下面的公式:

3.3. MaskFormer

MaskFormer的结构如上图所示,主要可以分为三个部分:

1)pixel-level module:用来提取每个像素embedding(灰色背景部分)

2)transformer module:用来计算N个segment的embedding(绿色背景部分)

3)segmentation module:根据上面的per-pixel embedding和per-segment embedding,生成预测结果。(蓝色背景部分)

3.3.1. Pixel-level module

在Pixel-level module中,首先用backbone对图片的H和W进行压缩,通道维度进行提升,提取视觉特征$F$,这一部分和正常CNN提取特征类似。然后用一个pixel Decoder去将长宽重新转换为H和W。

3.3.2. Transformer module

Transformer module的结构就是标准的Transformer Decoder的结构,根据视觉特征$F$和N个可学习的query来计算输出。

3.3.3. Segmentation module

Segmentation module就是一个FC的结构,后面接上softmax激活函数。它的输出就是segment的概率估计,因此根据这个概率估计和GroundTruth做分类的损失。

对于mask的预测,作者将per-segment embedding通过一个两层的MLP转换成了N个mask embedding。 接着,作者将mask embedding和per-pixel embedding进行了点乘,后面接上了sigmoid激活函数,来获得最后mask的预测结果。

4.实验

4.1. 语义分割

上表比较了在ADE20K数据集上,MaskFormer和per-pixel分类模型的性能。可以看出表明,MaskFormer在语义分割方面具有显著的潜力。

除了ADE20K之外,作者还比较了在其他数据集上的性能,可以看出在其他数据集MaskFormer相比于per-pixel分类baseline方法,具有很大的优越性。

4.2. 全景分割

可以看出,MaskFormer在全景分割任务上也能达到非常好的效果,并能够在ADE20K数据集上达到新的SOTA效果。

4.3. 消融实验

4.3.1. Per-pixel vs. mask classification

从上表中可以看出,per-pixel的方法转换到MaskFormer的方法能够带来性能的提升。

4.3.2. Number of queries

为了探究query数量N对实验结果的影响,作者也做了消融实验。随着N数量的上升,模型的性能先上升在下降,N=100时,模型能够达到比较好的性能。

4.3.3. Number of Transformer decoder layers

可以看出六层的Transformer Decoder比一层的效果更好。

5. 总结

语义级分割和实例级分割之间的范式差异导致每个任务需要完全不同的模型,阻碍了整个图像分割的发展。作者通过实验表明,一个简单的mask分类模型可以优于SOTA的per-pixel分类模型,特别是在存在大量类别的情况下。本文提出的MaskFormer在全景分割任务上也保持着很强的竞争力,最重要的不需要改变模型架构、损失或训练过程。

这篇文章将语义分割是实例分割的范式进行了融合,极大的减小了语义分割和实例分割的gap,确实是一篇很有意义的工作。

  • 0
  • 0
  • 196
收藏
暂无评论
chengzi

阿里巴巴

  • 56

    关注
  • 151

    获赞
  • 10

    精选文章
近期动态
  • 目标跟踪
文章专栏
  • 目标跟踪分享