ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

MMSegmentation 中的 Mask2Former 完全指南:架构原理、配置解析与 Cityscapes/ADE20K 复现

MMSegmentation 中的 Mask2Former 完全指南:架构原理、配置解析与 Cityscapes/ADE20K 复现 MMSegmentation 中的 Mask2Former 完全指南架构原理、配置解析与 Cityscapes/ADE20K 复现【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation本文以 MMSegmentation 仓库中的configs/mask2former/系列配置为主线系统讲解 Masked-attention Mask TransformerMask2Former这一通用分割架构在语义分割任务中的落地方式包括其 masked attention 核心机制、MMDetection 依赖与安装前提、Mask2FormerHead各关键配置项的语义与默认值、Cityscapes 与 ADE20K 上的完整复现结果以及训练、测试与源码级实现细节。读完本文你将能够独立读懂并修改 Mask2Former 配置并在 MMSegmentation 1.x 环境下完成训练与评估。引言Mask2Former 与通用图像分割Mask2FormerMasked-attention Mask Transformer是一种旨在统一处理**全景分割panoptic、实例分割instance与语义分割semantic**三类任务的 Transformer 架构。其核心思想是与其为每种语义定义类别归属或实例归属设计专用网络不如用一个统一的 **mask 分类mask classification**范式覆盖所有分割任务——模型不再逐像素分类而是预测一组二进制掩码并为其赋予类别标签。该架构最关键的组件是masked attention在 Transformer 解码器的交叉注意力中将注意力范围约束在预测掩码区域内从而提取局部化特征、加速收敛。根据仓库 README 中引用的论文摘要Mask2Former 在 COCO 全景分割57.8 PQ、COCO 实例分割50.1 AP与 ADE20K 语义分割57.7 mIoU上均取得了当时领先的结果。本文聚焦的是 MMSegmentation 在语义分割任务上对 Mask2Former 的移植与配置实现。前置依赖必须先安装 MMDetection与仓库中绝大多数纯分割头不同Mask2Former 的解码头直接复用了 MMDetection 3.x 的实现mmdet.models.dense_heads.Mask2FormerHead因此 README 明确要求Mask2Former model needs to install [MMDetection] first.安装命令如下pip install mmdet3.0.0rc4这一点也可以从源码中得到印证在 mmseg/models/decode_heads/mask2former_head.py 中MMSegmentation 的Mask2FormerHead通过try: from mmdet.models.dense_heads import Mask2FormerHead as MMDET_Mask2FormerHead导入 MMDetection 的基类仅在ModuleNotFoundError时才回退为BaseModule。也就是说不安装 MMDetectionMask2Former 相关配置将无法正常构建。MMSegmentation 本体所需的mmcv与mmengine版本约束见 requirements/mminstall.txtmmcv2.0.0rc4,2.2.0、mmengine0.5.0,1.0.0。模型结构总览EncoderDecoder 框架下的 Mask2FormerHead以最基础的 ResNet-50 配置 configs/mask2former/mask2former_r50_8xb2-90k_cityscapes-512x1024.py 为例模型整体遵循 MMSegmentation 标准的EncoderDecoder范式由data_preprocessor、backbone、decode_head、train_cfg与test_cfg组成_base_ [../_base_/default_runtime.py, ../_base_/datasets/cityscapes.py] crop_size (512, 1024) num_classes 19 model dict( typeEncoderDecoder, data_preprocessordict( typeSegDataPreProcessor, mean[123.675, 116.28, 103.53], std[58.395, 57.12, 57.375], bgr_to_rgbTrue, pad_val0, seg_pad_val255, sizecrop_size, test_cfgdict(size_divisor32)), backbonedict( typeResNet, depth50, deep_stemFalse, num_stages4, out_indices(0, 1, 2, 3), frozen_stages-1, norm_cfgdict(typeSyncBN, requires_gradFalse), stylepytorch, init_cfgdict(typePretrained, checkpointtorchvision://resnet50)), decode_headdict(typeMask2FormerHead, ...), train_cfgdict(), test_cfgdict(modewhole))其中decode_head是理解 Mask2Former 的核心下面逐段拆解其关键配置。头部入口参数decode_headdict( typeMask2FormerHead, in_channels[256, 512, 1024, 2048], strides[4, 8, 16, 32], feat_channels256, out_channels256, num_classesnum_classes, num_queries100, num_transformer_feat_level3, align_cornersFalse, ...)in_channels/strides对应 ResNet 四个 stage 的输出通道数与相对原图的下采样倍数4/8/16/32。若更换 Swin 骨干这两项必须同步调整——例如 Swin-T 配置 configs/mask2former/mask2former_swin-t_8xb2-90k_cityscapes-512x1024.py 中即改为in_channels[96, 192, 384, 768]。num_queries可学习的 object queries 数量即模型最多预测的 mask 数默认 100。这是决定模型表达能力与显存开销的重要超参数。num_transformer_feat_level送入 Transformer 的多尺度特征层数固定为 3取 strides 为 8/16/32 的三层高分辨率特征。feat_channels/out_channelsTransformer 内部隐藏维度均为 256。Pixel Decoder多尺度可变形注意力编码器pixel_decoderdict( typemmdet.MSDeformAttnPixelDecoder, num_outs3, norm_cfgdict(typeGN, num_groups32), act_cfgdict(typeReLU), encoderdict( # DeformableDetrTransformerEncoder num_layers6, layer_cfgdict( # DeformableDetrTransformerEncoderLayer self_attn_cfgdict( # MultiScaleDeformableAttention embed_dims256, num_heads8, num_levels3, num_points4, im2col_step64, dropout0.0, batch_firstTrue, norm_cfgNone, init_cfgNone), ffn_cfgdict( embed_dims256, feedforward_channels1024, num_fcs2, ffn_drop0.0, act_cfgdict(typeReLU, inplaceTrue))), init_cfgNone), positional_encodingdict(num_feats128, normalizeTrue), init_cfgNone)MSDeformAttnPixelDecoder源自 MMDetection本质上是一个 6 层可变形 DETR 风格编码器self_attn_cfg配置多尺度可变形自注意力8 头、3 个尺度、每尺度采样 4 个点ffn_cfg配置前馈网络隐藏层 1024随后接一个SinePositionalEncodingnum_feats128, normalizeTrue为各尺度特征注入位置信息。该模块负责将骨干的多尺度特征编码为 Transformer 解码器可消费的特征金字塔。Transformer Decoder9 层 masked attention 解码器transformer_decoderdict( # Mask2FormerTransformerDecoder return_intermediateTrue, num_layers9, layer_cfgdict( # Mask2FormerTransformerDecoderLayer self_attn_cfgdict( # MultiheadAttention embed_dims256, num_heads8, attn_drop0.0, proj_drop0.0, dropout_layerNone, batch_firstTrue), cross_attn_cfgdict( # MultiheadAttention embed_dims256, num_heads8, attn_drop0.0, proj_drop0.0, dropout_layerNone, batch_firstTrue), ffn_cfgdict( embed_dims256, feedforward_channels2048, num_fcs2, act_cfgdict(typeReLU, inplaceTrue), ffn_drop0.0, dropout_layerNone, add_identityTrue)), init_cfgNone)解码器共 9 层每层包含自注意力与交叉注意力两个 8 头MultiheadAttention及一个 FFN。交叉注意力即 masked attention 的发生位置注意力 mask 由上一层预测的 mask 区域生成将每个 query 的注意力限制在对应预测区域内这是 Mask2Former 论文的核心贡献之一。return_intermediateTrue表示保留每一层的中间输出用于深度监督auxiliary loss。三损失组合mask 分类 二值掩码 CE Diceloss_clsdict( typemmdet.CrossEntropyLoss, use_sigmoidFalse, loss_weight2.0, reductionmean, class_weight[1.0] * num_classes [0.1]), loss_maskdict( typemmdet.CrossEntropyLoss, use_sigmoidTrue, reductionmean, loss_weight5.0), loss_dicedict( typemmdet.DiceLoss, use_sigmoidTrue, activateTrue, reductionmean, naive_diceTrue, eps1.0, loss_weight5.0),loss_clsquery 的类别分类损失。注意class_weight在num_classes个真实类别之后追加了0.1的权重项对应无对象no object类别——Mask2FormerHead在源码中会额外构建cls_embed nn.Linear(feat_channels, num_classes 1)见 mmseg/models/decode_heads/mask2former_head.py即类别数比语义类别多 1。loss_mask掩码的二值交叉熵损失。loss_dice掩码的 Dice 损失naive_diceTrue使用朴素 Dice 公式eps1.0平滑项。三者权重分别为 2.0 / 5.0 / 5.0这也是后续匈牙利匹配代价权重的同一套取值。训练时的匹配与采样匈牙利指派 Mask 伪采样train_cfgdict( num_points12544, oversample_ratio3.0, importance_sample_ratio0.75, assignerdict( typemmdet.HungarianAssigner, match_costs[ dict(typemmdet.ClassificationCost, weight2.0), dict(typemmdet.CrossEntropyLossCost, weight5.0, use_sigmoidTrue), dict(typemmdet.DiceCost, weight5.0, pred_actTrue, eps1.0)]), samplerdict(typemmdet.MaskPseudoSampler))num_points掩码损失计算时的采样点数默认 12544≈112×112。采用点级采样而非整图计算是 Mask2Former 降低掩码损失计算开销的关键手段。oversample_ratio/importance_sample_ratio点采样策略——先按oversample_ratio3.0对前景正例掩码区域进行过采样再以importance_sample_ratio0.75的比例用重要性采样补充困难点。assigner匈牙利匹配器代价由分类代价、交叉熵代价与 Dice 代价加权构成用于将预测 query 与真值实例一一配对。samplerMaskPseudoSampler伪采样器匹配后直接采样对应掩码点。数据与训练流水线数据增强 pipeline以 Cityscapes 配置为例训练 pipeline 为train_pipeline [ dict(typeLoadImageFromFile), dict(typeLoadAnnotations), dict( typeRandomChoiceResize, scales[int(1024 * x * 0.1) for x in range(5, 21)], resize_typeResizeShortestEdge, max_size4096), dict(typeRandomCrop, crop_sizecrop_size, cat_max_ratio0.75), dict(typeRandomFlip, prob0.5), dict(typePhotoMetricDistortion), dict(typePackSegInputs) ]RandomChoiceResize从 0.5× 到 2.0×步长 0.1×1024随机选取缩放尺度短边对齐、最长边不超过 4096提升尺度鲁棒性。RandomCrop的cat_max_ratio0.75限制单张裁剪图中单一类别占比不超过 75%避免背景主导。注意 ADE20K 配置如 configs/mask2former/mask2former_swin-b-in1k-384x384-pre_8xb2-160k_ade20k-640x640.py中LoadAnnotations带reduce_zero_labelTrueADE20K 的 0 号标签为背景不参与训练。优化器与学习率策略optimizer dict( typeAdamW, lr0.0001, weight_decay0.05, eps1e-8, betas(0.9, 0.999)) optim_wrapper dict( typeOptimWrapper, optimizeroptimizer, clip_graddict(max_norm0.01, norm_type2), paramwise_cfgdict( custom_keys{ backbone: dict(lr_mult0.1, decay_mult1.0), query_embed: dict(lr_mult1.0, decay_mult0.0), query_feat: dict(lr_mult1.0, decay_mult0.0), level_embed: dict(lr_mult1.0, decay_mult0.0), }, norm_decay_mult0.0)) param_scheduler [ dict(typePolyLR, eta_min0, power0.9, begin0, end90000, by_epochFalse)]优化器为 AdamWlr1e-4、weight_decay0.05并配合梯度裁剪max_norm0.01。paramwise_cfg是关键backbone 学习率乘 0.1微调预训练骨干而query_embed/query_feat/level_embed等嵌入参数decay_mult0.0不参与权重衰减所有 norm 层同样decay_mult0.0。Swin 骨干配置对 backbone 内部的 norm 与位置编码做了更细粒度的逐层定制见 configs/mask2former/mask2former_swin-t_8xb2-90k_cityscapes-512x1024.py 中的custom_keys构造逻辑遍历depths为每个 block 的 norm 注册lr_mult0.1, decay_mult0.0。学习率采用PolyLRpower0.9按迭代数调度Cityscapes 为 90k 迭代ADE20K 为 160k 迭代。训练循环与检查点train_cfg dict(typeIterBasedTrainLoop, max_iters90000, val_interval5000) val_cfg dict(typeValLoop) test_cfg dict(typeTestLoop) default_hooks dict( timerdict(typeIterTimerHook), loggerdict(typeLoggerHook, interval50, log_metric_by_epochFalse), param_schedulerdict(typeParamSchedulerHook), checkpointdict( typeCheckpointHook, by_epochFalse, interval5000, save_bestmIoU), sampler_seeddict(typeDistSamplerSeedHook), visualizationdict(typeSegVisualizationHook)) auto_scale_lr dict(enableFalse, base_batch_size16)训练基于迭代而非 epoch每 5000 迭代验证一次并保存 checkpointsave_bestmIoU。auto_scale_lr默认关闭base_batch_size16对应 8 卡 × 每卡 2 样本。复现结果Cityscapes 与 ADE20KREADME 记录了全部 13 个模型的官方复现结果均在 8×A100 上训练每卡 batch size 为 2。以下两张表完整继承自 configs/mask2former/README.md模型权重与训练日志的下载地址统一收录在 configs/mask2former/metafile.yaml 中训练、验证与推理请使用仓库根目录下的 tools/train.py 与 tools/test.py。Cityscapes19 类90k 迭代crop 512×1024MethodBackboneCrop SizeLr schdMem (GB)Inf time (fps)DevicemIoUMask2FormerR-50-D32512x1024900005.679.17A10080.44Mask2FormerR-101-D32512x1024900006.817.11A10080.80Mask2FormerSwin-T512x1024900006.367.18A10081.71Mask2FormerSwin-S512x1024900008.095.57A10082.57Mask2FormerSwin-B (in22k)512x10249000010.894.32A10083.52Mask2FormerSwin-L (in22k)512x10249000015.832.86A10083.65对应配置文件见 configs/mask2former/ 目录例如mask2former_r50_8xb2-90k_cityscapes-512x1024.py、mask2former_swin-b-in22k-384x384-pre_8xb2-90k_cityscapes-512x1024.py等。ADE20K150 类160k 迭代MethodBackboneCrop SizeLr schdMem (GB)Inf time (fps)DevicemIoUMask2FormerR-50-D32512x5121600003.3126.59A10047.87Mask2FormerR-101-D32512x5121600004.0922.97A10048.60Mask2FormerSwin-T512x5121600003.8223.82A10048.66Mask2FormerSwin-S512x5121600003.7419.69A10051.24Mask2FormerSwin-B640x6401600005.6612.48A10052.44Mask2FormerSwin-B (in22k)640x6401600005.6612.43A10053.90Mask2FormerSwin-L (in22k)640x6401600008.868.81A10056.01说明原 README 表格中 Swin-T 一行的显存标注为 3826对应 metafile.yaml 中的Memory (GB): 3826.0按相邻模型的量级判断应为 3.8 GB 左右的笔误实际以复现环境测量为准。关键注意事项README 明确给出了三条复现约束直接关系到实验结果的解读训练资源所有 Mask2Former 实验均在8 张 A100 GPU、每卡 2 个样本总 batch size 16下完成。结果稳定性根据 官方仓库 issue #5Mask2Former 的训练结果相对不稳定表中 ADE20K 上 Swin-S 的结果是按照作者建议训练 5 次后取的中位结果。因此复现时存在一定波动属于正常现象建议多次训练取中位数评估。骨干差异Mask2Former 系列使用的 ResNet 骨干是标准ResNet不是ResNetV1cMMSegmentation 多数配置默认采用 V1c 变体。这一点在配置中体现为deep_stemFalse无 stem 处的 3×3 卷积堆叠。测试时增强TTAMMSegmentation 1.x 目前尚未支持测试时增强README 中的mIoU(msflip)列暂为空官方表示将尽快补充 multi-scale flip 结果。源码级实现MMSegmentation 如何复用 MMDetection 的解码头MMSegmentation 的 Mask2FormerHead 直接继承自 MMDetection 的MMDET_Mask2FormerHead只做了语义分割适配层核心是解决标注范式转换问题_seg_data_to_instance_datamask2former_head.py语义分割的真值只有逐像素类别图gt_sem_seg而 Mask2Former 的解码头需要实例级真值。该方法对每个类别做gt_sem_seg class_id的掩码提取将SegDataSample转换为 MMDetection 风格的InstanceData含labels与masks并剔除ignore_index255的区域从而让 MMDetection 的解码头逻辑可以原样运行。lossmask2former_head.py完成范式转换后调用父类loss_by_feat对 9 层中间输出计算分类、掩码 CE 与 Dice 三类损失。predictmask2former_head.py推理时取最后一层输出将 mask 预测双线性上采样到原图尺寸再通过torch.einsum(bqc, bqhw-bchw, cls_score, mask_pred)完成类别得分 × 掩码的加权融合直接输出b×C×H×W的语义分割 logits。这一步等价于将每个像素归属到类别概率 × 该类别掩码最高的 query。上述封装逻辑由单元测试 tests/test_models/test_heads/test_mask2former_head.py 覆盖该测试用num_classes19的完整配置实例化Mask2FormerHead构造随机四层特征与随机语义分割真值分别断言loss返回 dict 以及predict输出形状为(2, 19, 32, 32)。这也说明任何 Mask2Former 配置的改动都应同步更新in_channels/strides与骨干输出否则会破坏头部与骨干的对接。快速上手训练与测试在安装好 MMSegmentation含 MMDetection并准备好数据集后可直接复用仓库提供的脚本# 8 卡分布式训练Cityscapes 90k bash tools/dist_train.sh configs/mask2former/mask2former_r50_8xb2-90k_cityscapes-512x1024.py 8 # 单卡测试 python tools/test.py configs/mask2former/mask2former_r50_8xb2-90k_cityscapes-512x1024.py /path/to/checkpoint.pthSwin 系列配置如mask2former_swin-t_8xb2-90k_cityscapes-512x1024.py通过_delete_True替换 backbone并继承 R-50 配置其余部分体现了 MMSegmentation 配置系统的复用性而 in22k 预训练版本如 mask2former_swin-b-in22k-384x384-pre_8xb2-160k_ade20k-640x640.py只需覆盖pretrained权重地址即可切换预训练来源。全部 13 个模型条目含权重/日志地址、batch size、训练资源与 mIoU均可在 configs/mask2former/metafile.yaml 中检索。引用如需引用 Mask2Former请使用 README 提供的 BibTeXinproceedings{cheng2021mask2former, title{Masked-attention Mask Transformer for Universal Image Segmentation}, author{Bowen Cheng and Ishan Misra and Alexander G. Schwing and Alexander Kirillov and Rohit Girdhar}, journal{CVPR}, year{2022} } inproceedings{cheng2021maskformer, title{Per-Pixel Classification is Not All You Need for Semantic Segmentation}, author{Bowen Cheng and Alexander G. Schwing and Alexander Kirillov}, journal{NeurIPS}, year{2021} }小结Mask2Former 以统一的 mask classification 范式与 masked attention 机制将三类分割任务收敛到同一架构之下。在 MMSegmentation 中它的落地路径是复用 MMDetection 解码头 语义标注适配层理解 configs/mask2former/ 下各配置项num_queries、num_transformer_feat_level、点采样参数、三损失权重、AdamW 参数化学习率等与 Mask2FormerHead 的适配逻辑是复现 80 mIoUCityscapes与 47~56 mIoUADE20K结果、或将其改造到自有数据集上的关键前提。【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表