原文:
huggingface.co/docs/transformers
SegFormer
原始文本:
huggingface.co/docs/transformers/v4.37.2/en/model_doc/segformer
概述
SegFormer 模型是由 Enze Xie、Wenhai Wang、Zhiding Yu、Anima Anandkumar、Jose M. Alvarez、Ping Luo 在SegFormer: Simple and Efficient Design for Semantic Segmentation with Transformers中提出的。该模型由一个分层 Transformer 编码器和一个轻量级的全 MLP 解码头组成,以在 ADE20K 和 Cityscapes 等图像分割基准上取得出色的结果。
论文摘要如下:
我们提出了 SegFormer,这是一个简单、高效但功能强大的语义分割框架,将 Transformer 与轻量级多层感知(MLP)解码器统一起来。SegFormer 具有两个吸引人的特点:1)SegFormer 包括一个新颖的分层结构 Transformer 编码器,输出多尺度特征。它不需要位置编码,因此避免了位置代码的插值,这会导致测试分辨率与训练不同时性能下降。2)SegFormer 避免了复杂的解码器。所提出的 MLP 解码器从不同层中聚合信息,从而结合了局部注意力和全局注意力,以生成强大的表示。我们展示了这种简单且轻量级的设计是实现 Transformer 上高效分割的关键。我们将我们的方法扩展到从 SegFormer-B0 到 SegFormer-B5 的一系列模型,达到了比以前更好的性能和效率。例如,SegFormer-B4 在 ADE20K 上达到了 50.3%的 mIoU,参数为 64M,比以前最佳方法小 5 倍,效果提高了 2.2%。我们最好的模型 SegFormer-B5 在 Cityscapes 验证集上达到了 84.0%的 mIoU,并在 Cityscapes-C 上展现出出色的零样本鲁棒性。
下图展示了 SegFormer 的架构。摘自原始论文。
这个模型是由nielsr贡献的。模型的 TensorFlow 版本是由sayakpaul贡献的。原始代码可以在这里找到。
使用提示
- SegFormer 由一个分层 Transformer 编码器和一个轻量级的全 MLP 解码器头组成。SegformerModel 是分层 Transformer 编码器(在论文中也称为 Mix Transformer 或 MiT)。SegformerForSemanticSegmentation 在顶部添加了全 MLP 解码器头,用于执行图像的语义分割。此外,还有 SegformerForImageClassification,可用于对图像进行分类。SegFormer 的作者首先在 ImageNet-1k 上对 Transformer 编码器进行了预训练,以对图像进行分类。接下来,他们丢弃了分类头,并用全 MLP 解码头替换。然后,他们在 ADE20K、Cityscapes 和 COCO-stuff 上一起对模型进行微调,这些是语义分割的重要基准。所有检查点都可以在hub上找到。
- 使用 SegFormer 的最快方法是查看示例笔记本(展示了推理和在自定义数据上微调的示例)。也可以查看博客文章介绍 SegFormer 并说明如何在自定义数据上进行微调。
- TensorFlow 用户应参考此存储库,展示现成的推理和微调。
- 您也可以查看Hugging Face Spaces 上的交互式演示,尝试在自定义图像上使用 SegFormer 模型。
- SegFormer 适用于任何输入大小,因为它会填充输入,使其可以被
config.patch_sizes
整除。 - 可以使用 SegformerImageProcessor 为模型准备图像和相应的分割图。请注意,此图像处理器相当基础,不包括原始论文中使用的所有数据增强。原始预处理流程(例如 ADE20k 数据集)可以在这里找到。最重要的预处理步骤是将图像和分割图随机裁剪和填充到相同大小,例如 512x512 或 640x640,然后进行归一化。
- 还有一件事要记住的是,可以使用
reduce_labels
设置为True
或False
来初始化 SegformerImageProcessor。在一些数据集(如 ADE20k)中,0 索引用于背景的注释分割图。但是,ADE20k 不包括其 150 个标签中的“背景”类。因此,reduce_labels
用于减少所有标签 1,并确保不为背景类计算损失(即,它将注释地图中的 0 替换为 255,这是 SegformerForSemanticSegmentation 使用的损失函数的ignore_index)。然而,其他数据集使用 0 索引作为背景类,并将此类包含在所有标签中。在这种情况下,应将reduce_labels
设置为False
,因为损失也应计算背景类。 - 与大多数模型一样,SegFormer 有不同的大小,详情可以在下表中找到(取自原始论文的表 7)。
模型变体 | 深度 | 隐藏大小 | 解码器隐藏大小 | 参数(百万) | ImageNet-1k Top 1 |
---|---|---|---|---|---|
MiT-b0 | [2, 2, 2, 2] | [32, 64, 160, 256] | 256 | 3.7 | 70.5 |
MiT-b1 | [2, 2, 2, 2] | [64, 128, 320, 512] | 256 | 14.0 | 78.7 |
MiT-b2 | [3, 4, 6, 3] | [64, 128, 320, 512] | 768 | 25.4 | 81.6 |
MiT-b3 | [3, 4, 18, 3] | [64, 128, 320, 512] | 768 | 45.2 | 83.1 |
MiT-b4 | [3, 8, 27, 3] | [64, 128, 320, 512] | 768 | 62.6 | 83.6 |
MiT-b5 | [3, 6, 40, 3] | [64, 128, 320, 512] | 768 | 82.0 | 83.8 |
请注意,上表中的 MiT 指的是 SegFormer 中引入的 Mix Transformer 编码器骨干。有关 SegFormer 在 ADE20k 等分割数据集上的结果,请参阅论文。
资源
一个官方 Hugging Face 和社区(由