ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

MMsegmentation 中的 BiSeNetV2:实时语义分割双边网络的结构解析与训练配置指南

MMsegmentation 中的 BiSeNetV2:实时语义分割双边网络的结构解析与训练配置指南 MMsegmentation 中的 BiSeNetV2实时语义分割双边网络的结构解析与训练配置指南【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation本指南以 OpenMMLab 语义分割工具箱 mmsegmentation 中的 BiSeNetV2 实现为主线从论文核心思想出发结合仓库内真实源码、配置与测试系统讲解 Detail Branch、Semantic Branch 与 Bilateral Guided Aggregation Layer 的结构细节并完整给出四种 Cityscapes 训练配置变体的参数说明与运行方式。读完本文你将理解 BiSeNetV2 如何在精度与速度之间取得平衡并能直接基于 configs/bisenetv2 目录下的配置完成训练、验证与推理。BiSeNetV2 论文要点为什么双边能兼顾速度与精度BiSeNetV2Bilateral Network with Guided Aggregation for Real-time Semantic Segmentation论文发表于 IJCV对应仓库 configs/bisenetv2/README.md 的 Abstract针对实时语义分割中的一对核心矛盾提出解法低层细节与高层语义都不可或缺语义分割既需要精细的边缘与纹理低层细节又需要类别层面的上下文理解高层语义既有方案为提速往往牺牲细节传统实时方法几乎总是通过降低低层细节来换取推理速度导致精度明显下降。该架构的核心主张是将空间细节与类别语义分开处理从而同时获得高精度与高效率Detail Branch细节分支通道宽、层数浅用于捕获低层细节生成高分辨率特征表示Semantic Branch语义分支通道窄、层数深用于获取高层语义上下文由于缩减了通道容量并采用快速下采样策略语义分支非常轻量Guided Aggregation Layer引导聚合层增强两条分支的相互联系融合两类特征Booster 训练策略助推训练在训练阶段额外监督中间特征不增加任何推理开销即可提升分割精度。论文在 2048×1024 输入下于 Cityscapes 测试集取得 72.6% mIoU并在单张 NVIDIA GeForce GTX 1080 Ti 上达到 156 FPS。注意该数字来自论文原始陈述仓库 README 的 Results 表格中给出的则是 mmsegmentation 复现实验下文有完整表格。仓库实现mmseg 中 BiSeNetV2 的模块级结构mmsegmentation 将 BiSeNetV2 作为 Backbone 实现源码位于 mmseg/models/backbones/bisenetv2.py并通过MODELS.register_module()注册见该文件第 544-545 行配置中以typeBiSeNetV2直接引用。从源码结构看整个骨干网络由以下模块按顺序组合而成BiSeNetV2 ├── DetailBranch细节分支 │ └── 3 个 stage每 stage 由 stride2 的下采样卷积 stride1 的普通卷积堆叠 ├── SemanticBranch语义分支 │ ├── StemBlockstem1入口模块含 stride2 卷积、1×1 卷积 3×3 卷积、MaxPool 分支与融合卷积 │ ├── GELayer ×Nstem2~4 内部Gather-and-Expansion 层等价于倒残差Inverted Residual结构 │ └── CEBlockstage4 之后Context Embedding Block用全局池化注入大感受野上下文 └── BGALayerBilateral Guided Aggregation Layer └── 将 Detail Branch 输出与 Semantic Branch 最后一级输出融合产出分割头输入特征DetailBranch宽通道、浅层、高分辨率DetailBranch 默认三阶段通道数为(64, 64, 128)。每个阶段都以stride2的 3×3 卷积做下采样随后接 12 个stride1的 3×3 卷积。全程保持较高分辨率输入 1024×1024 时输出为 128×128 附近用于保留空间细节。构造时逐个阶段存入nn.ModuleList前向时依次通过forward见第 96-99 行。SemanticBranch窄通道、深层、轻量化SemanticBranch 默认四阶段通道数为(16, 32, 64, 128)逐级快速下采样到 1/8、1/16、1/32。内部使用两类基础模块StemBlock源码先做 stride2 卷积再分两条路径——一条是 1×13×3 卷积另一条是 MaxPool2d——最后把两条路径拼接并通过 1×1 融合卷积输出GELayer源码Gather-and-Expansion 层其结构与 MobileNetV2 的倒残差一致conv1(3×3) → dwconv(3×3, groupsin_channels, 通道扩展 exp_ratio 倍) → conv2(1×1)并带有残差连接。stride2 时 shortcut 使用深度可分离卷积对齐分辨率与通道数CEBlock源码Context Embedding Block通过AdaptiveAvgPool2d((1,1))提取全局上下文后与原始特征相加再经 3×3 卷积输出为语义分支补足大感受野。semantic_expansion_ratio6控制 GELayer 中间通道的扩展倍数mid_channel in_channels * exp_ratio见第 211 行。SemanticBranch 前向会输出每一级特征列表第 424-430 行这正是 Booster 辅助头所需的中间特征。BGALayer双向引导聚合BGALayer 接收 Detail Branch 的输出x_d与 Semantic Branch 最后一级输出x_s其融合逻辑forward第 523-541 行分两步对细节特征做深度可分离卷积与下采样对语义特征做卷积与深度可分离卷积用语义特征经sigmoid后作为门控去调制细节特征detail_dwconv * torch.sigmoid(semantic_conv)两条调制路径相加后经 3×3 卷积输出——即语义引导细节、细节反哺语义的双向聚合。最终 BiSeNetV2.forward 将 BGA 输出与语义分支前几级特征拼接成 5 个输出out_indices(0,1,2,3,4)outs[0]给主分割头outs[1..4]分别给 4 个辅助头。模型配置逐项解析configs/base/models/bisenetv2.py所有 BiSeNetV2 配置都继承自基础模型配置 configs/base/models/bisenetv2.py。其完整结构如下norm_cfg dict(typeSyncBN, requires_gradTrue) data_preprocessor dict( typeSegDataPreProcessor, mean[123.675, 116.28, 103.53], std[58.395, 57.12, 57.375], bgr_to_rgbTrue, pad_val0, seg_pad_val255) model dict( typeEncoderDecoder, data_preprocessordata_preprocessor, pretrainedNone, backbonedict( typeBiSeNetV2, detail_channels(64, 64, 128), semantic_channels(16, 32, 64, 128), semantic_expansion_ratio6, bga_channels128, out_indices(0, 1, 2, 3, 4), init_cfgNone, align_cornersFalse), decode_headdict( typeFCNHead, in_channels128, in_index0, channels1024, num_convs1, concat_inputFalse, dropout_ratio0.1, num_classes19, norm_cfgnorm_cfg, align_cornersFalse, loss_decodedict( typeCrossEntropyLoss, use_sigmoidFalse, loss_weight1.0)), auxiliary_head[ ... 4 个 FCNHead ... ], train_cfgdict(), test_cfgdict(modewhole))关键配置项含义如下配置段参数默认值作用backbonedetail_channels(64, 64, 128)Detail Branch 各阶段通道数backbonesemantic_channels(16, 32, 64, 128)Semantic Branch 各阶段通道数backbonesemantic_expansion_ratio6GELayer 中间通道扩展倍数backbonebga_channels128BGALayer 中间通道数backboneout_indices(0,1,2,3,4)输出 5 级特征1 个 BGA 融合特征 4 个语义中间特征decode_headtypeFCNHead主分割头输入 BGA 输出128 通道decode_headnum_convs1/dropout_ratio0.1主头为单卷积 10% dropoutauxiliary_head4 ×FCNHead通道16/32/64/128Booster 助推头分别监督语义分支各级中间特征test_cfgmodewhole整图推理不做滑窗其中 Booster 策略在代码层面的体现就是auxiliary_head列表——4 个 FCNHead 分别挂在 Semantic Branch 的 stem2/stem3/stem4/CEBlock 输出上对应in_index1,2,3,4训练时产生额外梯度推理时这些分支不参与计算因此不增加任何推理开销。主头与辅助头均使用CrossEntropyLossuse_sigmoidFalse, loss_weight1.0。四种 Cityscapes 训练配置变体仓库 configs/bisenetv2 目录下共提供 4 个可直接运行/复现的训练配置全部基于 Cityscapes 数据集输入裁剪尺寸 1024×1024训练 160k iterations。1. 基线bisenetv2_fcn_4xb4-160k_cityscapes-1024x1024.pyconfigs/bisenetv2/bisenetv2_fcn_4xb4-160k_cityscapes-1024x1024.py 是该系列的标准配置继承自 4 个_base_文件_base_ [ ../_base_/models/bisenetv2.py, ../_base_/datasets/cityscapes_1024x1024.py, ../_base_/default_runtime.py, ../_base_/schedules/schedule_160k.py ] crop_size (1024, 1024) data_preprocessor dict(sizecrop_size) model dict(data_preprocessordata_preprocessor) param_scheduler [ dict(typeLinearLR, by_epochFalse, start_factor0.1, begin0, end1000), dict(typePolyLR, eta_min1e-4, power0.9, begin1000, end160000, by_epochFalse) ] optimizer dict(typeSGD, lr0.05, momentum0.9, weight_decay0.0005) optim_wrapper dict(typeOptimWrapper, optimizeroptimizer) train_dataloader dict(batch_size4, num_workers4) val_dataloader dict(batch_size1, num_workers4) test_dataloader val_dataloader要点解读学习率调度前 1000 iter 用LinearLR从0.1×lr线性升温warmup之后PolyLRpower0.9, eta_min1e-4衰减至 160000 iter优化器SGDlr0.05, momentum0.9, weight_decay0.0005注意这里在继承schedule_160k.py中默认lr0.01的基础上覆写为0.05数据流水线来自 configs/base/datasets/cityscapes_1024x1024.pyRandomResize(scale(2048,1024), ratio_range(0.5,2.0)) → RandomCrop(1024×1024, cat_max_ratio0.75) → RandomFlip(0.5) → PhotoMetricDistortion测试阶段按 (2048, 1024) 保持比例缩放后整图推理训练循环来自 configs/base/schedules/schedule_160k.pyIterBasedTrainLoop(max_iters160000, val_interval16000)即每 16000 iter 验证一次4xb4含义4 张 GPU × 每卡 batch_size4总 batch size 16metafile 中记录为 Batch Size 16。2. OHEM 变体bisenetv2_fcn_4xb4-ohem-160k_cityscapes-1024x1024.pyconfigs/bisenetv2/bisenetv2_fcn_4xb4-ohem-160k_cityscapes-1024x1024.py 在基线基础上引入Online Hard Example MiningOHEM在线难样本挖掘主头与 4 个辅助头均配置samplerdict(typeOHEMPixelSampler, thresh0.7, min_kept10000)即损失计算时只保留预测概率低于阈值0.7的困难像素且每张图至少保留10000个像素参与回传。该变体在 Cityscapes 上 mIoU 由 73.21 提升至73.57。3. 混合精度AMP/FP16bisenetv2_fcn_4xb4-amp-160k_cityscapes-1024x1024.pyconfigs/bisenetv2/bisenetv2_fcn_4xb4-amp-160k_cityscapes-1024x1024.py 极简地覆写优化器包装器_base_ ./bisenetv2_fcn_4xb4-160k_cityscapes-1024x1024.py optim_wrapper dict( _delete_True, typeAmpOptimWrapper, optimizerdict(typeSGD, lr0.05, momentum0.9, weight_decay0.0005), loss_scale512.)_delete_True表示删除继承来的OptimWrapper改用AmpOptimWrapper自动混合精度loss_scale512。效果上显存占用从 7.64 GB 降至5.77 GB推理速度从 31.77 FPS 提升至 36.65 FPSV100mIoU 基本持平73.07 vs 73.21。4. 更大 batchbisenetv2_fcn_4xb8-160k_cityscapes-1024x1024.pyconfigs/bisenetv2/bisenetv2_fcn_4xb8-160k_cityscapes-1024x1024.py 仅将train_dataloader.batch_size由 4 改为8即 4 卡 × 8 总 batch 32。更大的 batch 带来明显精度增益mIoU 由 73.21 提升至75.76msflip 达 77.79代价是显存翻倍至 15.05 GB。实验结果一览Cityscapes下表完整继承自 configs/bisenetv2/README.md 的 Results 章节为 mmsegmentation 在 4×V100 上的复现结果MethodBackboneCrop SizeLr schdMem (GB)Inf time (fps)DevicemIoUmIoU(msflip)configdownloadBiSeNetV2BiSeNetV21024x10241600007.6431.77V10073.2175.74configmodel | logBiSeNetV2BiSeNetV2 (OHEM)1024x10241600007.64-V10073.5775.80configmodel | logBiSeNetV2BiSeNetV2 (4x8)1024x102416000015.05-V10075.7677.79configmodel | logBiSeNetV2BiSeNetV2 (FP16)1024x10241600005.7736.65V10073.0775.13configmodel | log表格备注继承自 READMEOHEM训练中采用在线难样本挖掘FP16训练中采用混合精度FP164x84 张 GPU、每卡 8 个样本进行训练。上述模型的元数据训练数据、batch size、显存、权重与日志地址同时维护在 configs/bisenetv2/metafile.yaml 中供模型索引与自动下载使用。如何训练、测试与推理在 mmsegmentation 中使用以下命令以tools/dist_train.sh/tools/dist_test.sh为例即可复现上述实验# 4 卡分布式训练与官方复现环境一致 bash tools/dist_train.sh configs/bisenetv2/bisenetv2_fcn_4xb4-160k_cityscapes-1024x1024.py 4 # 单卡训练 python tools/train.py configs/bisenetv2/bisenetv2_fcn_4xb4-160k_cityscapes-1024x1024.py # 测试并输出 mIoU加载官方权重或自训权重 python tools/test.py configs/bisenetv2/bisenetv2_fcn_4xb4-160k_cityscapes-1024x1024.py /path/to/checkpoint.pth --out results.pkl推理阶段由test_cfg dict(modewhole)控制为整图直接前向不做滑窗切块这与 BiSeNetV2 面向实时场景的设计一致。若要验证模型的输出形状与实现正确性可参考单元测试 tests/test_models/test_backbones/test_bisenetv2.py该测试以(2, 3, 128, 256)输入验证 backbone 输出 5 级特征并断言各输出张量形状——feat[0]为[2, 128, 16, 32]BGA 融合特征供主分割头feat[1..4]分别为[2,16,32,64]、[2,32,16,32]、[2,64,8,16]、[2,128,4,8]供 4 个 Booster 辅助头同时覆盖了 DetailBranch、SemanticBranch、BGALayer 三个子模块的独立测试。引用若在研究中使用了 BiSeNetV2 或本仓库实现可引用以下文献来自 configs/bisenetv2/README.md 的 Citation 章节article{yu2021bisenet, title{Bisenet v2: Bilateral network with guided aggregation for real-time semantic segmentation}, author{Yu, Changqian and Gao, Changxin and Wang, Jingbo and Yu, Gang and Shen, Chunhua and Sang, Nong}, journal{International Journal of Computer Vision}, pages{1--18}, year{2021}, publisher{Springer} }【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表