PaddleSeg MobileSeg 轻量化语义分割模型全解析:架构、配置与移动端部署实战

  • 人工智能
  • 计算机视觉
  • 预训练

【免费下载链接】PaddleSeg

Easy-to-use image segmentation library with awesome pre-trained model zoo, supporting wide-range of practical tasks in Semantic Segmentation, Interactive Segmentation, Panoptic Segmentation, Image Matting, 3D Segmentation, etc.

项目地址: https://gitcode.com/gh_mirrors/pa/PaddleSeg
点击查看 免费下载

MobileSeg 是 PaddleSeg 中面向移动端与边缘设备的语义分割模型系列,采用「轻量骨干 + 编解码」架构,能够在 X86 CPU、ARM CPU 等低算力硬件上运行,同时保持可观的分割精度。本文以 QualityInspector 工业质检方案中 MobileSeg 的模型卡片与配置文件为骨架,结合仓库源码深入讲解其架构设计、五种轻量骨干、Cityscapes 精度与推理速度实测数据,并给出基于配置文件完成训练与验证的完整实操路径。

MobileSeg 是什么:为低算力硬件而生的分割模型

MobileSeg 系列模型的设计目标非常明确:在算力受限的设备(X86 CPU、ARM CPU、移动端 SoC)上提供可用的实时语义分割能力。与依赖 ResNet 等重型骨干的语义分割模型不同,MobileSeg 采用编码器-解码器架构,并使用轻量级网络作为编码器(骨干网络),从而把计算量压缩到移动端可以接受的范围。

在 PaddleSeg 仓库中,MobileSeg 的实现位于 paddleseg/models/mobileseg.py,并在两个位置提供了配套配置:主仓库 configs/mobileseg 与工业质检解决方案 contrib/QualityInspector/configs/seg/mobileseg(本文主体即后者,其中包含模型卡片 README.md 与 README_cn.md)。

MobileSeg 系列一共提供了 5 种轻量骨干的配置,覆盖了当前轻量 CNN 设计的几条主流技术路线:

骨干网络核心技术路线
MobileNetV2倒残差(Inverted Residual)与线性瓶颈(Linear Bottleneck)
MobileNetV3_large_x1_0基于 NAS 搜索 + 硬件感知的 MobileNetV3
ShuffleNetV2_x1_0通道混洗(Channel Shuffle)与实用设计指南
Lite_HRNet_18轻量级高分辨率网络
GhostNet_x1_0廉价操作生成更多特征(Ghost Module)

参考论文与设计渊源

MobileSeg 的骨干选择并非随意拼凑,而是对应五篇有代表性的轻量网络论文(出自 README_cn.md 的参考论文列表):

  • Sandler et al., "Mobilenetv2: Inverted residuals and linear bottlenecks." CVPR 2018.
  • Howard et al., "Searching for mobilenetv3." ICCV 2019.
  • Ma et al., "Shufflenet v2: Practical guidelines for efficient cnn architecture design." ECCV 2018.
  • Yu et al., "Lite-hrnet: A lightweight high-resolution network." CVPR 2021.
  • Han et al., "Ghostnet: More features from cheap operations." CVPR 2020.

这些论文分别从**卷积分解(深度可分离卷积)、结构搜索(NAS)、通道操作(Shuffle)、高分辨率特征保持(HRNet 轻量化)、特征冗余压缩(Ghost)**等不同角度降低计算量,为 MobileSeg 提供了多样化的骨干选择。

配置文件深度拆解:以 5 个 yml 为例

QualityInspector 的 configs/seg/mobileseg 目录下存放了 5 个训练配置文件,分别对应 5 种骨干。所有配置共用同一个基础文件 cityscapes.yml,通过 _base_ 机制继承,仅需覆盖骨干相关字段,体现了 PaddleSeg 配置体系的复用设计。

通用训练超参(5 个配置完全一致)

以 mobileseg_mobilenetv2_cityscapes_1024x512_80k.yml 为例,通用部分如下:

_base_: '../_base_/cityscapes.yml'

batch_size: 4
iters: 80000

optimizer:
  weight_decay: 5.0e-4

lr_scheduler:
  warmup_iters: 1000
  warmup_start_lr: 1.0e-5
  learning_rate: 0.005

