- 人工智能
- 计算机视觉
- 预训练
【免费下载链接】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 仓库中 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 是模型的核心组装逻辑,依次完成三件事:
- AFNB 特征融合:用
AFNB把低层特征与高层特征做非局部融合(self.fusion); - APNB 上下文增强:融合结果先经过一层
ConvBNReLU(3x3)降维到inter_channels,再送入APNB提取非局部上下文(self.context); - 分类与辅助分支:
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)的计算流程为:
f_value将低层特征映射到value_channels,经_pp_module金字塔池化后转置为(B, S, C);f_query将高层特征映射到key_channels并展平为(B, HW, C);f_key将低层特征映射到key_channels,同样金字塔池化;- 计算相似度图
sim_map = query × key,按key_channels ** -0.5缩放后做 softmax; 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.yml | ResNet50_vd | Cityscapes | 1024x512 | 80000 |
| ann_resnet101_os8_cityscapes_1024x512_80k.yml | ResNet101_vd | Cityscapes | 1024x512 | 80000 |
| ann_resnet50_os8_voc12aug_512x512_40k.yml | ResNet50_vd | Pascal VOC 12+Aug | 512x512 | 40000 |
| ann_resnet101_os8_voc12aug_512x512_40k.yml | ResNet101_vd | Pascal VOC 12+Aug | 512x512 | 40000 |
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
| Model | Backbone | Resolution | Training Iters | mIoU | mIoU (flip) | mIoU (ms+flip) |
|---|---|---|---|---|---|---|
| ANN | ResNet50_OS8 | 1024x512 | 80000 | 79.09% | 79.31% | 79.90% |
| ANN | ResNet101_OS8 | 1024x512 | 80000 | 80.61% | 80.98% | 81.50% |
4.2 Pascal VOC 2012 + Aug
| Model | Backbone | Resolution | Training Iters | mIoU | mIoU (flip) | mIoU (ms+flip) |
|---|---|---|---|---|---|---|
| ANN | ResNet50_OS8 | 512x512 | 40000 | 80.82% | 81.10% | 81.67% |
| ANN | ResNet101_OS8 | 512x512 | 40000 | 79.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/result5.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.
相关推荐
PaddleSeg 中的 FCN + HRNet:Cityscapes 与 Pascal VOC 语义分割配置全解析
PaddleSeg 中的 FCN + HRNet:Cityscapes 与 Pascal VOC 语义分割配置全解析 导读 本文围绕 PaddleSeg 仓库中
人工智能计算机视觉预训练PaddleSeg 中的 DNLNet(Disentangled Non-Local Networks):解耦非局部注意力语义分割模型原理、配置与实战指南
PaddleSeg 中的 DNLNet(Disentangled Non Local Networks):解耦非局部注意力语义分割模型原理、配置与实战指南 导读
人工智能计算机视觉预训练PaddleSeg 中 BiSeNetV1 实时语义分割实战:网络架构、Cityscapes 训练配置与源码解析
PaddleSeg 中 BiSeNetV1 实时语义分割实战:网络架构、Cityscapes 训练配置与源码解析 BiSeNetV1(Bilateral Seg
人工智能计算机视觉预训练
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考