【免费下载链接】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.
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 的构造函数签名,各参数含义如下:
| 参数 | 配置值 | 源码默认值 | 含义 |
|---|---|---|---|
type | MobileSeg | - | 模型类型,注册在 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_ch | 128 | 64 | 最后一个上下文模块的输出通道数 |
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)的调用链为:
- 骨干网络输出多阶段特征
feats_backbone(例如 [x4, x8, x16, x32]); - 按
backbone_indices选出特征层(默认取后 3 个); - 送入
MobileSegHead得到精炼后的特征序列; - 训练阶段:每个精炼特征分别过一个
SegHead输出 logits,三个头的结果都上采样回原图尺寸,与配置中 3 个 OhemCrossEntropyLoss 一一对应,形成深度监督; - 推理阶段:只使用第一个(分辨率最高的)分割头输出,减少计算量。
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 迭代)精度如下:
| Model | Backbone | Resolution | Training Iters | mIoU | mIoU (flip) | mIoU (ms+flip) |
|---|---|---|---|---|---|---|
| MobileSeg | MobileNetV2 | 1024x512 | 80000 | 73.94% | 74.32% | 75.33% |
| MobileSeg | MobileNetV3_large_x1_0 | 1024x512 | 80000 | 73.47% | 73.72% | 74.70% |
| MobileSeg | Lite_HRNet_18 | 1024x512 | 80000 | 70.75% | 71.62% | 72.40% |
| MobileSeg | ShuffleNetV2_x1_0 | 1024x512 | 80000 | 69.46% | 70.00% | 70.90% |
| MobileSeg | GhostNet_x1_0 | 1024x512 | 80000 | 71.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 越高越快):
| Model | Backbone | V100 TRT Inference Speed (FPS) | Snapdragon 855 Inference Speed (FPS) |
|---|---|---|---|
| MobileSeg | MobileNetV2 | 67.57 | 27.01 |
| MobileSeg | MobileNetV3_large_x1_0 | 67.39 | 32.90 |
| MobileSeg | Lite_HRNet_18 | 10.5 | 13.05 |
| MobileSeg | ShuffleNetV2_x1_0 | 37.09 | 39.61 |
| MobileSeg | GhostNet_x1_0 | 35.58 | 38.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.
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



