☰
PaddleSeg 实时语义分割:STDC-Seg(STDC1/STDC2)Cityscapes 与 VOC 训练全指南
2026/9/25 3:19:10 网站建设 项目流程
  • 人工智能
  • 计算机视觉
  • 预训练

【免费下载链接】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
点击查看免费下载

导读

本文围绕 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 以两种骨干规模提供:

骨干说明
STDC1STDCNet(base=64, layers=[2, 2, 2]),stage3/4/5 各 2 个 STDC 模块,计算量更小
STDC2STDCNet(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 分辨率)

ModelBackboneResolutionTraining ItersmIoUmIoU (flip)mIoU (ms+flip)
STDC1-Seg50STDC11024x5128000074.74%75.71%76.77%
STDC2-Seg50STDC21024x5128000077.60%78.32%79.09%

Pascal VOC 2012 + Aug(21 类,512x512 分辨率)

ModelBackboneResolutionTraining ItersmIoUmIoU (flip)mIoU (ms+flip)
STDC1-Seg50STDC1512x5124000068.06%68.48%69.26%
STDC2-Seg50STDC2512x5124000068.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/16False是否启用对应层级的边界/细节监督头
use_boundary_8True按论文默认开启 8x 细节监督
use_conv_lastFalse是否使用骨干最后一个卷积,影响 ContextPath 的 inplanes
pretrainedNone整模型预训练权重

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:

  1. 骨干输出 5 级特征;
  2. 对 feat32 做全局平均池化 + 1x1 卷积得到全局上下文,nearest 上采样回 feat32 分辨率;
  3. feat32 经arm32(ARM:3x3 卷积 + 全局池化 → 1x1 卷积 → BN → Sigmoid 通道注意力)后与全局上下文相加;
  4. 依次上采样并叠加 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/result

7.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 等方案可落地到实际业务。

八、常见调参与注意事项

  1. 分辨率与显存:1024x512 是 Cityscapes 的默认训练尺寸,显存不足可先尝试减小batch_size;VOC 配置为 512x512、40k 迭代,训练更快;
  2. 预训练权重:骨干预训练地址(STDCNet1.tar.gz / STDCNet2.tar.gz)由 BOS 托管,首次训练会自动下载;若网络受限,可手动下载后修改pretrained为本地路径;
  3. 边界损失开关:论文默认use_boundary_8=True;如需开启 2/4/16 级边界监督,需同时向loss.types追加对应数量的DetailAggregateLoss并同步调整coef,且需自行确认边界标签生成逻辑;
  4. OHEM 与类别不平衡:Cityscapes 大类别(如道路、建筑)像素占比极高,OHEM 只回传难例梯度,可配合RandomDistort等增强提升小类别(如交通标志)精度;
  5. 多尺度评测: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.

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

相关推荐

上一篇:DocQuery终极指南:如何用AI从文档中智能提取信息
下一篇:NocoBase深度指南:如何用数据模型驱动开发构建企业级应用

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询