
torchvision LRASPP 语义分割模型Lite R-ASPP 架构源码解读与实战指南【免费下载链接】visionDatasets, Transforms and Models specific to Computer Vision项目地址: https://gitcode.com/gh_mirrors/vi/visionLRASPPLite R-ASPP轻量级 Atrous Spatial Pyramid Pooling是 torchvision 提供的一种轻量化语义分割模型以 MobileNetV3-Large 为骨干网络源自论文Searching for MobileNetV3arXiv:1905.02244。本文以 docs/source/models/lraspp.rst 为主线结合 torchvision/models/segmentation/lraspp.py 源码与 references/segmentation/README.md 训练脚本完整讲解该模型的构建接口、预训练权重、双分支解码头原理、推理用法与复现命令帮助你直接上手基于 torchvision 的轻量级语义分割任务。LRASPP 是什么为移动端设计的轻量语义分割头LRASPP 全称为 Lite R-ASPP是 R-ASPPAtrous Spatial Pyramid Pooling的轻量化变体。它与 DeepLabV3 的 ASPP 模块思路同源——都是通过不同感受野的特征提取来增强语义分割的多尺度表达能力——但 LRASPP 刻意削减了膨胀卷积分支的数量与通道开销使其特别适合搭配轻量骨干网络在资源受限场景下运行。在 torchvision 中LRASPP 被组织在torchvision.models.segmentation模块下segmentation/init.py 中通过from .lraspp import *导出并提供唯一的预置构建器lraspp_mobilenet_v3_large。需要特别留意的是该模型属于 segmentation 模块的 beta 功能原文档以betastatus标注这意味着其 API 在未来版本中仍可能调整生产环境使用时需关注 torchvision 的版本更新说明。模型内部由两部分组成对应源码中的两个类LRASPPlraspp.py#L19-L51顶层网络容器持有骨干网络与分类头负责特征提取、最终上采样与输出组织LRASPPHeadlraspp.py#L54-L79轻量解码头融合低层细节特征与高层语义特征生成分割结果。模型构建器lraspp_mobilenet_v3_large 完整参数说明构建器的完整签名定义在 lraspp.py#L127-L134def lraspp_mobilenet_v3_large( *, weights: Optional[LRASPP_MobileNet_V3_Large_Weights] None, progress: bool True, num_classes: Optional[int] None, weights_backbone: Optional[MobileNet_V3_Large_Weights] MobileNet_V3_Large_Weights.IMAGENET1K_V1, **kwargs: Any, ) - LRASPP:各参数含义与行为如下参数类型默认值说明weightsLRASPP_MobileNet_V3_Large_WeightsNone是否加载预训练权重。为None时不加载传入权重枚举或.DEFAULT时加载对应权重详见下文权重章节progressboolTrue下载权重时是否在 stderr 显示进度条num_classesintNone输出类别数包含背景类。为None且未指定权重时默认取 21Pascal VOC 语义分割的 20 类 背景weights_backboneMobileNet_V3_Large_WeightsMobileNet_V3_Large_Weights.IMAGENET1K_V1骨干网络的预训练权重ImageNet-1K 预训练**kwargs——透传给LRASPP基类的额外参数关于参数的几个关键实现细节源自 lraspp.py#L160-L178aux_loss不受支持构建器中显式kwargs.pop(aux_loss, False)若传入aux_lossTrue会直接抛出NotImplementedError(This model does not use auxiliary loss)。LRASPP 没有辅助损失分支与 FCN/DeepLabV3 不同。num_classes的自动覆盖逻辑当加载预训练权重时若用户显式传入的num_classes与权重元数据中的类别数不一致会抛出ValueError由_ovewrite_value_param校验见 models/_utils.py#L242-L246否则自动使用权重定义好的类别数。而一旦加载整体权重weights_backbone会被置为None避免重复加载骨干权重。新旧接口兼容构建器通过handle_legacy_interface装饰器models/_utils.py#L152-L231兼容旧的pretrained/pretrained_backbone写法但使用旧参数会发出弃用警告建议统一使用新的weights/weights_backbone接口。预训练权重基于 COCO 子集的 VOC 标签模型唯一可用的权重枚举是LRASPP_MobileNet_V3_Large_Weights.COCO_WITH_VOC_LABELS_V1也是DEFAULT其元数据定义在 lraspp.py#L96-L119关键信息如下元数据项值参数量num_params3,221,538约 322 万推理计算量_ops2.086 GMacs权重文件大小_file_size12.49 MB输入尺寸约束min_size(1, 1)输出类别categoriesPascal VOC 的 20 类 背景共 21 类完整列表见 models/_meta.py#L1128-L1150即_VOC_CATEGORIESCOCO-val2017VOC 标签mIoU57.9COCO-val2017VOC 标签像素精度91.2权重训练数据说明这批权重并不是在完整 COCO 上训练的而是使用了 COCO 中与 Pascal VOC 重叠的 20 个类别组成的子集进行训练因此输出标签与 Pascal VOC 语义分割完全一致含背景共 21 类。上述 mIoU 与像素精度指标也是在带 VOC 标签的 COCO 验证集上评估得到的。构建器内部还会为每个输入图像套用SemanticSegmentation预处理预设transforms/_presets.py#L147-L188对应权重中登记的resize_size520def __init__( self, *, resize_size: Optional[int], # LRASPP 权重登记为 520 mean: tuple[float, ...] (0.485, 0.456, 0.406), # ImageNet 均值 std: tuple[float, ...] (0.229, 0.224, 0.225), # ImageNet 标准差 interpolation: InterpolationMode InterpolationMode.BILINEAR, antialias: Optional[bool] True, ) - None其forward依次执行双线性缩放至短边 520短边 520 是训练/推理阶段的惯例可减少移动端上的特征图开销→ 转浮点并归一化到[0, 1]→ 按 ImageNet 均值/标准差标准化。使用weights.DEFAULT时模型会自动携带这一预设通过weights.transforms()即可获取。源码解剖LRASPPHead 双分支轻量融合LRASPPHead 的核心设计是只使用一条高层语义路径 一条低层细节路径用极少的计算量完成多尺度融合。其结构lraspp.py#L54-L79包含四个子模块self.cbr nn.Sequential( # 1×1 卷积降维 BN ReLU nn.Conv2d(high_channels, inter_channels, 1, biasFalse), nn.BatchNorm2d(inter_channels), nn.ReLU(inplaceTrue), ) self.scale nn.Sequential( # 全局上下文门控通道注意力 nn.AdaptiveAvgPool2d(1), nn.Conv2d(high_channels, inter_channels, 1, biasFalse), nn.Sigmoid(), ) self.low_classifier nn.Conv2d(low_channels, num_classes, 1) # 低层路径分类头 self.high_classifier nn.Conv2d(inter_channels, num_classes, 1) # 高层路径分类头forward的融合计算逻辑为low input[low] # 低层特征来自骨干网络的 C2stride8 high input[high] # 高层特征来自骨干网络的 C5stride16 x self.cbr(high) # 1) 高层特征降维到 inter_channels默认 128 s self.scale(high) # 2) 全局池化产生逐通道缩放因子 x x * s # 3) 通道级门控加权 x F.interpolate(x, sizelow.shape[-2:], modebilinear, align_cornersFalse) # 4) 上采样对齐低层特征尺寸 return self.low_classifier(low) self.high_classifier(x) # 5) 两路径逐像素相加可以这样理解这五步cbr用 1×1 卷积把高层特征从high_channels压缩到 128 维控制后续计算量scale通过全局平均池化 Sigmoid 为每个通道计算 0~1 的权重让网络学习哪些高层通道对分割更重要两路分类头分别把低层与高层特征投影到类别空间后逐像素相加——低层特征负责精细边缘与空间细节高层特征负责语义判别这正是 LRASPP 轻量而有效的关键。顶层网络骨干特征抽取与输出上采样LRASPP基类lraspp.py#L35-L51的构造与前向逻辑如下def __init__(self, backbone, low_channels, high_channels, num_classes, inter_channels128): self.backbone backbone self.classifier LRASPPHead(low_channels, high_channels, num_classes, inter_channels) def forward(self, input): features self.backbone(input) # 返回 OrderedDict键为 low / high out self.classifier(features) out F.interpolate(out, sizeinput.shape[-2:], modebilinear, align_cornersFalse) result OrderedDict() result[out] out return result三个要点值得注意骨干输出协议LRASPP要求传入的backbone返回OrderedDict[Tensor]且键必须为high高层特征图与low低层特征图这由LRASPPHead.forward直接按字典键取值。最终的 4 倍上采样分类头输出尺寸约为输入尺寸的 1/16因骨干 stride16LRASPP.forward用双线性插值align_cornersFalse将其恢复到原始输入分辨率因此模型输出的分割图与输入图像分辨率一致无需用户额外对齐。输出为 OrderedDict返回{out: tensor}的结构与 torchvision 其他分割模型保持一致方便统一的后处理代码。骨干适配MobileNetV3-Large 空洞卷积 IntermediateLayerGetter_lraspp_mobilenetv3lraspp.py#L82-L93负责把 MobileNetV3-Large 适配为 LRASPP 的特征提取器backbone mobilenet_v3_large(weightsweights_backbone, dilatedTrue) # 关键dilatedTrue backbone backbone.features stage_indices [0] [i for i, b in enumerate(backbone) if getattr(b, _is_cn, False)] [len(backbone) - 1] low_pos stage_indices[-4] # 取 C2输出 stride 8 high_pos stage_indices[-1] # 取 C5输出 stride 16 backbone IntermediateLayerGetter(backbone, return_layers{str(low_pos): low, str(high_pos): high})其原理分三层空洞卷积保持分辨率构建骨干时传入dilatedTrueMobileNetV3-Large 的最后两个阶段会替换为带洞卷积详见 torchvision/models/mobilenetv3.py使整体输出 stride 从 32 降低到 16避免高层特征因连续下采样而丢失过多空间细节按_is_cn标记定位阶段MobileNetV3 中每个 stride 下采样块的_is_cn属性为 True据此定位 C1~C4 的边界从而确定 C2stride8与 C5stride16的位置IntermediateLayerGetter抽取中间层models/_utils.py#L13-L73按return_layers配置逐层前向命中时把特征存入输出字典并重命名为low/high实现一次前向同时拿到两路特征。注意_is_cn定位方式依赖于模块注册顺序即前向执行顺序这一假设这也是IntermediateLayerGetter文档中强调的约束。实战加载预训练 LRASPP 做语义分割推理下面给出完整的推理示例展示权重预设、预处理与后处理的正确组合import torch from PIL import Image import torchvision.transforms as T from torchvision.models.segmentation import lraspp_mobilenet_v3_large, LRASPP_MobileNet_V3_Large_Weights # 1. 构建模型并加载预训练权重weights 会自动携带 transforms 预设 weights LRASPP_MobileNet_V3_Large_Weights.DEFAULT model lraspp_mobilenet_v3_large(weightsweights) model.eval() # 2. 使用权重自带的预处理短边缩放至 520 归一化 preprocess weights.transforms() # 3. 读取并预处理图像 img Image.open(demo.jpg).convert(RGB) batch preprocess(img).unsqueeze(0) # 形状: (1, 3, H, W) # 4. 前向推理输出与输入分辨率一致的分割图 with torch.inference_mode(): out model(batch)[out] # 形状: (1, 21, H, W) # 5. 后处理argmax 得到逐像素类别索引 pred out.argmax(dim1).squeeze(0) # 形状: (H, W)若想完全控制预处理流程也可以手动构造SemanticSegmentation预设from torchvision.transforms._presets import SemanticSegmentation preprocess SemanticSegmentation(resize_size520)训练复现官方 reference 脚本references/segmentation/README.md#L40-L42 给出了官方复现命令在 8×V100 GPU 环境下训练torchrun --nproc_per_node8 train.py --dataset coco -b 4 \ --model lraspp_mobilenet_v3_large \ --wd 0.000001 \ --weights-backbone MobileNet_V3_Large_Weights.IMAGENET1K_V1使用前需要按 README 说明修改两个必填参数--data-path/path/to/dataset指向 COCO 数据集路径与--nproc_per_node实际可用 GPU 数。与 FCN/DeepLabV3 的复现命令相比LRASPP 的命令没有--aux-loss这与构建器不支持辅助损失的实现保持一致同时其权重衰减设置为极小的1e-6这是为了配合 MobileNetV3 骨干的特性。注意该训练命令中的--dataset coco与预训练权重一样实际使用的是 COCO 中 VOC 类别的子集监督。完整的训练入口与参数解析位于 references/segmentation/train.py可参考其中的数据加载、损失与评估逻辑。测试验证模型与权重枚举的回归保障torchvision 的测试套件对 LRASPP 提供了系统性覆盖test/test_extended_models.py第 27 行将(lraspp_mobilenet_v3_large, models.segmentation.LRASPP)注册到模型类注册表验证构建器返回类型正确第 42 行注册构建器函数本身第 57 行注册LRASPP_MobileNet_V3_Large_Weights权重枚举验证权重枚举可枚举、可校验第 73 行将该模型加入需用 CPU 运行的回归测试分组第 93 行加入免下载/格式校验相关分组test/test_models.py#L271模型期望输出对照表ModelTester系列测试同样覆盖了该模型。如果要在本地跑一个最小冒烟验证可参考测试方式构造随机输入断言输出形状import torch from torchvision.models.segmentation import lraspp_mobilenet_v3_large model lraspp_mobilenet_v3_large(weightsNone, num_classes21).eval() x torch.rand(1, 3, 520, 520) with torch.inference_mode(): out model(x)[out] assert out.shape (1, 21, 520, 520) # 输出与输入分辨率一致使用限制与注意事项Beta 状态segmentation 模块整体为 beta 功能接口可能随版本演进升级 torchvision 后需回归验证不支持辅助损失aux_lossTrue会直接抛错不能照搬 FCN/DeepLabV3 的训练配置类别数校验严格加载预训练权重时若手工传入不相符的num_classes会报ValueError自定义微调应显式传weightsNone并指定num_classes输入尺寸权重元数据min_size为(1, 1)理论可处理任意尺寸输入但考虑到整体 stride 为 16建议输入尺寸为 16 的倍数以获得对齐的逐像素结果推理默认按短边 520 缩放。综上LRASPP 是 torchvision 语义分割家族中最轻量的成员之一约 322 万参数、2.09 GMacs其高层语义门控 低层细节融合的解码头设计在精度与算力之间取得了良好平衡特别适合移动端与边缘设备上的语义分割部署。【免费下载链接】visionDatasets, Transforms and Models specific to Computer Vision项目地址: https://gitcode.com/gh_mirrors/vi/vision创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考