news 2026/9/25 5:38:05

PaddleSeg 骨干网络 API 详解:ResNet_vd、HRNet、MobileNetV3 与 XceptionDeeplab 的实现与配置实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PaddleSeg 骨干网络 API 详解:ResNet_vd、HRNet、MobileNetV3 与 XceptionDeeplab 的实现与配置实战
  • 人工智能
  • 计算机视觉
  • 预训练

【免费下载链接】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 通过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 model

BACKBONES是定义在 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 )

参数说明

参数类型说明默认值
layersintResNet_vd 的层数,支持[18, 34, 50, 101, 152, 200]50
output_strideint输出特征相对输入图像的下采样倍数,取 8 或 168
multi_gridtuple/liststage4(block == 3)的空洞率(dilation)网格,用于扩大卷积感受野(1, 1, 1)
pretrainedstr预训练模型权重路径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 )

参数说明

参数类型说明默认值
pretrainedstr预训练模型权重路径None
stage1_num_modulesintstage1 的模块(HighResolutionModule)数量1
stage1_num_blocksliststage1 每个模块的 block 数(4,)
stage1_num_channelsliststage1 每个分支的通道数(64,)
stage2_num_modulesintstage2 的模块数量1
stage2_num_blocksliststage2 每个模块的 block 数(4, 4)
stage2_num_channelsliststage2 每个分支的通道数(18, 36)
stage3_num_modulesintstage3 的模块数量4
stage3_num_blocksliststage3 每个模块的 block 数(4, 4, 4)
stage3_num_channelsliststage3 每个分支的通道数(18, 36, 72)
stage4_num_modulesintstage4 的模块数量3
stage4_num_blocksliststage4 每个模块的 block 数(4, 4, 4, 4)
stage4_num_channelsliststage4 每个分支的通道数(18, 36, 72, 144)
has_sebool是否使用 Squeeze-and-Excitation 模块False
align_cornersboolF.interpolate参数;特征尺寸偶数(如 1024x512)应设 False,奇数(如 769x769)设 TrueFalse

前向结构: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 )

参数说明

参数类型说明默认值
pretrainedstr预训练模型权重路径None
scalefloat通道数缩放系数;官方建议 large 模型可设置比 small 更高的 scale1.0
model_namestr模型类型,取'small'或'large''small'
output_strideint输出特征相对输入的步长,取 [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 )

参数说明

参数类型说明默认值
backbonestr选择 Xception_DeepLab 变体,取'xception_41'、'xception_65'、'xception_71'之一(必填)—
pretrainedstr预训练模型权重路径None
output_strideint输出特征相对输入的步长,取 8 或 1616

三个变体的差异体现在 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按需调整。

通用注意事项:

  1. pretrained指向分类预训练权重(.pdparams/.pdmodel路径),构造时由init_weight加载;
  2. HRNet 的align_corners必须与输入特征图尺寸奇偶匹配(偶数 1024x512 设 False,奇数 769x769 设 True);
  3. ResNet_vd 的output_stride只支持 8/16,且multi_grid仅作用于最后一个 stage;
  4. 配置文件中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.

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

相关推荐

上一篇:HiDT 论文精读:CVPR 2020 Oral《无需域标签的高分辨率昼夜转换》核心贡献梳理
下一篇:Cursor Team Kit插件:内部开发工作流的秘密武器

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/25 5:37:58

角接触球轴承热力耦合分析复现:从赫兹接触到迭代闭环

简介:针对数控机床进给系统成对安装角接触球轴承的热力耦合性能分析,这份PDF资源完整复现了期刊论文的研究思路,提供可运行的Python代码及详尽注释,面向精密机械设计、轴承动力学与数控装备领域的技术人员和高校师生。内容基于赫兹…

作者头像 李华
网站建设 2026/9/25 5:36:46

Atlas 300V Pro 24G部署YOLO系列模型实战

"atlas部署yolo"和"atlas 300v 24g 是运算加速卡吗"这两个热搜词放在一起看,很有意思。前者证明了一件事:真有人在拿Atlas系列去做目标检测;后者说明另一件事:很多人拿到这块卡之后,第一反应是搞不…

作者头像 李华
网站建设 2026/9/25 5:35:36

基于昇腾Atlas 300V 24G的YOLO模型部署与调优实践

如果你在网上搜“atlas部署yolo”,大概率会刷到一堆华为昇腾的官方文档和别人的踩坑记录。但说句实在话,很多人第一次拿到Atlas 300V 24G这块卡的时候,连它到底算不算显卡都没搞明白。我先直接回答那个被问烂了的问题:它是运算加速…

作者头像 李华
网站建设 2026/9/25 5:35:02

Atlas 300V Pro推理卡部署YOLO全攻略:从环境搭建到性能调优

最近总有人问我:“Atlas 300V 24G是运算加速卡吗?能用来部署YOLO吗?”这问题其实问到点子上了。先说结论:它确实是运算加速卡,而且是专门干推理那种加速卡,拿它跑YOLO系列目标检测模型完全没问题。但要是以…

作者头像 李华
网站建设 2026/9/25 5:34:20

STM32F4 USB CDC大数据稳定传输实战:从丢包卡死到700KB/s的优化之路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华