资讯详情

资讯详情

MMDetection 生态下的动态多尺度语义分割:MMSegmentation 中 DMNet 原理与实战指南

MMDetection 生态下的动态多尺度语义分割MMSegmentation 中 DMNet 原理与实战指南【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentationDMNetDynamic Multi-scale Network是 ICCV 2019 提出的一种基于动态多尺度卷积的语义分割算法其核心思想是用由输入图像内容动态生成的卷积核取代传统固定的多尺度滤波器从而在不显著增加参数量的前提下自适应捕获不同尺度的上下文信息。本文以 MMSegmentation 仓库中 DMNet 官方文档 为主体结合 DMHead 源码、基础配置文件 与 单元测试完整讲解 DMNet 的算法原理、代码实现、配置解析与训练推理方法帮助读者在 MMSegmentation 中快速复现与二次开发 DMNet。一、算法背景与核心思想1.1 多尺度表征的困境在语义分割任务中同一张图片里的物体与stuff类别往往存在显著的尺度差异例如近处的人与远处的建筑因此多尺度表征是提升分割精度的关键手段。传统方法构建多尺度表征通常有以下几种路线使用不同尺寸的卷积滤波器但参数量与计算量成倍增长使用膨胀卷积dilated convolution扩大感受野但滤波器尺寸/膨胀率一旦训练完成即固定使用不同尺度的池化网格pooling grids同样面临参数固定、推理时无法适应输入内容的问题。这些方法的共同缺陷是滤波器的参数在训练结束后完全固定推理时对输入图像的内容不具备自适应性且往往伴随较高的计算开销或参数量。1.2 DMNet 的解决思路DMNet 提出用动态卷积解决上述问题网络由多个并行排列的DCMDynamic Convolutional Module动态卷积模块组成每个 DCM 负责估计某一特定尺度的语义表征。关键在于DCM 中使用的卷积核并非训练后固定的参数而是根据输入特征图内容实时生成的 context-aware filters上下文感知滤波器。多个 DCM 的输出经过融合后得到最终的分割结果。原论文在 PASCAL VOC 2012、Pascal-Context 与 ADE20K 三个数据集上进行了验证在不使用 MS COCO 预训练和后处理的情况下DMNet 在 PASCAL VOC 2012 test 集上取得了 84.4% mIoU并在 Pascal-Context 与 ADE20K 上取得了当时领先的结果该数据来自论文摘要可作为算法背景参考当前仓库则提供了 Cityscapes 与 ADE20K 上的可复现基准见后文模型库一节。二、核心实现剖析DCM 与 DMHeadMMSegmentation 在 mmseg/models/decode_heads/dm_head.py 中完整实现了 DMNet 的解码头包含两个关键组件DCM第 11-89 行与DMHead第 92-141 行并通过MODELS.register_module()注册到模型注册表配置文件中以typeDMHead即可直接引用。2.1 DCM动态卷积模块DCM的核心逻辑在forward中dm_head.py#L61-L89其前向流程可以拆解为四步生成动态卷积核对输入x做F.adaptive_avg_pool2d(x, self.filter_size)自适应平均池化将特征压缩为filter_size × filter_size的空间尺寸再经filter_gen_conv1×1 卷积生成与通道数对应的滤波器。这里的filter_size即 DCM 负责的尺度。输入通道压缩input_redu_conv用 1×1 卷积把输入通道数统一到channels。动态卷积执行将特征变形为[1, b*c, h, w]、滤波器变形为[b*c, 1, filter_size, filter_size]随后以groupsb*c的深度可分离方式调用F.conv2d即每个通道使用各自的动态卷积核完成卷积再经 padding 保持空间尺寸不变。归一化与激活依次经过 norm 层若配置了norm_cfg与激活层若开启fusion则再追加一个 1×1 的fusion_conv融合本模块输出。从源码可以看出DCM 的动态性来源于池化-生成-卷积这一路径卷积核由当前输入的内容决定因此同一套网络参数可以在推理时对不同图像生成不同滤波器实现对输入的自适应。2.2 DMHead多尺度并联与融合DMHead继承自BaseDecodeHeadmmseg/models/decode_heads/decode_head.py构造函数中dm_head.py#L107-L130根据filter_sizes元组默认(1, 3, 5, 7)创建一组并行的DCM实例存入nn.ModuleList。前向过程dm_head.py#L132-L141def forward(self, inputs): x self._transform_inputs(inputs) dcm_outs [x] for dcm_module in self.dcm_modules: dcm_outs.append(dcm_module(x)) dcm_outs torch.cat(dcm_outs, dim1) output self.bottleneck(dcm_outs) output self.cls_seg(output) return output即原始特征x与每个 DCM 的输出沿通道维拼接通道数变为in_channels len(filter_sizes) * channels再经bottleneck3×3 卷积融合最后交给cls_seg得到逐像素分类 logits。每个 DCM 只对输入做一次池化/卷积各尺度并行计算避免了传统多尺度方法的参数量膨胀。2.3 参数说明与单元测试验证DMHead的构造参数如下参数类型默认值说明filter_sizestuple/list(1, 3, 5, 7)各 DCM 动态卷积核的尺寸必须是列表或元组fusionboolFalse是否在每个 DCM 输出后追加融合卷积in_channels/channelsint—输入通道数 / 模块中间通道数conv_cfg/norm_cfg/act_cfgdict—卷积、归一化、激活层配置单元测试 对这些行为做了明确约束可作为二次开发时的回归依据filter_sizes传入标量如1会触发AssertionError测试第 11-13 行源码第 109 行assert isinstance(filter_sizes, (list, tuple))与之对应未配置norm_cfg时网络中的卷积模块不含归一化层配置SyncBN后包含第 15-25 行fusionTrue时head.fusion为 True且dcm_modules中各模块的filter_size与传入元组一一对应第 38-40 行输入[1, 8, 23, 23]的特征图输出形状为(1, num_classes, 23, 23)空间尺寸保持不变第 42、58 行。三、配置文件逐项解析3.1 解码头基础配置DMNet 的模型骨架在 configs/base/models/dmnet_r50-d8.py 中定义其decode_head段落是理解 DMNet 在 MMSegmentation 中落地方式的关键decode_headdict( typeDMHead, in_channels2048, in_index3, channels512, filter_sizes(1, 3, 5, 7), dropout_ratio0.1, num_classes19, norm_cfgdict(typeSyncBN, requires_gradTrue), align_cornersFalse, loss_decodedict( typeCrossEntropyLoss, use_sigmoidFalse, loss_weight1.0)),各字段含义typeDMHead对应注册表中的DMHead类即上文源码解析的解码头in_channels2048取自 ResNet 最后一个 stagein_index3的输出通道数channels512DCM 内部特征与最终融合前的通道数filter_sizes(1, 3, 5, 7)四个并行 DCM 的动态卷积核尺寸这也是 DMNet 捕获多尺度的直接体现dropout_ratio0.1分类层前 Dropout 比例loss_decode主损失为CrossEntropyLoss权重 1.0。同时该骨架还配置了一个FCNHead辅助头loss_weight0.4与主解码头共同参与训练帮助浅层特征学习推理阶段辅助头不参与输出。3.2 数据集与训练调度以 Cityscapes 为例dmnet_r50-d8_4xb2-40k_cityscapes-512x512.py实际文件名为 512x1024通过_base_继承四份基础配置_base_ [ ../_base_/models/dmnet_r50-d8.py, ../_base_/datasets/cityscapes.py, ../_base_/default_runtime.py, ../_base_/schedules/schedule_40k.py ] crop_size (512, 1024) data_preprocessor dict(sizecrop_size) model dict(data_preprocessordata_preprocessor)其中configs/base/datasets/cityscapes.py 定义了 Cityscapes 数据管线训练时RandomResize缩放范围 0.5~2.0、RandomCrop512×1024cat_max_ratio0.75防止裁剪块类别失衡、RandomFlip、PhotoMetricDistortion等增强验证/测试时按(2048, 1024)等比 resize评估器为IoUMetric指标mIoUconfigs/base/schedules/schedule_40k.py 提供 40k 迭代的优化器与学习率策略最后的data_preprocessor覆写为匹配裁剪尺寸(512, 1024)。ADE20K 的配置如 dmnet_r50-d8_4xb4-160k_ade20k-512x512.py结构相同差异在于数据集切换为ade20k.py、调度为schedule_160k.py、crop_size(512, 512)并将主/辅助头的num_classes从 19 改为 150ADE20K 的类别数。四、模型库与官方复现结果configs/dmnet/目录共提供 12 个训练配置R-50/R-101 × Cityscapes/ADE20K × 不同调度与分辨率所有条目均登记在 configs/dmnet/metafile.yaml 中可通过 MIM 或tools/train.py直接调用。以下结果表格继承自 官方 README其中 mIoU 为官方在 V100 上复现的指标Inf time 为单卡推理帧率msflip 表示多尺度 水平翻转测试增强。4.1 Cityscapes19 类MethodBackboneCrop SizeLr schdMem (GB)Inf time (fps)DevicemIoUmIoU(msflip)configDMNetR-50-D8512x1024400007.03.66V10077.7879.14configDMNetR-101-D8512x10244000010.62.54V10078.3779.72configDMNetR-50-D8769x769400007.91.57V10078.4980.27configDMNetR-101-D8769x7694000012.01.01V10077.6278.94configDMNetR-50-D8512x102480000--V10079.0780.22configDMNetR-101-D8512x102480000--V10079.6480.67configDMNetR-50-D8769x76980000--V10079.2280.55configDMNetR-101-D8769x76980000--V10079.1980.65config4.2 ADE20K150 类MethodBackboneCrop SizeLr schdMem (GB)Inf time (fps)DevicemIoUmIoU(msflip)configDMNetR-50-D8512x512800009.420.95V10042.3743.62configDMNetR-101-D8512x5128000013.013.88V10045.3446.13configDMNetR-50-D8512x512160000--V10043.1544.17configDMNetR-101-D8512x512160000--V10045.4246.76config阅读上述表格可以发现两个工程要点分辨率影响显著Cityscapes 上 769×769 裁剪通常优于 512×1024如 40k 的 R-50 从 77.78 提升到 78.49但推理帧率也从 3.66 fps 降至 1.57 fps属于典型的精度-速度权衡更长的训练调度带来稳定增益80k 迭代相对 40k 在 Cityscapes 各配置上普遍提升约 1 个点msflip测试增强额外带来约 1 个点收益ADE20K 上 160k 相对 80k 亦有提升R-101 从 45.34 到 45.42。五、训练、测试与推理实战5.1 训练单机单卡或单机多卡训练一个 DMNet 模型使用仓库提供的 tools/train.py# 单卡训练 python tools/train.py configs/dmnet/dmnet_r50-d8_4xb2-40k_cityscapes-512x1024.py # 8 卡分布式训练与 4xb2 等配置的 batch size 含义对应4 GPU × batch 2 bash tools/dist_train.sh configs/dmnet/dmnet_r50-d8_4xb2-40k_cityscapes-512x1024.py 8dist_train.sh 为多卡启动脚本Slurm 集群环境可参考 slurm_train.sh。训练前需按 configs/base/datasets/cityscapes.py 中data_root data/cityscapes/的约定放置数据集leftImg8bit/与gtFine/目录结构。5.2 测试与评估使用 tools/test.py 在验证集上评测python tools/test.py configs/dmnet/dmnet_r50-d8_4xb2-40k_cityscapes-512x1024.py \ /path/to/checkpoint.pth --eval mIoU配置文件中的val_evaluator已默认采用IoUMetricmIoU。若需复现表格中的msflip指标可利用 cityscapes.py 中预置的tta_pipeline6 个缩放比例 × 水平翻转的TestTimeAug在测试时开启 TTA 即可。5.3 单图推理推理脚本 demo/image_demo.py 支持对单张图片进行可视化推理python demo/image_demo.py demo/demo.png \ configs/dmnet/dmnet_r50-d8_4xb2-40k_cityscapes-512x1024.py \ /path/to/checkpoint.pth --device cuda输出将直接叠加显示分割结果如需批量推理或接入推理管线可参考基于MMSegInferencer的 demo/image_demo_with_inferencer.py。六、引用若在学术工作中使用或复现 DMNet请引用原论文bibtex 来自 configs/dmnet/README.mdInProceedings{He_2019_ICCV, author {He, Junjun and Deng, Zhongying and Qiao, Yu}, title {Dynamic Multi-Scale Filters for Semantic Segmentation}, booktitle {Proceedings of the IEEE/CVF International Conference on Computer Vision (ICCV)}, month {October}, year {2019} }七、小结DMNet 的价值在于把多尺度从静态结构升级为动态行为通过DCM依据输入内容即时生成多组不同尺寸的卷积核在并行分支中捕获多尺度上下文后融合兼顾了精度与参数效率。在 MMSegmentation 仓库中读者可以直接基于 dm_head.py 研究其实现通过 configs/dmnet/ 下的 12 个配置复现 Cityscapes 与 ADE20K 上的全部基准并借助filter_sizes、fusion、channels等参数快速开展自己的实验——例如增减 DCM 数量修改filter_sizes、开关fusion融合、或替换 backbone 观察动态卷积在不同特征层次上的表现。【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →