news 2026/9/25 8:28:22

PaddleSeg 中的 ANN 非局部语义分割模型:架构原理、配置解析与 Cityscapes/Pascal VOC 实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PaddleSeg 中的 ANN 非局部语义分割模型:架构原理、配置解析与 Cityscapes/Pascal VOC 实战
  • 人工智能
  • 计算机视觉
  • 预训练

【免费下载链接】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 仓库中 ANN(Asymmetric Non-local Neural Networks for Semantic Segmentation)模型的官方文档与实现为核心,系统讲解该模型的算法动机(AFNB/APNB 两大核心模块)、PaddleSeg 源码级实现细节、四份官方训练配置的逐项参数含义,以及从训练到推理导出的完整实战流程,帮助读者在 PaddleSeg 中快速复现并二次开发 ANN 语义分割模型。

一、背景:为什么需要"非对称"非局部网络

传统 CNN 语义分割模型受限于感受野,难以建模长距离依赖关系。Non-local 网络通过计算特征图上任意两个位置之间的相似度(自注意力)来捕获全局上下文,但直接在完整分辨率特征图上计算会带来 $O(N^2)$ 量级的矩阵乘法开销,显存与算力代价极高。

针对这一问题,Zhu Zhen 等人于 ICCV 2019 提出了Asymmetric Non-local Neural Networks(ANN),核心思路是"在金字塔池化后的紧凑特征上做非局部建模",把注意力计算从原始像素级空间转移到降采样后的少量代表性位置上,从而大幅降低计算量而不损失精度。PaddleSeg 在 paddleseg/models/ann.py 中给出了完整实现,并提供了 Cityscapes 与 Pascal VOC 12+Aug 两大数据集上的官方配置与预训练权重。

二、整体架构:AFNB 与 APNB 两大核心模块

从源码结构看,PaddleSeg 的 ANN 实现由ANN(网络主体)、ANNHead(分割头)、AFNB、APNB以及两类SelfAttentionBlock组成,层次清晰,可直接对照论文复现。

2.1 网络主体 ANN

ANN 类 的职责非常简洁:挂载主干网络(当前支持 ResNet50/101),将主干输出交给ANNHead得到多尺度 logit,再统一双线性插值回输入分辨率:

class ANN(nn.Layer): def __init__(self, num_classes, backbone, backbone_indices=(2, 3), key_value_channels=256, inter_channels=512, psp_size=(1, 3, 6, 8), enable_auxiliary_loss=True, align_corners=False, pretrained=None): ... self.head = ANNHead(num_classes, backbone_indices, backbone_channels, key_value_channels, inter_channels, psp_size, enable_auxiliary_loss) def forward(self, x): feat_list = self.backbone(x) logit_list = self.head(feat_list) return [F.interpolate(logit, x.shape[2:], mode='bilinear', align_corners=self.align_corners) for logit in logit_list]

backbone_indices默认取(2, 3),即主干网络的第 3、4 个 stage 输出:前者作为低层特征(low-level),后者作为高层特征(high-level)。网络最终返回一个 logit 列表——主分支 logit 之外,若开启辅助损失还会附带一个辅助 logit(详见 2.3)。

2.2 ANNHead:融合、上下文与分类

ANNHead 是模型的核心组装逻辑,依次完成三件事:

  1. AFNB 特征融合:用AFNB把低层特征与高层特征做非局部融合(self.fusion);
  2. APNB 上下文增强:融合结果先经过一层ConvBNReLU(3x3)降维到inter_channels,再送入APNB提取非局部上下文(self.context);
  3. 分类与辅助分支:cls为 1x1 卷积输出num_classes通道的 logit;auxlayer为辅助分割层,输入低层特征,输出辅助 logit 用于辅助损失。

其中辅助分支使用 PaddleSeg 通用组件 AuxLayer:先ConvBNReLU(3x3)压缩到inter_channels = low_in_channels // 2,接 Dropout 后再用 1x1 卷积输出类别数,实现轻量、低开销的辅助监督。

2.3 AFNB 与 APNB 的注意力计算细节

AFNB(Asymmetric Fusion Non-local Block)与APNB(Asymmetric Pyramid Non-local Block)在 ann.py 中实现,两者共享同一套自注意力逻辑(SelfAttentionBlock_AFNB与SelfAttentionBlock_APNB),区别只在于输入来源:AFNB 的 query 来自高层特征、key/value 来自低层特征,APNB 的 query/key/value 全部来自同一份输入。

关键点在_pp_module(ann.py)——它以F.adaptive_avg_pool2d把特征分别池化到psp_size指定的多个尺寸(默认(1, 3, 6, 8)),再展平拼接成紧凑的"金字塔先验"。这样 key/value 的空间尺寸从 $H \times W$ 缩减为 $\sum psp_size^2 = 1+9+36+64 = 110$ 个代表点,注意力相似度矩阵的规模随之骤减,正是"非对称"名称的由来。

单个自注意力块(SelfAttentionBlock_AFNB)的计算流程为:

  1. f_value将低层特征映射到value_channels,经_pp_module金字塔池化后转置为(B, S, C);
  2. f_query将高层特征映射到key_channels并展平为(B, HW, C);
  3. f_key将低层特征映射到key_channels,同样金字塔池化;
  4. 计算相似度图sim_map = query × key,按key_channels ** -0.5缩放后做 softmax;
  5. sim_map × value得到上下文,reshape 回空间维度后经W(1x1 卷积)输出。

整个流程与标准 non-local 完全一致,只是 key/value 的空间维度被金字塔池化大幅压缩,这也是 ANN 能同时获得全局建模能力与低计算量的根本原因。AFNB/APNB外层还会将注意力输出与原输入 concat 后经 1x1 卷积融合(conv_bn),并施加dropout_prob=0.05的 Dropout 增强泛化。

三、官方配置逐项解析

PaddleSeg 为 ANN 提供了 4 份开箱即用的训练配置(位于 configs/ann),分别覆盖两种主干(ResNet50_vd / ResNet101_vd)在两类主干输出步长(output_stride=8)与两大数据集(Cityscapes、Pascal VOC 12+Aug)上的组合:

配置文件主干数据集输入分辨率训练轮数(iters)
ann_resnet50_os8_cityscapes_1024x512_80k.ymlResNet50_vdCityscapes1024x51280000
ann_resnet101_os8_cityscapes_1024x512_80k.ymlResNet101_vdCityscapes1024x51280000
ann_resnet50_os8_voc12aug_512x512_40k.ymlResNet50_vdPascal VOC 12+Aug512x51240000
ann_resnet101_os8_voc12aug_512x512_40k.ymlResNet101_vdPascal VOC 12+Aug512x51240000

3.1 Cityscapes 配置:以 ResNet50 为例

以 ann_resnet50_os8_cityscapes_1024x512_80k.yml 为例,完整配置如下:

_base_: '../_base_/cityscapes.yml' batch_size: 2 iters: 80000 lr_scheduler: type: PolynomialDecay learning_rate: 0.01 power: 0.9 end_lr: 1.0e-5 loss: types: - type: CrossEntropyLoss coef: [1, 0.4] model: type: ANN backbone: type: ResNet50_vd output_stride: 8 pretrained: https://bj.bcebos.com/paddleseg/dygraph/resnet50_vd_ssld_v2.tar.gz backbone_indices: [2, 3] key_value_channels: 256 inter_channels: 512 psp_size: [1, 3, 6, 8] enable_auxiliary_loss: True align_corners: False pretrained: null

该文件通过_base_继承 configs/base/cityscapes.yml,后者提供了数据集(Cityscapes,dataset_root: data/cityscapes)、数据增强流水线(ResizeStepScaling0.5~2.0 倍随机缩放、RandomPaddingCrop裁剪 1024x512、随机水平翻转、RandomDistort亮度/对比度/饱和度扰动、Normalize归一化)以及优化器(SGD,momentum=0.9,weight_decay=4.0e-5)。ANN 配置只做针对性覆盖,二者合并后即为完整训练配置。

