ARTICLE DETAIL

资讯详情

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

MMSegmentation 中的 ERFNet:高效残差分解卷积实时语义分割实现与配置指南

MMSegmentation 中的 ERFNet:高效残差分解卷积实时语义分割实现与配置指南 MMSegmentation 中的 ERFNet高效残差分解卷积实时语义分割实现与配置指南【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation导读本文以 MMSegmentation 仓库中 configs/erfnet/README.md 为主线系统讲解 ERFNetEfficient Residual Factorized ConvNet这一面向实时语义分割的高效架构包括其论文核心思想、在 MMSegmentation 中的源码实现、完整的 Cityscapes 训练配置、实验结果复现要点以及基于仓库测试用例的验证方法。读完本文你将掌握如何在 MMSegmentation 中读懂、配置、训练与测试 ERFNet并理解其残差连接 分解卷积背后的效率来源。1. 模型背景面向智能驾驶的实时语义分割ERFNet 由 Romera 等人提出发表于 IEEE Transactions on Intelligent Transportation Systems2017核心目标是在嵌入式设备上以实时速度完成高精度像素级语义分割为智能车辆Intelligent Vehicles, IVs的场景理解提供统一方案。论文摘要指出当时的 SOTA 分割方法在精度与计算资源之间缺乏良好平衡难以部署到真实车辆。ERFNet 的核心创新在于提出了一种新型网络层——使用残差连接residual connections与分解卷积factorized convolutions在保持精度接近 SOTA 的同时将计算量降低数个量级。论文报告在单张 Titan X 上可运行超过 83 FPS在 Jetson TX1 嵌入式设备上可达 7 FPS。这一效率与精度的权衡使其成为 IV 场景理解的理想方案。MMSegmentation 将该算法完整实现包括 backbonemmseg/models/backbones/erfnet.py与配套的 Cityscapes 训练配置模型元数据记录于 configs/erfnet/metafile.yaml。2. 架构剖析三大基本模块的源码实现从 mmseg/models/backbones/erfnet.py 的源码结构看ERFNet backbone 由三种基本模块组成对应论文中分解卷积 残差 高效下采样/上采样的设计2.1 DownsamplerBlock下采样块DownsamplerBlockerfnet.py#L11-L65与常规 ConvModule 不同它将一个 stride2 的 3×3 卷积与一个 stride2 的 MaxPool 的输出拼接concatenate后再过 BatchNorm 与 ReLU。关键实现点卷积输出通道为out_channels - in_channels池化保留in_channels通道拼接后恰好为out_channels池化结果通过resize(..., modebilinear)与卷积输出对齐尺寸。测试用例 tests/test_models/test_backbones/test_erfnet.py#L120-L127 验证了DownsamplerBlock(16, 64)的 conv 输出为 48 通道64-16、BN 参数长度为 64、池化核与步长为 2。2.2 NonBottleneck1d非瓶颈一维分解卷积块NonBottleneck1derfnet.py#L68-L145是 ERFNet 效率的核心它将标准 3×3 卷积分解为3×1 与 1×3 两个一维卷积显著减少参数量与计算量并通过残差连接output self.act(output input)保持梯度流通。实现细节每个 block 默认包含num_conv_layer2组3×1 → 1×3卷积对第二组卷积可设置空洞率dilation默认 1用于在不增加参数的情况下扩大感受野第一组后接激活第二组后接nn.Dropout(pdrop_rate)drop_rate默认 0实现随机深度式的正则化效果。2.3 UpsamplerBlock上采样块UpsamplerBlockerfnet.py#L148-L191使用nn.ConvTranspose2d转置卷积kernel3, stride2, output_padding1将特征图尺寸翻倍随后接 BN 与 ReLU测试用例验证了其通道变化如 64→16。2.4 ERFNet 主网络编码器-解码器组装逻辑ERFNet类erfnet.py#L194-L329通过nn.ModuleList组装编码器与解码器编码器1 个 DownsamplerBlock3→16 通道 5 个 NonBottleneck1d64 通道 1 个 DownsamplerBlock64→128 通道 8 个**带不同空洞率2, 4, 8, 16循环两组**的 NonBottleneck1d128 通道解码器2 个 UpsamplerBlock128→64→16 通道每个上采样后接 2 个 NonBottleneck1d输出forward 返回[x]最终特征图为 16 通道供后续解码头使用。构造时有多条assert一致性校验erfnet.py#L246-L269例如编码器下采样块数量必须等于解码器上采样块数量 1、编码器 Non-bottleneck 块数量必须能被空洞率个数整除等。测试用例 tests/test_models/test_backbones/test_erfnet.py#L38-L117 专门构造了 6 种非法参数组合验证这些断言会被触发保障了配置的正确性。3. 官方配置全解erfnet_fcn_4xb4-160k_cityscapes-512x10243.1 实验配置总览仓库提供的唯一官方模型配置为 configs/erfnet/erfnet_fcn_4xb4-160k_cityscapes-512x1024.py其内容精简通过继承_base_组装而成_base_ [ ../_base_/models/erfnet_fcn.py, ../_base_/datasets/cityscapes.py, ../_base_/default_runtime.py, ../_base_/schedules/schedule_160k.py ] crop_size (512, 1024) data_preprocessor dict(sizecrop_size) model dict(data_preprocessordata_preprocessor) train_dataloader dict(batch_size4, num_workers4) val_dataloader dict(batch_size1, num_workers4) test_dataloader val_dataloader四个基础文件分别定义了模型结构、数据集、运行时与训练计划基础配置作用configs/base/models/erfnet_fcn.py定义 backboneERFNet与解码头FCNHeadconfigs/base/datasets/cityscapes.pyCityscapes 数据集路径、pipeline 与评估指标configs/base/default_runtime.py日志、可视化、checkpoint 钩子等运行时设置configs/base/schedules/schedule_160k.pySGD 优化器与 Poly 学习率策略3.2 模型结构配置详解configs/base/models/erfnet_fcn.py 中 backbone 各参数与源码构造一一对应backbonedict( typeERFNet, in_channels3, # 输入图像通道数RGB enc_downsample_channels(16, 64, 128),# 编码器各级下采样输出通道 enc_stage_non_bottlenecks(5, 8), # 编码器各级 NonBottleneck1d 数量 enc_non_bottleneck_dilations(2, 4, 8, 16), # 末级空洞率序列 enc_non_bottleneck_channels(64, 128),# 编码器各级 NonBottleneck1d 通道数 dec_upsample_channels(64, 16), # 解码器各级上采样输出通道 dec_stages_non_bottleneck(2, 2), # 解码器各级 NonBottleneck1d 数量 dec_non_bottleneck_channels(64, 16), # 解码器各级 NonBottleneck1d 通道数 dropout_ratio0.1, # NonBottleneck1d 中 Dropout 概率 init_cfgNone)解码头Decoder Head的重要设计README 明确指出原论文中的最后一个反卷积层被替换为朴素的FCNHead解码头 双线性上采样层实验发现该替换更有效且更高效。对应的 FCNHead 配置为decode_headdict( typeFCNHead, in_channels16, # 与 backbone 输出的 16 通道特征图匹配 channels128, num_convs1, concat_inputFalse, dropout_ratio0.1, num_classes19, # Cityscapes 的 19 类语义类别 norm_cfgnorm_cfg, # SyncBN align_cornersFalse, loss_decodedict( typeCrossEntropyLoss, use_sigmoidFalse, loss_weight1.0))整体模型类型为EncoderDecoder数据预处理器使用SegDataPreProcessorImageNet 均值/方差、BGR→RGBtrain_cfgdict()、test_cfgdict(modewhole)表示整图推理模式。3.3 训练计划与数据增强配置configs/base/schedules/schedule_160k.py 定义了 160k 迭代训练计划optimizer dict(typeSGD, lr0.01, momentum0.9, weight_decay0.0005) optim_wrapper dict(typeOptimWrapper, optimizeroptimizer, clip_gradNone) param_scheduler [ dict(typePolyLR, eta_min1e-4, power0.9, begin0, end160000, by_epochFalse) ] train_cfg dict(typeIterBasedTrainLoop, max_iters160000, val_interval16000)优化器SGDlr0.01momentum0.9weight_decay0.0005学习率PolyLR 多项式衰减power0.9最低 1e-4按迭代而非 epoch 调度每 16000 次迭代验证一次每 16000 次迭代保存 checkpoint。数据集侧configs/base/datasets/cityscapes.py训练 pipeline 包含RandomResizescale(2048,1024)ratio_range(0.5,2.0)、RandomCropcrop_size(512,1024)cat_max_ratio0.75、RandomFlipprob0.5与PhotoMetricDistortion评估使用IoUMetric的mIoU指标。最终配置将训练 batch_size 设为 44 卡 × 4 16与 metafile 中 Batch Size: 16 一致验证/测试 batch_size 为 1。4. 实验结果与复现要点4.1 Cityscapes 官方结果README 的 Results 表格记录了在 Cityscapes 上的完整结果MethodBackboneCrop SizeLr schdMem (GB)Inf time (fps)DevicemIoUmIoU(msflip)ERFNetERFNet512x10241600006.0415.26V10072.574.75训练资源4× V100 GPU见 configs/erfnet/metafile.yaml模型权重与训练日志可从 metafile 中的 Weights / Training log 字段获取测试时多尺度 水平翻转msflip可将 mIoU 从 72.5 提升至 74.75。4.2 三条复现注意点README 原文要点模型从零训练trained from scratchpretrainedNone、init_cfgNone不使用任何 ImageNet 预训练权重解码器替换原论文最后一个反卷积层被FCNHead 双线性上采样替代原因见 3.2 节对随机种子敏感README 特别强调模型性能对 seed 值敏感如需精确复现表格结果请参考官方日志文件中记录的 seed 设置更换 seed 可能导致结果与表格不一致。5. 训练、测试与推理实践5.1 单机多卡训练使用仓库提供的 tools/dist_train.sh 启动 4 卡训练bash tools/dist_train.sh configs/erfnet/erfnet_fcn_4xb4-160k_cityscapes-512x1024.py 4单卡训练可使用 tools/train.pypython tools/train.py configs/erfnet/erfnet_fcn_4xb4-160k_cityscapes-512x1024.py训练前需按 Cityscapes 数据集约定将数据放置于data/cityscapes/下leftImg8bit/与gtFine/目录结构见 configs/base/datasets/cityscapes.py 的data_prefix设置。5.2 测试与指标复现# 多卡测试 bash tools/dist_test.sh configs/erfnet/erfnet_fcn_4xb4-160k_cityscapes-512x1024.py \ /path/to/erfnet_fcn_4x4_512x1024_160k_cityscapes_20220704_162145-dc90157a.pth 4 # 单卡测试 python tools/test.py configs/erfnet/erfnet_fcn_4xb4-160k_cityscapes-512x1024.py \ /path/to/checkpoint.pth测试 pipeline 对图片 Resize 到 (2048, 1024) 后整图推理test_cfg.modewhole。5.3 单图推理仓库提供 demo/image_demo.py 进行可视化推理python demo/image_demo.py demo/demo.png \ configs/erfnet/erfnet_fcn_4xb4-160k_cityscapes-512x1024.py \ /path/to/checkpoint.pth --out-file result.png6. 源码验证单元测试如何保障实现正确性仓库通过 tests/test_models/test_backbones/test_erfnet.py 对 ERFNet 实现进行了系统性验证标准前向测试以(2, 3, 256, 512)输入断言 backbone 输出形状为(2, 16, 128, 256)——即 16 通道、空间尺寸缩小 4 倍与解码头in_channels16严格匹配同时测试非规整输入尺寸(2, 3, 527, 279)也能正常前向模块级测试逐一验证 DownsamplerBlock 的卷积/池化通道数、NonBottleneck1d 的四组分解卷积通道与 dropout 概率、UpsamplerBlock 的转置卷积通道非法参数断言测试覆盖编码器/解码器通道数、block 数量、空洞率整除性等 6 类不一致配置确保构造期即能发现配置错误。这些测试共同构成了配置参数 → 网络结构 → 输出形状的闭环证据链任何对通道元组或 block 数量的误配要么在构造阶段被 assert 拦截要么在前向阶段输出形状与解码头失配而报错。7. 结语ERFNet 展示了残差连接 分解卷积 高效上采样这一组合在实时语义分割上的巨大潜力。在 MMSegmentation 中其实现被组织为可插拔的 backbonemmseg/models/backbones/erfnet.py与模块化配置configs/erfnet/配合完整的测试用例与 Cityscapes 基准结果既便于研究者复现论文结论也便于在自定义数据集上调整通道数、空洞率、Dropout 等超参快速验证想法。对于嵌入式与自动驾驶场景的落地需求ERFNet 是一个兼具精度与速度的可靠基线。参考文献article{romera2017erfnet, title{Erfnet: Efficient residual factorized convnet for real-time semantic segmentation}, author{Romera, Eduardo and Alvarez, Jos{\e} M and Bergasa, Luis M and Arroyo, Roberto}, journal{IEEE Transactions on Intelligent Transportation Systems}, volume{19}, number{1}, pages{263--272}, year{2017}, publisher{IEEE} }【免费下载链接】mmsegmentationOpenMMLab Semantic Segmentation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表