- 人工智能
- 计算机视觉
- 预训练
【免费下载链接】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.
导读
本文围绕 PaddleSeg 中基于「重新思考 BiSeNet」论文(Rethinking BiSeNet For Real-time Semantic Segmentation,CVPR 2021,美团)实现的STDC-Seg模型展开。它把轻量级 STDC 骨干网络与 BiSeNet 的上下文路径(Context Path)、特征融合模块(FFM)和边界损失结合,在保持实时推理速度的同时显著提升分割精度。读完本文,你将掌握 STDC-Seg 在 Cityscapes 与 Pascal VOC 2012(+Aug) 上的完整配置、训练/验证/导出命令、损失函数与数据增强细节,以及 STDCNet 骨干与STDCSeg网络的源码级实现原理。
一、模型背景与设计动机
STDC-Seg 对应论文:Fan, Mingyuan, Shenqi Lai, Junshi Huang, Xiaoming Wei, Zhenhua Chai, Junfeng Luo, Xiaolin Wei."Rethinking BiSeNet For Real-time Semantic Segmentation."In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition, pp. 9716-9725. 2021。
论文的核心观点是:BiSeNet 中用于提取空间细节的Shortcut Connection(浅层分支)存在大量冗余计算,作者将其替换为更高效的STDC(Short-Term Dense Concatenate)模块,从而在不牺牲精度的前提下进一步降低计算量,使其更适合移动端与实时场景。
在 PaddleSeg 中,STDC-Seg 以两种骨干规模提供:
| 骨干 | 说明 |
|---|---|
| STDC1 | STDCNet(base=64, layers=[2, 2, 2]),stage3/4/5 各 2 个 STDC 模块,计算量更小 |
| STDC2 | STDCNet(base=64, layers=[4, 5, 3]),stage3/4/5 各 4/5/3 个模块,精度更高 |
对应源码见 paddleseg/models/backbones/stdcnet.py:STDC1/STDC2 都是STDCNet工厂函数,仅layers配置不同,其余结构共享。
二、官方 Benchmark 性能
Cityscapes(19 类,1024x512 分辨率)
| Model | Backbone | Resolution | Training Iters | mIoU | mIoU (flip) | mIoU (ms+flip) |
|---|---|---|---|---|---|---|
| STDC1-Seg50 | STDC1 | 1024x512 | 80000 | 74.74% | 75.71% | 76.77% |
| STDC2-Seg50 | STDC2 | 1024x512 | 80000 | 77.60% | 78.32% | 79.09% |
Pascal VOC 2012 + Aug(21 类,512x512 分辨率)
| Model | Backbone | Resolution | Training Iters | mIoU | mIoU (flip) | mIoU (ms+flip) |
|---|---|---|---|---|---|---|
| STDC1-Seg50 | STDC1 | 512x512 | 40000 | 68.06% | 68.48% | 69.26% |
| STDC2-Seg50 | STDC2 | 512x512 | 40000 | 68.98% | 70.07% | 70.72% |
以上数据来自 configs/stdcseg/README.md。三个评测指标的含义:
- mIoU:单尺度推理,输入按训练分辨率缩放后直接计算;
- mIoU (flip):对原图与水平翻转图分别推理后取 logits 平均;
- mIoU (ms+flip):多尺度(含翻转)推理后的融合结果,通常作为最终报告精度。
这些精度由tools/val.py结合paddleseg的评估逻辑复现,相关训练脚本与 TIPC 测试位于 test_tipc。
三、配置文件逐项解读
3.1 Cityscapes:stdc1_seg_cityscapes_1024x512_80k.yml
完整配置见 configs/stdcseg/stdc1_seg_cityscapes_1024x512_80k.yml,其通过_base_继承 configs/base/cityscapes.yml,仅覆盖模型与损失相关字段:
_base_: '../_base_/cityscapes.yml' batch_size: 12 iters: 80000 model: type: STDCSeg backbone: type: STDC1 pretrained: https://bj.bcebos.com/paddleseg/dygraph/STDCNet1.tar.gz pretrained: null loss: types: - type: OhemCrossEntropyLoss - type: OhemCrossEntropyLoss - type: OhemCrossEntropyLoss - type: DetailAggregateLoss coef: [1, 1, 1, 1]字段说明:
- batch_size: 12:单卡每步样本数,覆盖了
_base_中的默认值 2;多卡训练时按总卡数累计,实际 global batch size = 12 × 卡数; - iters: 80000:总迭代数,约等于原论文设置;
- model.backbone.pretrained:STDCNet1 在 ImageNet 上的预训练权重(Baidu BOS 地址),加载的是骨干网络而非整模型;
- model.pretrained: null:整模型预训练为空,即不加载完整分割模型的预训练权重;
- loss:四路损失叠加,权重均为 1。
3.2 Pascal VOC:stdc1_seg_voc12aug_512x512_40k.yml
完整配置见 configs/stdcseg/stdc1_seg_voc12aug_512x512_40k.yml,继承 configs/base/pascal_voc12aug.yml,核心结构与 Cityscapes 一致,仅数据集、迭代数(40000)与分辨率(512x512)不同,同样使用四路损失(3×OhemCrossEntropyLoss + DetailAggregateLoss,coef 均为 1)。
3.3 STDC2 变体
configs/stdcseg/stdc2_seg_cityscapes_1024x512_80k.yml 与 configs/stdcseg/stdc2_seg_voc12aug_512x512_40k.yml 采用「配置继承」写法:以对应 STDC1 配置为_base_,仅覆盖骨干类型与预训练权重:
_base_: 'stdc1_seg_cityscapes_1024x512_80k.yml' model: backbone: type: STDC2 pretrained: https://bj.bcebos.com/paddleseg/dygraph/STDCNet2.tar.gz这种_base_链式继承是 PaddleSeg 配置体系的标准做法,便于横向对比同一数据集上 STDC1 与 STDC2 的精度/速度差异。
四、继承的基础配置:数据增强、优化器与调度器
STDC-Seg 的 Cityscapes 配置继承了 configs/base/cityscapes.yml,其关键内容:
batch_size: 2 iters: 80000 train_dataset: type: Cityscapes dataset_root: data/cityscapes 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.4 contrast_range: 0.4 saturation_range: 0.4 - type: Normalize mode: train val_dataset: type: Cityscapes dataset_root: data/cityscapes transforms: - type: Normalize mode: val optimizer: type: SGD momentum: 0.9 weight_decay: 4.0e-5 lr_scheduler: type: PolynomialDecay learning_rate: 0.01 end_lr: 0 power: 0.9要点:
- ResizeStepScaling:按 0.5~2.0 的随机尺度(步长 0.25)缩放输入,增强尺度鲁棒性;
- RandomPaddingCrop:随机裁剪到 1024x512;
- RandomDistort:亮度/对比度/饱和度扰动幅度 0.4;
- SGD + PolynomialDecay:学习率 0.01、power 0.9、衰减至 0,动量 0.9、权重衰减 4e-5;
- Normalize:Cityscapes 使用固定均值和方差,训练/验证一致。
五、STDC-Seg 网络结构与源码解读
5.1 整体架构
STDCSeg定义于 paddleseg/models/stdcseg.py,由三个子模块组成:
- ContextPath(上下文路径):接收骨干的 5 级特征(feat2/4/8/16/32),通过两个 AttentionRefinementModule(ARM)与全局平均池化分支融合,输出 x8、x16 上下文特征;
- FeatureFusionModule(特征融合模块):将骨干浅层细节特征(feat8)与上下文特征(feat_cp8)拼接后做通道注意力加权融合,输出 256 通道;
- SegHead(分割头):
conv_out(256→256→num_classes)输出主分割 logits,conv_out8/conv_out16输出辅助 logits。
构造函数关键参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
num_classes | 必填 | 类别数(Cityscapes 19,VOC 21) |
backbone | 必填 | STDCNet,STDC1/STDC2 均可 |
use_boundary_2/4/16 | False | 是否启用对应层级的边界/细节监督头 |
use_boundary_8 | True | 按论文默认开启 8x 细节监督 |
use_conv_last | False | 是否使用骨干最后一个卷积,影响 ContextPath 的 inplanes |
pretrained | None | 整模型预训练权重 |
5.2 前向流程与多损失输出
从 paddleseg/models/stdcseg.py 可以看到:
- 训练模式:主分支输出
feat_out,辅助分支输出feat_out8(来自 feat_cp8)、feat_out16(来自 feat_cp16),若开启use_boundary_8还会追加feat_out_sp8,四路 logits 全部上采样到输入分辨率后返回,与配置中四路损失一一对应; - 推理模式:只走主分支
ffm(feat_res8, feat_cp8) → conv_out → interpolate,返回单个 logit 列表,无任何辅助头开销,这正是实时推理高效的关键。
5.3 ContextPath 细节
见 paddleseg/models/stdcseg.py:
- 骨干输出 5 级特征;
- 对 feat32 做全局平均池化 + 1x1 卷积得到全局上下文,nearest 上采样回 feat32 分辨率;
- feat32 经
arm32(ARM:3x3 卷积 + 全局池化 → 1x1 卷积 → BN → Sigmoid 通道注意力)后与全局上下文相加; - 依次上采样并叠加 feat16(经
arm16),逐级得到 x8 上下文特征。
5.4 FeatureFusionModule 细节
见 paddleseg/models/stdcseg.py:将细节特征fsp与上下文特征fcp沿通道拼接,经 1x1 卷积降维到 256,再通过「全局池化 → 1x1 降维 → ReLU → 1x1 升维 → Sigmoid」生成通道注意力权重,对特征做加权并残差相加,保留细节的同时注入全局语义。
5.5 STDCNet 骨干
见 paddleseg/models/backbones/stdcnet.py:
- 前两个 stage 为 stride 2 的
ConvBNRelu(3x3,通道 base//2→base),下采样 4 倍; - 后续 stage3/4/5 分别由
layers指定数量的 STDC 模块组成,每 stage 首模块 stride 2,其余 stride 1; - 特征通道配置为
[base//2, base, base*4, base*8, base*16],即 STDC1/STDC2(base=64)输出通道为 32/64/256/512/1024; - 每个 STDC 模块(
CatBottleneck/AddBottleneck)将多分支卷积结果按通道拼接或相加,实现「short-term dense concatenate」,同时利用avd_layer(带 stride 的卷积与池化组合)避免下采样信息丢失。
STDC1 与 STDC2 的差异仅在于layers参数,见 paddleseg/models/backbones/stdcnet.py。
六、损失函数:OhemCrossEntropyLoss 与 DetailAggregateLoss
6.1 三路 OHEM 交叉熵
辅助分支与主分支均使用在线难例挖掘交叉熵,实现在 paddleseg/models/losses/ohem_cross_entropy_loss.py。该损失只保留 top-k 高损失像素参与梯度计算,有效缓解类别不平衡,是 STDC-Seg 训练的关键技巧。
6.2 DetailAggregateLoss(边界聚合损失)
实现在 paddleseg/models/losses/detail_aggregate_loss.py。论文认为:主干分类网络学到的特征图对物体边界不敏感,直接训练边界分支容易过拟合。因此该损失先将num_classes的 logits 按通道求和得到单通道"细节特征",再与从 GT 生成的边界图(通过 Sobel/Canny 类算子提取、并逐级下采样到 2/4/8/16 分辨率)做 MSE 损失,从而显式监督网络关注边界区域。它对应use_boundary_2/4/8/16开关,STDC-Seg 默认只开use_boundary_8。
配置中types列表的四个元素与网络训练时的四路 logits 按顺序对应(3×OHEM + 1×DetailAggregate),coef: [1, 1, 1, 1]表示各路损失等权相加。
七、实战:训练、验证与模型导出
7.1 训练
以 Cityscapes STDC1 为例:
python tools/train.py \ --config configs/stdcseg/stdc1_seg_cityscapes_1024x512_80k.yml \ --do_eval \ --use_vdl \ --save_dir output/stdc1_cityscapes- 数据集需按 configs/base/cityscapes.yml 中的
dataset_root: data/cityscapes放置在data/cityscapes目录(相对运行目录),训练/验证目录结构遵循 Cityscapes 官方布局; --do_eval每save_interval迭代执行一次验证,--use_vdl开启 VisualDL 日志可视化;- 多卡训练可直接用
paddle.distributed.launch(如python -m paddle.distributed.launch tools/train.py ...),batch_size 为每卡数值。
训练参考脚本与 TIPC 基准测试见 test_tipc。
7.2 验证与评估
python tools/val.py \ --config configs/stdcseg/stdc1_seg_cityscapes_1024x512_80k.yml \ --model_path output/stdc1_cityscapes/best_model/model.pdparams- 若需复现文档中的 flip 或 ms+flip 指标,可在推理脚本中分别开启水平翻转与多尺度(0.75x/1x/1.25x 等)推理后融合 logits;
- 评估指标为逐类 IoU 的均值 mIoU,以及 mIou 等辅助指标,实现在
paddleseg的评估工具中。
7.3 推理预测
python tools/predict.py \ --config configs/stdcseg/stdc1_seg_cityscapes_1024x512_80k.yml \ --model_path output/stdc1_cityscapes/best_model/model.pdparams \ --image_path demo.png \ --save_dir output/result7.4 导出静态图模型
python tools/export.py \ --config configs/stdcseg/stdc1_seg_cityscapes_1024x512_80k.yml \ --model_path output/stdc1_cityscapes/best_model/model.pdparams \ --save_dir output/export导出后得到model.pdmodel与model.pdiparams,可用于 Paddle Inference / Paddle Lite / PaddleSlim 等部署链路;结合 deploy 下的 FastDeploy、Serving 等方案可落地到实际业务。
八、常见调参与注意事项
- 分辨率与显存:1024x512 是 Cityscapes 的默认训练尺寸,显存不足可先尝试减小
batch_size;VOC 配置为 512x512、40k 迭代,训练更快; - 预训练权重:骨干预训练地址(STDCNet1.tar.gz / STDCNet2.tar.gz)由 BOS 托管,首次训练会自动下载;若网络受限,可手动下载后修改
pretrained为本地路径; - 边界损失开关:论文默认
use_boundary_8=True;如需开启 2/4/16 级边界监督,需同时向loss.types追加对应数量的DetailAggregateLoss并同步调整coef,且需自行确认边界标签生成逻辑; - OHEM 与类别不平衡:Cityscapes 大类别(如道路、建筑)像素占比极高,OHEM 只回传难例梯度,可配合
RandomDistort等增强提升小类别(如交通标志)精度; - 多尺度评测:flip/ms+flip 指标高于单尺度,若业务允许可保留多尺度推理换取精度。
九、总结
STDC-Seg 是 PaddleSeg 实时语义分割的主力模型之一:STDC 骨干在保持 BiSeNet 精度的同时大幅压缩了浅层冗余计算,配合 ContextPath + FFM 的多级特征融合与 OHEM + DetailAggregate 双损失约束,在 Cityscapes 上以 1024x512 分辨率、80k 迭代取得 STDC1 74.74% / STDC2 77.60% 的 mIoU(单尺度),是移动端与嵌入式场景中精度/速度权衡的优秀选择。本文给出的配置、源码路径与命令行均可直接在 PaddleSeg 仓库中复现验证,读者可基于 configs/stdcseg 下的四个配置快速上手实验。
- 人工智能
- 计算机视觉
- 预训练
【免费下载链接】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.
相关推荐
STDC-Seg:实时语义分割框架详解与实战指南
STDC Seg:实时语义分割框架详解与实战指南 1. 项目介绍 STDC Seg 是一个基于 PyTorch 的实时语义分割模型,最初由美团在 CVPR 20
人工智能计算机视觉深度学习【亲测免费】 STDC-Seg:实时语义分割网络
STDC Seg:实时语义分割网络 1. 项目基础介绍和主要编程语言 STDC Seg 是一个基于 PyTorch 的实时语义分割网络,由美团在 CVPR 20
人工智能计算机视觉深度学习MMSegmentation 中的 STDC 实时语义分割:STDCNet 主干、Detail Aggregation 模块与 Cityscapes 训练配置全解析
MMSegmentation 中的 STDC 实时语义分割:STDCNet 主干、Detail Aggregation 模块与 Cityscapes 训练配置全
人工智能深度学习计算机视觉
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考