loss:
  types:
    - type: OhemCrossEntropyLoss
      min_kept: 130000
    - type: OhemCrossEntropyLoss
      min_kept: 130000
    - type: OhemCrossEntropyLoss
      min_kept: 130000
  coef: [1, 1, 1]

train_dataset:
  transforms:
    - type: ResizeStepScaling
      min_scale_factor: 0.5
      max_scale_factor: 2.0
      scale_step_size: 0.25
    - type: RandomPaddingCrop
      crop_size: [1024, 512]
    - type: RandomHorizontalFlip
    - type: RandomDistort
      brightness_range: 0.5
      contrast_range: 0.5
      saturation_range: 0.5
    - type: Normalize
  mode: train

关键点解读:

  • batch_size: 4:单卡每轮迭代处理的样本量。GhostNet 配置中还注释了 "use 4 GPU in default"(见 mobileseg_ghostnet_cityscapes_1024x512_80k.yml),说明该配置默认面向 4 卡训练。
  • iters: 80000:总训练步数,对应配置文件与模型名中的 80k。
  • optimizer.weight_decay: 5.0e-4:L2 正则系数,比基础配置 cityscapes.yml 中的 4.0e-5 高一个数量级,属于 MobileSeg 特有的调优设定。
  • lr_scheduler:覆盖了基础配置,采用 warmup_iters: 1000 线性预热,从 warmup_start_lr: 1.0e-5 起步,最终学习率为 0.005;基础配置默认的 PolynomialDecay(power=0.9)调度方式仍然生效。
  • loss:使用 3 个 OhemCrossEntropyLoss(在线难例挖掘交叉熵),min_kept: 130000 表示每个 batch 保留的最小难例数量,coef: [1, 1, 1] 对应三个分割头的损失权重。三个头分别监督不同分辨率的输出(详见下文源码分析)。
  • train_dataset.transforms:依次为多尺度随机缩放(0.5~2.0 倍、步长 0.25)、随机填充裁剪到 1024x512、随机水平翻转、随机色彩扰动(亮度/对比度/饱和度范围 0.5)与归一化,与 cityscapes.yml 基础配置一致,仅色彩扰动范围由 0.4 放宽到 0.5。

模型部分:MobileSeg 的核心可调参数

每个配置的 model 段是 MobileSeg 区别于其他分割模型的关键:

model:
  type: MobileSeg
  backbone:
    type: MobileNetV2_x1_0 # out channels: [24, 32, 96, 320]
    pretrained: https://paddleseg.bj.bcebos.com/dygraph/backbone/mobilenetv2_x1_0_ssld.tar.gz
  cm_bin_sizes: [1, 2, 4]
  cm_out_ch: 128
  arm_out_chs: [32, 64, 128]
  seg_head_inter_chs: [32, 32, 32]

对照 mobileseg.py 的构造函数签名,各参数含义如下:

参数配置值源码默认值含义
typeMobileSeg-模型类型,注册在 paddleseg.cvlibs.manager 的 MODELS 中
backbone.type五种轻量骨干之一-编码器,必须暴露 feat_channels 属性(源码第 62-63 行的断言依赖它)
backbone_indices默认 [1, 2, 3](Lite_HRNet 显式配置 [0, 1, 2])[1, 2, 3]从骨干多阶段输出中选取哪些特征层送入解码器
cm_bin_sizes[1, 2, 4][1, 2]上下文模块(Context Module)的池化 bin 尺寸
cm_out_ch12864最后一个上下文模块的输出通道数
arm_out_chs[32, 64, 128][32, 48, 64]每个注意力精炼模块(ARM)的输出通道数
seg_head_inter_chs[32, 32, 32][32, 32, 32]每个分割头的中间通道数

五种骨干的配置差异集中在 backbone 段(各骨干输出通道已注释在 yml 中):

  • MobileNetV2_x1_0(配置):输出通道 [24, 32, 96, 320],预训练权重 mobilenetv2_x1_0_ssld.tar.gz(SSLD 蒸馏版)。
  • MobileNetV3_large_x1_0(配置):输出通道 [24, 40, 112, 160]。
  • GhostNet_x1_0(配置):输出通道 [24, 40, 112, 160]。
  • ShuffleNetV2_x1_0(配置):输出通道 [24, 116, 232, 464]。
  • Lite_HRNet_18(配置):特殊之处在于额外配置了 use_head: True 与 backbone_indices: [0, 1, 2]。yml 中注释说明:use_head: False 时输出通道为 [40, 80, 160, 320],True 时为 [40, 40, 80, 160];取前 3 个特征层送入解码器。