各关键参数含义如下:

  • batch_size: 2/iters: 80000:单卡批量大小与总迭代数。Cityscapes 分辨率较大(1024x512),配合注意力模块的显存占用,官方取 batch_size=2;
  • lr_scheduler:PolynomialDecay多项式衰减,初始学习率 0.01、power=0.9、最终学习率end_lr: 1.0e-5(VOC 基础配置中 end_lr 为 0);
  • loss:主分支与辅助分支均使用CrossEntropyLoss,系数coef: [1, 0.4]表示辅助损失权重为 0.4,与enable_auxiliary_loss: True一一对应;
  • backbone:ResNet50_vd且output_stride: 8,即通过 dilation 策略将主干输出步长控制为 8,保留较高分辨率特征;pretrained为官方 SSLD 预训练权重地址;
  • backbone_indices: [2, 3]:取主干第 3、4 stage 输出分别作为低层/高层特征;
  • key_value_channels: 256:AFNB 与 APNB 中自注意力 key/value 的通道数(对应源码中key_channels/value_channels);
  • inter_channels: 512:APNB 模块的输入输出通道数(即SelfAttentionBlock_APNB的out_channels);
  • psp_size: [1, 3, 6, 8]:金字塔池化的输出尺寸列表,决定注意力计算的代表点数量;
  • align_corners: False:F.interpolate的对齐参数。源码注释明确指出:特征尺寸为偶数(如 1024x512)时应为False,奇数尺寸(如 769x769)时应为True。

3.2 配置继承链:101 主干与 VOC 数据集的复用

ResNet101 与 VOC 配置充分体现了 PaddleSeg 的配置复用设计:

  • ann_resnet101_os8_cityscapes_1024x512_80k.yml 仅两行——继承 ResNet50 的 Cityscapes 配置,仅将主干替换为ResNet101_vd并更换对应 SSLD 预训练权重,其余超参数完全保持一致;
  • ann_resnet50_os8_voc12aug_512x512_40k.yml 继承 configs/base/pascal_voc12aug.yml,后者又继承 pascal_voc12.yml,通过mode: trainaug启用 VOC 增强训练集(train+val);VOC 场景下 batch_size=4、输入 512x512、iters=40000;
  • ann_resnet101_os8_voc12aug_512x512_40k.yml 同样只替换主干。

这种"基础配置 + 增量覆盖"的层级结构(_base_可层层嵌套)是 PaddleSeg 所有模型配置的通用组织方式,非常适合实验时快速切换主干、调整分辨率与训练轮数。

四、官方基准性能

下表为 PaddleSeg 官方在 ANN 配置上复现的评测结果(评估指标为 mIoU,"flip" 表示水平翻转测试增强,"ms+flip" 表示多尺度 + 翻转测试增强),原始数据与模型/日志/VisualDL 链接见 configs/ann/README.md:

4.1 Cityscapes

ModelBackboneResolutionTraining ItersmIoUmIoU (flip)mIoU (ms+flip)
ANNResNet50_OS81024x5128000079.09%79.31%79.90%
ANNResNet101_OS81024x5128000080.61%80.98%81.50%

4.2 Pascal VOC 2012 + Aug

ModelBackboneResolutionTraining ItersmIoUmIoU (flip)mIoU (ms+flip)
ANNResNet50_OS8512x5124000080.82%81.10%81.67%
ANNResNet101_OS8512x5124000079.62%79.84%80.33%

从表中可以观察到两个有参考价值的现象:其一,无论数据集与主干如何组合,多尺度 + 翻转测试增强都能稳定带来约 0.7~1 个百分点的 mIoU 提升,说明 ANN 的全局上下文建模对输入尺度变化较为敏感;其二,在 VOC 12+Aug 上 ResNet50 反而小幅超过 ResNet101(80.82% vs 79.62%),这与数据集规模、增强策略及训练轮数(均为 40000 iters)相关,也提示在数据量有限的小数据集上,过大的主干未必是最优选择。

五、实战:训练、验证、预测与导出

PaddleSeg 的训练、验证、预测与导出入口统一位于 tools 目录,ANN 配置可直接套用。

5.1 训练

python tools/train.py \ --config configs/ann/ann_resnet50_os8_cityscapes_1024x512_80k.yml \ --do_eval \ --use_vdl \ --save_interval 500 \ --save_dir output/ann_resnet50_cityscapes

常用参数说明:--do_eval在训练过程中周期评估验证集;--use_vdl开启 VisualDL 日志记录;--save_interval控制模型保存频率;--save_dir指定输出目录。训练前需按 configs/base/cityscapes.yml 中dataset_root: data/cityscapes的要求准备数据目录结构。

5.2 验证

python tools/val.py \ --config configs/ann/ann_resnet50_os8_cityscapes_1024x512_80k.yml \ --model_path output/ann_resnet50_cityscapes/best_model/model.pdparams

