
BiSeNetV1 实时语义分割模型在 MMSegmentation 中的原理与实战指南【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation导读本文以 OpenMMLab 语义分割工具箱 MMSegmentation 中configs/bisenetv1目录为切入点系统讲解 BiSeNetV1Bilateral Segmentation Network的双边网络架构原理、MMSegmentation 中的源码实现与模块化配置并给出 Cityscapes 与 COCO-Stuff 164k 的完整实验结果与训练、测试、推理的实战命令。读完本文你将能够理解 BiSeNetV1 如何在空间细节与感受野之间取得平衡掌握其 backbone 的逐模块实现并能基于仓库内现成配置复现实验或移植到自己的数据集上。算法简介BiSeNetV1 解决了什么问题语义分割任务同时依赖两类特征丰富的空间信息用于保留边界细节与足够大的感受野用于捕获上下文语义。然而传统方法为了换取实时推理速度通常以牺牲空间分辨率为代价导致分割精度下降。BiSeNetV1论文BiSeNet: Bilateral Segmentation Network for Real-time Semantic SegmentationECCV 2018arXiv 摘要正是针对这一矛盾提出的双边分割网络。其核心思想是构建两条并行的特征通路Spatial Path空间通路采用小步幅卷积保持特征图的空间尺寸编码丰富的空间细节Context Path上下文通路采用快速下采样策略获取足够的感受野Feature Fusion Module特征融合模块FFM位于两条通路之上将两类特征高效融合。该设计在 Cityscapes、CamVid、COCO-Stuff 等数据集上取得了速度与分割精度的良好平衡。根据论文 Abstract 报告对于 2048×1024 输入在单张 NVIDIA Titan XP 上以 105 FPS 的速度在 Cityscapes 测试集上达到 68.4% 的 Mean IoU。在 MMSegmentation 中BiSeNetV1 的完整实现位于 mmseg/models/backbones/bisenetv1.py并通过 mmseg/models/backbones/init.py 注册为BiSeNetV1其 STDC 骨干也复用了本文的AttentionRefinementModule见 mmseg/models/backbones/stdc.py可见该模块设计在仓库内的复用价值。源码级拆解双通路 融合模块的实现原理BiSeNetV1继承自BaseModule整体前向流程见 mmseg/models/backbones/bisenetv1.py输入x先经ContextPath得到两个上下文特征再经SpatialPath得到空间特征最后经FeatureFusionModule融合输出三元组[x_fuse, x_context8, x_context16]分别对应分割头与两个辅助头的输入。SpatialPath保持空间分辨率SpatialPath 由 4 个ConvModule组成默认通道数为(64, 64, 64, 128)第 1 层7×7 卷积stride2padding3中间层3×3 卷积stride2padding1最后一层1×1 卷积stride1不改变尺寸。源码中通过assert len(num_channels) 4强制通道数元组长度必须为 4。与下采样卷积同时进行特征图仅逐步缩小从而保留丰富的空间信息。ContextPath通过骨干与 ARM 扩大感受野ContextPath 内部构建一个可配置的骨干网络默认 ResNet并叠加全局池化与注意力细化模块骨干输出 1/4、1/8、1/16、1/32 四个阶段的特征x_4, x_8, x_16, x_32gap_conv对 1/32 特征做全局平均池化后接 1×1 卷积提供全局上下文ARM32细化 1/32 特征后与全局上下文相加resizenearest 模式上采样到 1/16 尺寸ARM16细化 1/16 特征后与上采样结果相加再上采样到 1/8 尺寸得到x_16_up同时保留 1/16 尺度的x_32_up两个特征分别供主分割头与辅助头使用。AttentionRefinementModule通道注意力细化AttentionRefinementModule 先做 3×3 卷积再通过AdaptiveAvgPool2d((1,1)) 1×1 卷积 Sigmoid 生成通道注意力权重最后与原特征逐元素相乘x * x_atten。测试用例 tests/test_models/test_backbones/test_bisenetv1.py 验证了其输入输出通道与 kernel size 的正确性。FeatureFusionModule高效融合两类特征FeatureFusionModule 的实现为先将空间特征与上下文特征沿通道拼接torch.cat经 1×1 卷积降维随后对融合结果做全局平均池化并经 1×1 卷积 Sigmoid 得到注意力权重最后通过x_atten x_fuse的残差式加权输出。源码注释特别指出与论文相比实现中省略了 BN 和额外的 1×1 卷积见 bisenetv1.py。输出规格与测试验证默认out_indices(0, 1, 2)、out_channels256。测试 tests/test_models/test_backbones/test_bisenetv1.py 验证了 64×128 输入下feat[0]形状为[batch, 256, 8, 16]供主分割头使用feat[1]形状为[batch, 128, 8, 16]供第一个辅助头使用feat[2]形状为[batch, 128, 4, 8]供第二个辅助头使用。同一测试还验证了非常规输入尺寸如 95×27也能正常前向并断言spatial_channels与context_channels的长度约束分别必须为 4 和 3保证配置错误能尽早暴露。模块化配置解析以 R-18-D32 Cityscapes 为例MMSegmentation 的配置采用_base_继承机制。以 configs/bisenetv1/bisenetv1_r18-d32_4xb4-160k_cityscapes-1024x1024.py 为例其继承链为configs/base/models/bisenetv1_r18-d32.py模型结构定义configs/base/datasets/cityscapes_1024x1024.py1024×1024 裁剪的数据管线configs/base/default_runtime.py运行环境configs/base/schedules/schedule_160k.py160k 迭代训练计划。模型结构bisenetv1_r18-d32.py核心结构定义如下见 configs/base/models/bisenetv1_r18-d32.py整体框架EncoderDecoderdata_preprocessor使用SegDataPreProcessormean/std 为 ImageNet 统计值bgr_to_rgbTruebackboneBiSeNetV1in_channels3context_channels(128, 256, 512)spatial_channels(64, 64, 64, 128)out_indices(0, 1, 2)out_channels256骨干内嵌配置backbone_cfgResNet-18depth184 个 stagedilations(1,1,1,1)、strides(1,2,2,2)、contract_dilationTrue归一化使用SyncBNnorm_evalFalsedecode_headFCNHeadin_channels256与 backbone 的out_channels严格对应num_classes19损失为CrossEntropyLossloss_weight1.0auxiliary_head两个FCNHead分别以in_index1的 128 通道特征和in_index2的 128 通道特征为输入num_classes19各带loss_weight1.0的交叉熵损失用于中间层监督测试设置test_cfgdict(modewhole)即整图推理模式。数据与训练计划configs/base/datasets/cityscapes_1024x1024.py 定义训练管线RandomResizescale(2048,1024)ratio_range(0.5,2.0)→RandomCropcrop_size1024×1024cat_max_ratio0.75→RandomFlip(0.5)→PhotoMetricDistortion→PackSegInputs验证/测试管线为整图Resize到 2048×1024。configs/base/schedules/schedule_160k.py 定义IterBasedTrainLoopmax_iters160000val_interval16000优化器默认 SGDlr0.01momentum0.9weight_decay0.0005学习率策略为PolyLRpower0.9eta_min1e-4。顶层覆盖微调超参与预训练BiSeNetV1 的顶层配置在继承基础上做了针对性覆盖见 bisenetv1_r18-d32_4xb4-160k_cityscapes-1024x1024.pycrop_size (1024, 1024)data_preprocessor同步更新sizeparam_scheduler 采用 warmup poly 两段式前 1000 迭代用LinearLRstart_factor0.1线性热身之后用PolyLR衰减至 160000 迭代optimizer 覆盖为 SGD lr0.025高于基础配置的 0.01momentum0.9weight_decay0.0005数据加载train_dataloaderbatch_size4、num_workers4val/test_dataloaderbatch_size1、num_workers4。带 ImageNet 预训练的版本如 bisenetv1_r18-d32-in1k-pre_4xb4-160k_cityscapes-1024x1024.py仅需在backbone.backbone_cfg.init_cfg中追加Pretrained类型初始化checkpoint 指向open-mmlab://resnet18_v1cCOCO-Stuff 的 R-101 版本则在其 R-101 基线上追加open-mmlab://resnet101_v1c预训练权重见 bisenetv1_r101-d32-in1k-pre_4xb4-160k_coco-stuff164k-512x512.py。4x8版本仅将训练 batch_size 提高至每卡 8对应4xb8是精度与显存开销的折中选项。实验结果与模型库configs/bisenetv1目录下的所有实验条目被汇总在 configs/bisenetv1/metafile.yamlModel Zoo 元数据与 model-index.yml 中涵盖 Cityscapes 与 COCO-Stuff 164k 两个数据集。Cityscapes1024×1024160k 迭代4×V100MethodBackboneCrop SizeLr schdMem (GB)Inf time (fps)DevicemIoUmIoU(msflip)BiSeNetV1R-18-D32 (No Pretrain)1024x10241600005.6931.77V10074.4477.05BiSeNetV1R-18-D321024x10241600005.6931.77V10074.3776.91BiSeNetV1R-18-D32 (4x8)1024x102416000011.1731.77V10075.1677.24BiSeNetV1R-50-D32 (No Pretrain)1024x102416000015.397.71V10076.9278.87BiSeNetV1R-50-D321024x102416000015.397.71V10077.6879.57COCO-Stuff 164k512×512160k 迭代4×V100MethodBackboneCrop SizeLr schdMem (GB)Inf time (fps)DevicemIoUmIoU(msflip)BiSeNetV1R-18-D32 (No Pretrain)512x512160000--V10025.4526.15BiSeNetV1R-18-D32512x5121600006.3374.24V10028.5529.26BiSeNetV1R-50-D32 (No Pretrain)512x512160000--V10029.8230.33BiSeNetV1R-50-D32512x5121600009.2832.60V10034.8835.37BiSeNetV1R-101-D32 (No Pretrain)512x512160000--V10031.1431.76BiSeNetV1R-101-D32512x51216000010.3625.25V10037.3837.99表格说明4x8训练时使用 4 张 GPU、每卡 8 个样本Cityscapes 默认设置为 4 张 GPU、每卡 4 个样本No Pretrain表示从零开始训练init_cfgNone带预训练版本则使用 ImageNet 上预训练的 ResNet v1c 权重。从结果看R-50-D32 相比 R-18-D32 在 Cityscapes 上提升约 3 个点 mIoU但推理速度从约 31 FPS 降至约 7.7 FPSV100直观体现了 BiSeNetV1 速度-精度权衡的定位在 COCO-Stuff 164k 上R-101 带预训练达到最高的 37.38 mIoU。各模型的权重与训练日志可通过 configs/bisenetv1/metafile.yaml 中Weights与Training log字段获取。实战训练、测试与推理仓库提供统一入口脚本所有命令在仓库根目录执行。单卡训练python tools/train.py configs/bisenetv1/bisenetv1_r18-d32-in1k-pre_4xb4-160k_cityscapes-1024x1024.py多卡分布式训练4 卡bash tools/dist_train.sh configs/bisenetv1/bisenetv1_r18-d32-in1k-pre_4xb4-160k_cityscapes-1024x1024.py 4测试评估python tools/test.py configs/bisenetv1/bisenetv1_r18-d32-in1k-pre_4xb4-160k_cityscapes-1024x1024.py /path/to/checkpoint.pthtools/train.py支持的常用参数见 tools/train.py--work-dir指定日志与权重保存目录--resume自动从 work-dir 中最新 checkpoint 恢复训练--amp开启自动混合精度训练--cfg-options以xxxyyy键值对就地覆盖配置--launcher可选none/pytorch/slurm/mpi。单张图片推理可基于仓库提供的 demo/image_demo.py 或更高层的 Inferencer 示例 demo/image_demo_with_inferencer.py 对单张图片进行推理并可视化分割结果例如python demo/image_demo.py demo/demo.png configs/bisenetv1/bisenetv1_r18-d32-in1k-pre_4xb4-160k_cityscapes-1024x1024.py /path/to/checkpoint.pth引用若在研究中使用了 BiSeNetV1请引用原论文inproceedings{yu2018bisenet, title{Bisenet: Bilateral segmentation network for real-time semantic segmentation}, author{Yu, Changqian and Wang, Jingbo and Peng, Chao and Gao, Changxin and Yu, Gang and Sang, Nong}, booktitle{Proceedings of the European conference on computer vision (ECCV)}, pages{325--341}, year{2018} }小结原理BiSeNetV1 通过 Spatial Path 保空间细节、Context Path骨干 GAP ARM扩感受野、FFM 高效融合兼顾速度与精度实现完整代码在 mmseg/models/backbones/bisenetv1.py各子模块均有对应测试用例可验证使用仓库提供 R-18/R-50/R-101 骨干、Cityscapes 与 COCO-Stuff 164k 的完整配置与预训练模型可直接基于 tools/train.py 和 tools/test.py 复现或迁移。【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考