源码级原理:MobileSeg 的解码器如何工作

MobileSeg 的「轻」不只体现在骨干,更体现在解码器。从 mobileseg.py 可以清晰看到其三级结构。

整体流程(forward)

MobileSeg.forward(L99-L124)的调用链为:

  1. 骨干网络输出多阶段特征 feats_backbone(例如 [x4, x8, x16, x32]);
  2. 按 backbone_indices 选出特征层(默认取后 3 个);
  3. 送入 MobileSegHead 得到精炼后的特征序列;
  4. 训练阶段:每个精炼特征分别过一个 SegHead 输出 logits,三个头的结果都上采样回原图尺寸,与配置中 3 个 OhemCrossEntropyLoss 一一对应,形成深度监督;
  5. 推理阶段:只使用第一个(分辨率最高的)分割头输出,减少计算量。

MobileSegHead:上下文 + 注意力精炼

MobileSegHead(L131-L218)包含一个 MobileContextModule 和一组 ARM(Attention Refinement Module):

  • MobileContextModule(L221-L277):对最高层特征按 cm_bin_sizes 做多尺度自适应平均池化(AdaptiveAvgPool2D),每个尺度经 1x1 卷积后双线性上采样回原尺寸并逐元素相加,最后过一层可分离卷积 SeparableConvBNReLU 输出 cm_out_ch 通道。这就是配置中 cm_bin_sizes: [1, 2, 4] 与 cm_out_ch: 128 的作用位置——用三个不同大小的 bin 捕获不同尺度的上下文。
  • ARM(UAFMMobile):源码中通过 arm_type 字符串从 paddleseg.models.layers 动态查找(eval("layers." + arm_type)),默认 UAFMMobile。每个 ARM 接收低层特征 low_chs 与高层特征 high_ch,输出 arm_out_chs[i] 通道,完成从深层到浅层的逐级精炼(reversed(range(...)) 循环,见 L197-L201)。

SegHead:轻量分割头

SegHead(L280-L297)结构极简:一个 3x3 可分离卷积(SeparableConvBNReLU,输入 in_chan、中间 mid_chan)加一个 1x1 普通卷积直接输出 n_classes 通道。配置中的 seg_head_inter_chs: [32, 32, 32] 即三个头的 mid_chan。

整个解码器没有使用任何普通 3x3 卷积,全部替换为可分离卷积,这正是 MobileSeg 在移动端提速的关键设计之一。骨干的 feat_channels 属性是 MobileSeg 正常工作的前提(L62-L69 有严格断言),各轻量骨干(如 ghostnet.py、lite_hrnet.py)都在代码中维护了这一列表。

Cityscapes 分割精度实测(80k 迭代)

来自 README_cn.md 的 Cityscapes 数据集(1024x512 分辨率、80000 迭代)精度如下:

ModelBackboneResolutionTraining ItersmIoUmIoU (flip)mIoU (ms+flip)
MobileSegMobileNetV21024x5128000073.94%74.32%75.33%
MobileSegMobileNetV3_large_x1_01024x5128000073.47%73.72%74.70%
MobileSegLite_HRNet_181024x5128000070.75%71.62%72.40%
MobileSegShuffleNetV2_x1_01024x5128000069.46%70.00%70.90%
MobileSegGhostNet_x1_01024x5128000071.88%72.22%73.11%

其中 mIoU (flip) 为水平翻转测试增强(TTA)后的结果,mIoU (ms+flip) 为多尺度 + 翻转增强后的结果。可以观察到:MobileNetV2 在 5 个骨干中精度最高(73.94%),ShuffleNetV2 精度最低(69.46%)但速度最快,MobileNetV3 与 GhostNet 则位于精度-速度平衡带中。原文档还提供了每个模型的权重、训练日志与 VisualDL 可视化链接,可直接用于复现与对比。

推理速度实测:GPU 与移动端双平台

来自 README_cn.md 的推理速度数据(FPS 越高越快):

