- 人工智能
- 计算机视觉
- 预训练
【免费下载链接】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 通过paddleseg.models.backbones子包为语义分割模型提供特征提取骨干网络(backbone),本文以官方 API 文档docs/apis/backbones/为核心,逐一讲解 ResNet_vd、HRNet、MobileNetV3、XceptionDeeplab 四类骨干的参数含义与源码实现细节,并结合模型注册机制与真实配置文件,帮助你在训练、微调或构建自定义分割模型时正确选用和配置骨干网络。
一、骨干网络包的结构与注册机制
paddleseg.models.backbones子包是语义分割模型的特征提取层集合。从 paddleseg/models/backbones/init.py 可以看到,该包按模块聚合了仓库中全部骨干实现:
from .hrnet import * from .resnet_vd import * from .xception_deeplab import * from .mobilenetv3 import * from .vision_transformer import * from .swin_transformer import * from .mobilenetv2 import * from .mix_transformer import * from .stdcnet import * from .lite_hrnet import * from .shufflenetv2 import * from .ghostnet import * from .cae import * from .top_transformer import * from .uhrnet import * from .efficientformerv2 import * from .hrformer import * from .strideformer import * from .vit_adapter import * from .mscan import * from .seaformer import * from .pidnet import * from .resnet_ms3 import *即除了本文重点讲解的四个骨干,仓库还内置了 ViT、Swin-Transformer、MobileNetV2、GhostNet、SHUFFLENetV2、Lite-HRNet、UHRNet、SEANet、PIDNet、StrideFormer 等更多实现。官方 API 文档(backbones.md 与中文 backbones_cn.md)重点描述了其中最常用的 ResNet_vd、HRNet、MobileNetV3 和 XceptionDeeplab。
组件注册:为什么配置里可以写type: HRNet_W18
每个骨干的构造函数都通过@manager.BACKBONES.add_component装饰器注册。例如 paddleseg/models/backbones/hrnet.py 中:
@manager.BACKBONES.add_component def HRNet_W18(**kwargs): model = HRNet(stage1_num_modules=1, stage1_num_blocks=[4], stage1_num_channels=[64], stage2_num_modules=1, stage2_num_blocks=[4, 4], stage2_num_channels=[18, 36], stage3_num_modules=4, stage3_num_blocks=[4, 4, 4], stage3_num_channels=[18, 36, 72], stage4_num_modules=3, stage4_num_blocks=[4, 4, 4, 4], stage4_num_channels=[18, 36, 72, 144], **kwargs) return modelBACKBONES是定义在 paddleseg/cvlibs/manager.py 中的ComponentManager("backbones")实例,它维护一个“组件名 → 构造函数”的字典。因此你只需在 YAML 配置里写出注册名,框架即可按名实例化:
# 真实配置示例(OCRNet + HRNet_W18,Cityscapes 1024x512) model: type: OCRNet backbone: type: HRNet_W18 pretrained: https://bj.bcebos.com/paddleseg/dygraph/hrnet_w18_ssld.tar.gz num_classes: 19 backbone_indices: [0]完整配置可参考 configs/ocrnet/ocrnet_hrnetw18_cityscapes_1024x512_160k.yml。backbone_indices用于选择骨干输出特征列表中参与融合的层级(ResNet 类骨干返回四个阶段的特征列表,HRNet 返回拼接后的单张特征图,故此处取[0])。
二、ResNet_vd:vd 风格改造的 ResNet
ResNet_vd 骨干源于论文 "Bag of Tricks for Image Classification with Convolutional Neural Networks",实现位于 paddleseg/models/backbones/resnet_vd.py。API 签名如下:
class paddleseg.models.backbones.Resnet_vd( layers = 50, output_stride = None, multi_grid = (1, 1, 1), lr_mult_list = (0.1, 0.1, 0.2, 0.2), pretrained = None )参数说明
| 参数 | 类型 | 说明 | 默认值 |
|---|---|---|---|
layers | int | ResNet_vd 的层数,支持[18, 34, 50, 101, 152, 200] | 50 |
output_stride | int | 输出特征相对输入图像的下采样倍数,取 8 或 16 | 8 |
multi_grid | tuple/list | stage4(block == 3)的空洞率(dilation)网格,用于扩大卷积感受野 | (1, 1, 1) |
pretrained | str | 预训练模型权重路径 | None |
源码中的断言保证了layers只能取合法值,并据此决定每个阶段的 block 数与通道数:
supported_layers = [18, 34, 50, 101, 152, 200] assert layers in supported_layers, ... if layers == 18: depth = [2, 2, 2, 2] elif layers == 34 or layers == 50: depth = [3, 4, 6, 3] elif layers == 101: depth = [3, 4, 23, 3] elif layers == 152: depth = [3, 8, 36, 3] elif layers == 200: depth = [3, 12, 48, 3]output_stride 与空洞卷积的关系
output_stride通过dilation_dict控制哪些阶段使用空洞卷积,是分割模型选择骨干时的关键参数:
dilation_dict = None if output_stride == 8: dilation_dict = {2: 2, 3: 4} elif output_stride == 16: dilation_dict = {3: 2}即output_stride=8时第 3、4 个 stage 分别用 dilation 2 和 4;output_stride=16时仅第 4 个 stage 用 dilation 2。multi_grid会进一步作用于最后一个 stage(block == 3时dilation_rate = dilation_rate * multi_grid[i]),例如multi_grid=(1, 2, 4)是 DeepLabV3 系列常用的设置。
输出特征与 feat_channels
forward返回各 stage 的输出特征列表,供解码器按backbone_indices选取:
feat_list = [] for stage in self.stage_list: for block in stage: y = block(y) feat_list.append(y) return feat_list通道数由self.feat_channels记录:layers ≥ 50 时为[256, 512, 1024, 2048],浅层网络为[64, 128, 256, 512]。此外ConvBNLayer中带有is_vd_mode逻辑(空洞卷积前先做AvgPool2D),这正是 "vd"(virtual dense)命名对应的 Bag of Tricks 改造点。
常用变体
paddleseg.models.backbones.ResNet18_vd(**args) # layers=18 paddleseg.models.backbones.ResNet34_vd(**args) # layers=34 paddleseg.models.backbones.ResNet50_vd(**args) # layers=50 paddleseg.models.backbones.ResNet101_vd(**args) # layers=101 paddleseg.models.backbones.ResNet152_vd(**args) # layers=152 paddleseg.models.backbones.ResNet200_vd(**args) # layers=200其中ResNet18_vd、ResNet50_vd、ResNet101_vd通过装饰器注册进了BACKBONES管理器,可直接用于配置文件的type字段(见 resnet_vd.py)。
三、HRNet:全程高分辨率并行结构
HRNet 源于 "HRNet: Deep High-Resolution Representation Learning for Visual Recognition",实现位于 paddleseg/models/backbones/hrnet.py。它通过 stage1~stage4 四个阶段、每阶段多分辨率并行分支来保持高分辨率特征:
class paddleseg.models.backbones.HRNet( pretrained = None, stage1_num_modules = 1, stage1_num_blocks = (4,), stage1_num_channels = (64,), stage2_num_modules = 1, stage2_num_blocks = (4, 4), stage2_num_channels = (18, 36), stage3_num_modules = 4, stage3_num_blocks = (4, 4, 4), stage3_num_channels = (18, 36, 72), stage4_num_modules = 3, stage4_num_blocks = (4, 4, 4, 4), stage4_num_channels = (18, 36, 72, 14), has_se = False, align_corners = False )参数说明
| 参数 | 类型 | 说明 | 默认值 |
|---|---|---|---|
pretrained | str | 预训练模型权重路径 | None |
stage1_num_modules | int | stage1 的模块(HighResolutionModule)数量 | 1 |
stage1_num_blocks | list | stage1 每个模块的 block 数 | (4,) |
stage1_num_channels | list | stage1 每个分支的通道数 | (64,) |
stage2_num_modules | int | stage2 的模块数量 | 1 |
stage2_num_blocks | list | stage2 每个模块的 block 数 | (4, 4) |
stage2_num_channels | list | stage2 每个分支的通道数 | (18, 36) |
stage3_num_modules | int | stage3 的模块数量 | 4 |
stage3_num_blocks | list | stage3 每个模块的 block 数 | (4, 4, 4) |
stage3_num_channels | list | stage3 每个分支的通道数 | (18, 36, 72) |
stage4_num_modules | int | stage4 的模块数量 | 3 |
stage4_num_blocks | list | stage4 每个模块的 block 数 | (4, 4, 4, 4) |
stage4_num_channels | list | stage4 每个分支的通道数 | (18, 36, 72, 144) |
has_se | bool | 是否使用 Squeeze-and-Excitation 模块 | False |
align_corners | bool | F.interpolate参数;特征尺寸偶数(如 1024x512)应设 False,奇数(如 769x769)设 True | False |
前向结构:Transition + Stage + 分支融合
从源码结构看,HRNet 前向流程为:conv1-1 → conv1-2 → layer1 → tr1 → stage2 → tr2 → stage3 → tr3 → stage4,其中TransitionLayer负责在分支数增加时做 1x1/3x3 卷积过渡,每个Stage内含num_modules个HighResolutionModule(分支卷积 +FuseLayers融合)。输出阶段,stage4 的四路特征中被上采样的三路会与最高分辨率分支在通道维拼接:
size = st4[0].shape[2:] x1 = F.interpolate(st4[1], size, mode='bilinear', align_corners=self.align_corners) x2 = F.interpolate(st4[2], size, mode='bilinear', align_corners=self.align_corners) x3 = F.interpolate(st4[3], size, mode='bilinear', align_corners=self.align_corners) x = paddle.concat([st4[0], x1, x2, x3], axis=1) return [x]因此feat_channels = [sum(stage4_num_channels)],例如 HRNet_W18 输出单张 270 通道(18+36+72+144)的特征图,这正是配置中backbone_indices: [0]的由来。align_corners与特征图尺寸奇偶性必须匹配,否则双线性插值会引入系统偏差,这是使用 HRNet 时最易踩的坑。
常用变体与宽度含义
W后的数字即 stage2 第一分支通道数(宽度):
paddleseg.models.backbones.HRNet_W18_Small_V1(**kwargs) # 轻量版,stage4 仅 1 个模块 paddleseg.models.backbones.HRNet_W18_Small_V2(**kwargs) # 略大于 V1 paddleseg.models.backbones.HRNet_W18(**kwargs) # 标准 W18 paddleseg.models.backbones.HRNet_W30(**kwargs) paddleseg.models.backbones.HRNet_W32(**kwargs) paddleseg.models.backbones.HRNet_W40(**kwargs) paddleseg.models.backbones.HRNet_W44(**kwargs) paddleseg.models.backbones.HRNet_W48(**kwargs) paddleseg.models.backbones.HRNet_W60(**kwargs) paddleseg.models.backbones.HRNet_W64(**kwargs)以 HRNet_W30 为例,其分支通道为 (30, 60, 120, 240),其余结构与 W18 一致——即宽度缩放只改变各分支通道数,模块/block 数不变。
四、MobileNetV3:轻量级的深度可分离卷积骨干
MobileNetV3 源于 "Searching for MobileNetV3",实现位于 paddleseg/models/backbones/mobilenetv3.py。
class paddleseg.models.backbones.MobileNetV3( pretrained = None, scale = 1.0, model_name = "small", output_stride = None )参数说明
| 参数 | 类型 | 说明 | 默认值 |
|---|---|---|---|
pretrained | str | 预训练模型权重路径 | None |
scale | float | 通道数缩放系数;官方建议 large 模型可设置比 small 更高的 scale | 1.0 |
model_name | str | 模型类型,取'small'或'large' | 'small' |
output_stride | int | 输出特征相对输入的步长,取 [2, 4, 8, 16, 32] 之一 | None |
结构配置与 output_stride 实现细节
源码中的NET_CONFIG定义了 large / small 两种深度可分离块序列(每项含 kernel、膨胀通道、输出通道、SE、激活、stride):
NET_CONFIG = { "large": [ [3, 16, 16, False, "relu", 1], [3, 64, 24, False, "relu", 2], [3, 72, 24, False, "relu", 1], [5, 72, 40, True, "relu", 2], ... [5, 960, 160, True, "hardswish", 1], # x32 ], "small": [ [3, 16, 16, True, "relu", 2], [3, 72, 24, False, "relu", 2], ... [5, 576, 96, True, "hardswish", 1], ] } OUT_INDEX = {"large": [2, 5, 11, 14], "small": [0, 2, 7, 10]}out_index指定了哪些块之后抽取特征(large 在 x4/x8/x16/x32 处共 4 个层级,small 为 4 个层级),feat_channels随之计算。实现中通过_make_divisible(v, divisor=8)保证通道数按 8 对齐。值得注意的是,仓库额外提供了large_os8/small_os8两套配置:将后段 stride 改为 1 并引入 dilation(如1, 2、1, 4),把输出步长从 32 降到 8,对应MobileNetV3_large_x1_0_os8、MobileNetV3_small_x1_0_os8等注册变体,可直接服务于需要 1/8 分辨率特征的分割任务。
常用变体
命名规则为MobileNetV3_{model_name}_x{scale}:
paddleseg.models.backbones.MobileNetV3_small_x0_35(**args) # scale=0.35, small paddleseg.models.backbones.MobileNetV3_small_x0_5(**args) # scale=0.5, small paddleseg.models.backbones.MobileNetV3_small_x0_75(**args) # scale=0.75, small paddleseg.models.backbones.MobileNetV3_small_x1_0(**args) # scale=1.0, small paddleseg.models.backbones.MobileNetV3_small_x1_25(**args) # scale=1.25, small paddleseg.models.backbones.MobileNetV3_large_x0_35(**args) # scale=0.35, large paddleseg.models.backbones.MobileNetV3_large_x0_5(**args) # scale=0.5, large paddleseg.models.backbones.MobileNetV3_large_x0_75(**args) # scale=0.75, large paddleseg.models.backbones.MobileNetV3_large_x1_0(**args) # scale=1.0, large paddleseg.models.backbones.MobileNetV3_large_x1_25(**args) # scale=1.25, large在配置文件中可写成:
model: type: PP-LiteSeg backbone: type: MobileNetV3_small_x1_0 pretrained: /path/to/mobilenetv3_small_x1_0.pdparams(MobileNetV3_small_x1_0同样经过@manager.BACKBONES.add_component注册,可被按名构建。)
五、XceptionDeeplab:DeepLabV3+ 的 Xception 骨干
XceptionDeeplab 是 DeepLabV3+ 使用的 Xception 骨干,源于 "Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation",实现位于 paddleseg/models/backbones/xception_deeplab.py。
class paddleseg.models.backbones.XceptionDeeplab( backbone, pretrained = None, output_stride = 16 )参数说明
| 参数 | 类型 | 说明 | 默认值 |
|---|---|---|---|
backbone | str | 选择 Xception_DeepLab 变体,取'xception_41'、'xception_65'、'xception_71'之一(必填) | — |
pretrained | str | 预训练模型权重路径 | None |
output_stride | int | 输出特征相对输入的步长,取 8 或 16 | 16 |
三个变体的差异体现在 entry/middle/exit flow 的瓶颈参数中,源码gen_bottleneck_params给出:
if backbone == 'xception_65': bottleneck_params = { "entry_flow": (3, [2, 2, 2], [128, 256, 728]), "middle_flow": (16, 1, 728), "exit_flow": (2, [2, 1], [[728, 1024, 1024], [1536, 1536, 2048]]) } elif backbone == 'xception_41': # entry_flow 相同,middle_flow 重复 8 次(xception_65 为 16 次) elif backbone == 'xception_71': # entry_flow 更深:(5, [2, 1, 2, 1, 2], [128, 256, 256, 728, 728])即 41/65/71 分别对应中间 flow 重复 8/16 次、entry flow 3/3/5 个块的网络深度。构建时通过check_stride(s * stride, output_stride)在累计下采样达到output_stride后把后续 stride 强制置 1,从而精确控制输出分辨率;骨干输出feat_channels = [128, 2048](entry flow 首块与 exit flow 末端特征),分别对应 DeepLabV3+ 编码器低层特征与高层特征输入。
常用变体
paddleseg.models.backbones.Xception41_deeplab(**args) # xception_41 paddleseg.models.backbones.Xception65_deeplab(**args) # xception_65 paddleseg.models.backbones.Xception71_deeplab(**args) # xception_71六、选型与配置小结
结合上述实现事实,实际项目中可按如下思路选型:
- 精度优先、显存充足:选
HRNet_W18/W32/W48(高分辨率四分支特征)或ResNet101_vd + output_stride=8 + multi_grid=(1,2,4)(大感受野),典型配置如 configs/fcn/fcn_hrnetw48_cityscapes_1024x512_80k.yml; - 轻量/端侧场景:选
MobileNetV3_small_x0_75一类小 scale 变体,或 os8 系列换取更高分辨率特征; - 复现 DeepLabV3+ 原始设定:选
Xception65_deeplab,output_stride=8/16按需调整。
通用注意事项:
pretrained指向分类预训练权重(.pdparams/.pdmodel路径),构造时由init_weight加载;- HRNet 的
align_corners必须与输入特征图尺寸奇偶匹配(偶数 1024x512 设 False,奇数 769x769 设 True); - ResNet_vd 的
output_stride只支持 8/16,且multi_grid仅作用于最后一个 stage; - 配置文件中
backbone.type必须使用注册名(如HRNet_W18、ResNet50_vd),backbone_indices需与骨干返回的特征层数匹配(HRNet/XceptionDeeplab 等单/双输出骨干与 ResNet 四阶段骨干不同)。
以上参数与行为均可在对应源码文件中核对:resnet_vd.py、hrnet.py、mobilenetv3.py、xception_deeplab.py,文档原文见 docs/apis/backbones/backbones.md(英文)与 docs/apis/backbones/backbones_cn.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.
相关推荐
PaddleSeg 语义分割骨干网络 API 详解:ResNet_vd、HRNet、MobileNetV3 与 XceptionDeeplab 的参数、实现与配置实践
PaddleSeg 语义分割骨干网络 API 详解:ResNet_vd、HRNet、MobileNetV3 与 XceptionDeeplab 的参数、实现与配
人工智能计算机视觉预训练PaddleSeg 骨干网络 API 深度解析:ResNet_vd、HRNet、MobileNetV3 与 XceptionDeeplab 的实现原理与实战用法
PaddleSeg 骨干网络 API 深度解析:ResNet_vd、HRNet、MobileNetV3 与 XceptionDeeplab 的实现原理与实战用法
人工智能计算机视觉预训练PaddleSeg 骨干网络 API 详解:paddleseg.models.backbones 模块的配置参数与源码级实现解析
PaddleSeg 骨干网络 API 详解:paddleseg.models.backbones 模块的配置参数与源码级实现解析 本文围绕 PaddleSeg
人工智能计算机视觉预训练
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考