尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

MMSegmentation 中的 SETR:以序列到序列视角重新思考语义分割的 Transformer 实现与实战

MMSegmentation 中的 SETR:以序列到序列视角重新思考语义分割的 Transformer 实现与实战 MMSegmentation 中的 SETR以序列到序列视角重新思考语义分割的 Transformer 实现与实战【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation导读SETRSEgmentation TRansformer是首个以序列到序列sequence-to-sequence视角重新思考语义分割任务的 Transformer 方法它用纯 Transformer无卷积、无分辨率逐步缩减把整幅图像编码为 patch 序列再配合极简解码头完成逐像素分类。本文基于 MMSegmentation 仓库中configs/setr/的官方配置与文档系统讲解 SETR 的三种解码头设计Naive / PUP / MLA、完整模型配置解读、预训练权重的转换与加载流程以及 ADE20K、Cityscapes 两个基准上的官方复现结果帮助你在 MMSegmentation 中直接复现、微调与部署 SETR。核心思想把分割当作序列到序列预测在 SETR 之前主流语义分割方法几乎都是全卷积网络FCN 编码器-解码器架构编码器通过卷积逐级降低空间分辨率同时借助空洞卷积或注意力模块扩大感受野。SETR 论文提出了一个不同的视角——直接把语义分割建模为序列到序列预测任务使用一个纯 Transformer 编码器不含卷积、不降低分辨率将图像编码为 patch 序列Transformer 的每一层都建模全局上下文因此该编码器只需搭配一个简单解码器就能构成强大的分割模型即 SETR实验表明SETR 在 ADE20K50.28% mIoU、Pascal Context55.83% mIoU上刷新当时最优并在 Cityscapes 上取得有竞争力的结果其论文提交当日在 ADE20K 测试榜上取得第一名。注上述精度为论文报告值MMSegmentation 官方复现配置下的精度见下文复现结果一节两者口径不同请以仓库实测为准。在 MMSegmentation 中SETR 的官方实现文档为 configs/setr/README.md模型实现位于mmseg/models/decode_heads/下的setr_up_head.py与setr_mla_head.py。三种解码头Naive、PUP 与 MLASETR 的核心差异在于解码器。MMSegmentation 将 SETR 的两种解码头统一实现为SETRUPHeadmmseg/models/decode_heads/setr_up_head.py对应论文中的Naive朴素上采样与PUP渐进式上采样两种变体第三种变体MLA多级特征聚合Multi-level feature Aggregation则单独实现为SETRMLAHeadmmseg/models/decode_heads/setr_mla_head.py。Naive 与 PUPSETRUPHeadSETRUPHead的关键构造参数来自 setr_up_head.py参数默认值说明norm_layerdict(typeLN, eps1e-6, requires_gradTrue)对 Transformer 输出的序列特征先做 LayerNorm在(n, h*w, c)维度上num_convs1解码卷积的个数每个卷积后接一次双线性上采样up_scale4每次上采样的倍率kernel_size3解码卷积核大小代码断言只能是 1 或 3init_cfgLN 常数初始化 conv_seg正态初始化默认初始化策略前向过程很直观setr_up_head.py将 Transformer 输出的序列(n, c, h*w)reshape 回空间特征(n, c, h, w)在序列维度上做 LayerNorm依次执行num_convs个卷积 双线性上采样模块最后通过cls_seg1x1 卷积输出逐像素 logits。Naive 变体解码只用1 个 1x1 卷积kernel_size1将 1024 维特征降到channels再一次性up_scale4上采样到原图 1/4语义过于朴素PUP 变体解码采用4 个 3x3 卷积kernel_size3、每次up_scale2的渐进式上采样逐级恢复分辨率精度通常略高于 Naive。MLASETRMLAHeadSETRMLAHead走的是另一条路线setr_mla_head.py从 ViT 的多个中间层如第 5、11、17、23 层抽取多级特征输入通道数不再是单个 int而是多级列表每个输入先经过两组 3x3 卷积降到mla_channels默认 128再 4 倍上采样得到分辨率一致的多级特征最后将多级特征在通道维torch.cat再经cls_seg分类代码约束channels num_inputs * mla_channels因此默认channels5124 级 × 128。同时MLA 变体在 ViT 编码器输出端多了一个MLANeck见 configs/base/models/setr_mla.py先把四级1024通道特征统一压到 256再喂给SETRMLAHead辅助头则复用普通FCNHeadnum_convs0、concat_inputFalse即纯 1x1 卷积分类。解码头与辅助头的分工三种变体都采用一个主解码头 三个辅助头的结构且共用同一个损失函数配置loss_decodedict(typeCrossEntropyLoss, use_sigmoidFalse, loss_weight0.4)主头loss_weight1.0三个辅助头各0.4辅助头分别接在 ViT 的早期层输出上in_index0/1/2为浅层特征提供监督信号帮助训练收敛。模型配置逐项解读仓库在configs/setr/下提供了 7 个官方配置覆盖两种数据集、三种变体。所有配置都通过_base_继承公共模块配置文件变体数据集输入尺寸迭代数setr_vit-l_naive_8xb2-160k_ade20k-512x512.pyNaiveADE20K512×512160ksetr_vit-l_pup_8xb2-160k_ade20k-512x512.pyPUPADE20K512×512160ksetr_vit-l-mla_8xb1-160k_ade20k-512x512.pyMLAADE20K512×512160ksetr_vit-l_mla_8xb2-160k_ade20k-512x512.pyMLA大 batchADE20K512×512160ksetr_vit-l_naive_8xb1-80k_cityscapes-768x768.pyNaiveCityscapes768×76880ksetr_vit-l_pup_8xb1-80k_cityscapes-768x768.pyPUPCityscapes768×76880ksetr_vit-l_mla_8xb1-80k_cityscapes-768x768.pyMLACityscapes768×76880k以 PUP/ADE20K 为例配置核心结构如下setr_vit-l_pup_8xb2-160k_ade20k-512x512.py_base_ [ ../_base_/models/setr_pup.py, ../_base_/datasets/ade20k.py, ../_base_/default_runtime.py, ../_base_/schedules/schedule_160k.py ] crop_size (512, 512) data_preprocessor dict(sizecrop_size) norm_cfg dict(typeSyncBN, requires_gradTrue) model dict( data_preprocessordata_preprocessor, pretrainedNone, backbonedict( img_size(512, 512), drop_rate0., init_cfgdict(typePretrained, checkpointpretrain/vit_large_p16.pth)), decode_headdict(num_classes150), auxiliary_head[...三个 SETRUPHead...], test_cfgdict(modeslide, crop_size(512, 512), stride(341, 341)), ) optimizer dict(lr0.001, weight_decay0.0) optim_wrapper dict( typeOptimWrapper, optimizeroptimizer, paramwise_cfgdict(custom_keys{head: dict(lr_mult10.)})) train_dataloader dict(batch_size2) # 8 卡 × 2 16几个值得注意的设计点Backbone 是标准VisionTransformerViT-Large公共模型定义见 configs/base/models/setr_pup.pypatch_size16、embed_dims1024、num_layers24、num_heads16、interpolate_modebilinear。Naive/PUP 取out_indices(9, 14, 19, 23)且with_cls_tokenTrueMLA 取out_indices(5, 11, 17, 23)且with_cls_tokenFalse见 setr_mla.py。Backbone 归一化用 LayerNorm解码头归一化用 SyncBN前者符合 Transformer 惯例后者保证分割头在 BN 统计上的稳定性。预训练权重通过init_cfg指定本地路径pretrain/vit_large_p16.pth这就是下文要讲解的转换产物。优化器差异化学习率paramwise_cfgdict(custom_keys{head: dict(lr_mult10.)})使头部学习率是 backbone 的 10 倍如 backbone lr0.001 时 head 实际 lr0.01且weight_decay0.0。测试采用滑窗slide模式ADE20K 配置用crop_size(512,512)、stride(341,341)Cityscapes 配置用 768×768 滑窗、stride512见 setr_vit-l_mla_8xb1-80k_cityscapes-768x768.py。这是因为 ViT 没有平移等变性整图推理在超大图上效果欠佳滑窗可显著提升精度。三个变体的关键差异速查变体解码头主头卷积上采样方式辅助头ViT 输出层cls tokenNaiveSETRUPHead1×1 conv ×1一次 4× 双线性SETRUPHead1×1, up×4(9,14,19,23)保留PUPSETRUPHead3×3 conv ×4四次 2× 渐进双线性SETRUPHead3×3, up×4(9,14,19,23)保留MLASETRMLAHead3×3 conv ×2/级每级 4× 后 catFCNHead1×1(5,11,17,23)去掉预训练权重准备vit2mmseg.py 转换与加载SETR 的 ViT-Large 骨干需要从 ImageNet 预训练权重初始化。官方文档给出的完整流程configs/setr/README.md下载 timm 仓库发布的 ViT-Large 预训练权重文件名jx_vit_large_p16_384-b3be5167.pth用转换脚本vit2mmseg.py将 timm 的权重键名转换为 MMSegmentation 风格python tools/model_converters/vit2mmseg.py ${PRETRAIN_PATH} ${STORE_PATH}例如python tools/model_converters/vit2mmseg.py \ jx_vit_large_p16_384-b3be5167.pth pretrain/vit_large_p16.pth该脚本读取PRETRAIN_PATH的权重并保存到STORE_PATHtools/model_converters/vit2mmseg.py。由于dst路径会被mmengine.mkdir_or_exist自动创建父目录建议把转换产物统一放到pretrain/目录下与各配置中init_cfg.checkpointpretrain/vit_large_p16.pth的约定保持一致。键名映射规则转换核心逻辑在convert_vit函数vit2mmseg.py它把 timm/deit 风格的键名映射到 MMSegmentation 的VisionTransformer实现timm 键名片段MMSeg 键名片段norm.顶层ln1.patch_embed.projpatch_embed.projectionblocks.layers.blocks.*.normlayers.*.lnblocks.*.mlp.fc1layers.*.ffn.layers.0.0blocks.*.mlp.fc2layers.*.ffn.layers.1blocks.*.attn.qkvlayers.*.attn.attn.in_proj_blocks.*.attn.projlayers.*.attn.attn.out_projhead.*分类头直接丢弃脚本同时兼容三种 checkpoint 格式timm 的state_dict字段、deit 的model字段以及直接就是权重字典的情况vit2mmseg.py。转换完成后配置中通过pretrainedNone关闭模型默认预训练路径改用backbone.init_cfg显式加载本地权重从而避免与_base_中默认的远程预训练路径冲突。复现结果与资源占用ADE20K150 类以下为 MMSegmentation 官方在 V100 上的复现结果来自 configs/setr/README.mdmIoU 为单尺度 / 多尺度翻转两种评测口径方法BackboneCrop SizeBatchLr schdMem (GB)Inf time (fps)mIoUmIoU(msflip)SETR NaiveViT-L512×5121616000018.404.7248.2849.56SETR PUPViT-L512×5121616000019.544.5048.2449.99SETR MLAViT-L512×512816000010.96-47.3449.05SETR MLAViT-L512×5121616000017.305.2547.3949.37对应配置Naive、PUP、MLA(bs8)、MLA(bs16)。MLA(bs16) 仅是在 MLA(bs8) 基础上把单卡 batch 从 1 提到 2train_dataloader dict(batch_size2)见 setr_vit-l_mla_8xb2-160k_ade20k-512x512.py。Cityscapes19 类方法BackboneCrop SizeBatchLr schdMem (GB)Inf time (fps)mIoUmIoU(msflip)SETR NaiveViT-L768×76888000024.060.3978.1080.22SETR PUPViT-L768×76888000027.960.3779.2181.02SETR MLAViT-L768×76888000024.100.4177.0079.59对应配置Naive、PUP、MLA。Cityscapes 三个配置均以 8 卡 × 单卡 batch1 训练且学习率策略切换到schedule_80k。从表格可观察到两个规律一是768×768 高分辨率对 Cityscapes 至关重要ViT 无金字塔结构输入分辨率直接决定特征密度二是PUP 的渐进式上采样在两种数据集上都是最稳的选择MLA 则凭借更少的内存占用ADE20K 上 10.96GB vs 19.54GB适合显存受限场景。如何在 MMSegmentation 中运行 SETR仓库为标准 OpenMMLab 工程训练与测试可直接复用tools/下的通用脚本需先安装依赖并准备好对应数据集# 单机多卡训练以 PUP/ADE20K 为例 bash tools/dist_train.sh \ configs/setr/setr_vit-l_pup_8xb2-160k_ade20k-512x512.py 8 # 测试 bash tools/dist_test.sh \ configs/setr/setr_vit-l_pup_8xb2-160k_ade20k-512x512.py \ ${CHECKPOINT} 8运行前需确保已按上文完成预训练权重转换并把pretrain/vit_large_p16.pth放到工作目录与配置中的init_cfg.checkpoint相对路径一致ADE20K / Cityscapes 数据集按 configs/base/datasets/ade20k.py 或 cityscapes_768x768.py 约定的目录结构组织好显存满足上表需求ViT-L 体量较大单卡 batch 建议按配置保持 1~2。另外仓库提供了模型仓库索引 metafile.yaml记录了每个官方权重的下载地址与评测结果可配合tools/下的推理脚本直接加载权重做单图分割演示。小结SETR 在 MMSegmentation 中的落地体现了三个可复用的工程范式以纯 Transformer 作为分割骨干VisionTransformer LayerNorm、多种解码头的可插拔设计Naive / PUP 共用SETRUPHeadMLA 独立为SETRMLAHead、以及timm → OpenMMLab 的权重键名转换工具链vit2mmseg.py。如果你希望在自己的数据上微调 SETR最经济的路径是基于 PUP 配置替换数据集与num_classes复用 ADE20K 训练配置中的滑窗测试策略即可快速得到基线。引用若在研究中使用了 SETR请引用原论文article{zheng2020rethinking, title{Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective with Transformers}, author{Zheng, Sixiao and Lu, Jiachen and Zhao, Hengshuang and Zhu, Xiatian and Luo, Zekun and Wang, Yabiao and Fu, Yanwei and Feng, Jianfeng and Xiang, Tao and Torr, Philip HS and others}, journal{arXiv preprint arXiv:2012.15840}, year{2020} }【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表