ModelBackboneV100 TRT Inference Speed (FPS)Snapdragon 855 Inference Speed (FPS)
MobileSegMobileNetV267.5727.01
MobileSegMobileNetV3_large_x1_067.3932.90
MobileSegLite_HRNet_1810.513.05
MobileSegShuffleNetV2_x1_037.0939.61
MobileSegGhostNet_x1_035.5838.74

测试条件(务必注意,两组速度不可直接横向比较):

  • Nvidia GPU V100:使用 PaddleInference Python 接口,开启 TensorRT,推理数据类型为 FP32,输入维度 1x3x1024x2048(Cityscapes 原始分辨率)。
  • 骁龙 855(如小米 9):使用 PaddleLite C++ 接口,单线程,输入维度 1x3x256x256。

从数据可以看出:在移动端(骁龙 855 单线程)场景,MobileNetV3_large 获得最高的 32.90 FPS,同时保持 73.47% 的 mIoU,是文档中加粗推荐的移动端选择;ShuffleNetV2 在移动端也达到 39.61 FPS。而 Lite_HRNet 因保持高分辨率特征,在 GPU 上仅 10.5 FPS,是 5 者中最慢的——这正是其精度策略(高分辨率)与速度的权衡结果。

如何在 QualityInspector 中训练与验证

QualityInspector 的算法训练入口在 tools/seg(det/seg 两套工具),完整使用说明见 train_eval.md。以 OCRNet 为例的同类分割任务命令格式为(MobileSeg 配置同样适用):

# 单卡训练(含评估)
python3 tools/seg/train.py --config configs/seg/mobileseg/mobileseg_mobilenetv2_cityscapes_1024x512_80k.yml --do_eval --use_vdl --save_interval 1000 --save_dir ./output/

# 多卡训练
CUDA_VISIBLE_DEVICES=0,1 python3 -m paddle.distributed.launch --config configs/seg/mobileseg/mobileseg_mobilenetv2_cityscapes_1024x512_80k.yml --do_eval --use_vdl --save_interval 1000 --save_dir ./output/

# 单独验证
python3 tools/seg/val.py --config configs/seg/mobileseg/mobileseg_mobilenetv2_cityscapes_1024x512_80k.yml --model_path ./output/best_model/model.pdparams

要点:

  • 训练前需按 cityscapes.yml 中 dataset_root: data/cityscapes 的约定准备好 Cityscapes 数据,并保证训练/验证集配置齐全(基础配置已包含 val_dataset)。
  • --do_eval 在训练中定期评估,--save_interval 1000 控制 checkpoint 保存频率,--use_vdl 开启 VisualDL 可视化(与 README 中提供的 vdl 链接对应)。
  • 若要在非 Cityscapes 的质检数据集上使用 MobileSeg,只需替换 _base_ 为其他数据集配置(configs/seg/base 目录下已提供 ade20k.yml、mtile_dataset.yml 等),并修改 num_classes 与数据集路径即可,架构参数无需变动。

小结:如何为你的场景选骨干

结合精度、速度与源码结构,MobileSeg 的选型建议可总结为:

  • 追求移动端最高帧率:选 ShuffleNetV2(855 上 39.61 FPS)或 MobileNetV3_large(32.90 FPS + 73.47% mIoU 的综合最优);
  • 追求轻量模型里的最高精度:选 MobileNetV2(73.94% mIoU),它在 GPU 上 67.57 FPS 同样可观;
  • 需要高分辨率细节(如小目标缺陷):可尝试 Lite_HRNet_18,但要接受其速度代价;
  • 全部 5 个配置共享同一套解码器参数(cm_bin_sizes、cm_out_ch、arm_out_chs、seg_head_inter_chs),意味着只需改 backbone 字段即可在五种轻量骨干间自由切换,便于在真实设备上做精度-速度的快速横评。

如需进一步了解配置文件各字段的通用语义(batch_size、optimizer、loss、model、export 等),可参考 configs/seg/README.md 中的配置项说明。

  • 人工智能
  • 计算机视觉
  • 预训练

【免费下载链接】PaddleSeg

Easy-to-use image segmentation library with awesome pre-trained model zoo, supporting wide-range of practical tasks in Semantic Segmentation, Interactive Segmentation, Panoptic Segmentation, Image Matting, 3D Segmentation, etc.

项目地址: https://gitcode.com/gh_mirrors/pa/PaddleSeg
点击查看 免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值