验证时使用与训练一致的评价配置,并支持--aug_eval与--flip开启多尺度/翻转测试增强,对应上文的 mIoU (flip) 与 mIoU (ms+flip) 指标。

5.3 单图预测

python tools/predict.py \ --config configs/ann/ann_resnet50_os8_cityscapes_1024x512_80k.yml \ --model_path output/ann_resnet50_cityscapes/best_model/model.pdparams \ --image_path demo.png \ --save_dir output/result

5.4 模型导出与部署

python tools/export.py \ --config configs/ann/ann_resnet50_os8_cityscapes_1024x512_80k.yml \ --model_path output/ann_resnet50_cityscapes/best_model/model.pdparams \ --save_dir output/export

导出产物为静态图推理模型,可进一步配合 deploy 目录下的 Python、C++、FastDeploy 等部署方案使用。

六、总结与扩展建议

ANN 在 PaddleSeg 中的落地具备完整的"论文 → 源码 → 配置 → 权重 → 基准"闭环:源码层面,paddleseg/models/ann.py 以 AFNB/APNB 两大模块精准复现论文的非对称金字塔注意力机制;配置层面,configs/ann 的 4 份 YAML 通过_base_继承机制覆盖了两大主流数据集与两种主干;基准层面,官方给出了可复现的 mIoU 数据供对照。

若希望基于 ANN 做二次开发,可以关注以下几个切入点:调整psp_size改变注意力代表点数量以权衡精度与速度;修改key_value_channels/inter_channels控制模块容量;切换backbone_indices改变低层/高层特征的选取层级;在 configs/base的数据增强流水线上叠加自定义 transform 以适配新数据集。这些都是不改动模型代码即可完成的实验变量,非常适合作为理解"非局部 + 金字塔池化"这一经典组合的入门与进阶实验。

  • 人工智能
  • 计算机视觉
  • 预训练

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

相关推荐

上一篇:BilibiliDown:免费开源B站视频下载终极解决方案
下一篇:Enterprise Commerce 数据分析接入:Vercel Analytics 与 Google Analytics 自由切换指南

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

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

基于 PaddleNLP SimpleServing 的多标签文本分类服务化部署实战指南

人工智能大模型预训练微调LoRARLHF强化学习分布式训练 【免费下载链接】PaddleNLP Easy-to-use and powerful LLM and SLM library with awesome model zoo. 项目地址: https://gitcode.com/gh_mirrors/pa/PaddleNLP 点击查看 免费下载 多标签文本分类模型&#xf…

作者头像 李华
网站建设 2026/9/25 8:24:08

大模型安全实战:深度伪造与AI滥用防御指南

1. 这不是“防黑客手册”,而是一份给AI工程师的实战安全操作日志“大模型安全深度学习指南:深度伪造与AI滥用专题(2)”——这个标题里藏着三个被严重低估的现实信号:第一,“深度伪造”早已不是实验室里的demo,而是每天…

作者头像 李华
网站建设 2026/9/25 8:24:00

Agent Skills实战:从提示词到可复用技能包,打造稳定高效的AI代理

最近大半年,我一直在和 agent 开发较劲。手上同时在用 Claude Code、Codex 和几个开源的 agent 框架,慢慢发现一个规律:真正决定 agent 好不好用的,往往不是模型本身,而是你有没有给它准备一套拿得出手的 agent skills…

作者头像 李华
网站建设 2026/9/25 8:23:18

VDI 与远程办公场景的进程白名单适配:安当RDM 防勒索落地实践

一、为什么 VDI 与远程办公成了勒索攻击的新焦点 虚拟桌面(VDI)与远程办公的普及,让"终端"这个边界变得模糊。过去我们习惯把防护重心放在物理办公电脑上:装杀毒、打补丁、管 U 盘。但当员工通过远程接入方式登录到数据…

作者头像 李华
网站建设 2026/9/25 8:23:17

局域网共享报0X80070035?从SMB协议排查网络路径

简介:日常使用 Win7 访问局域网共享文件夹时若遇到 0x80070035 错误并提示找不到网络路径,这份 docx 文档可提供完整的排查与处理参考。内容源于实际故障场景,作者先通过 ping 确认网络连通,再逐项检查防火墙、共享服务和系统服务…

作者头像 李华
网站建设 2026/9/25 8:21:12

车机Android STR唤醒黑屏冻屏问题排查与遮罩机制分析

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

作者头像 李华