news 2026/10/18 1:17:08

PVTv2 架构全解析:卷积与 Transformer 如何混合出无需位置编码的多尺度特征

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PVTv2 架构全解析:卷积与 Transformer 如何混合出无需位置编码的多尺度特征

【免费下载链接】pvt_v2_b3

项目地址:https://ai.gitcode.com/OpenGVLab/pvt_v2_b3
点击查看免费下载

PVTv2(Pyramid Vision Transformer v2)是轻量级分层 Transformer 视觉骨干网络的代表作。pvt_v2_b3是其中base 规模的 B3 版本——它在 Transformer 层里融入卷积操作,无需位置编码即可学习图像数据,并天然输出多尺度特征图,是语义分割、目标检测、深度估计等密集预测任务的常用骨干。

本文带你从原理到参数,一文读懂 PVTv2 b3 的设计精髓。

一、为什么需要 PVTv2:三大设计亮点

纯 Transformer 处理图像时有两个天然短板:

  1. 缺乏局部归纳偏置——CNN 的卷积天生擅长捕捉局部纹理,Transformer 的注意力机制对此"无感"
  2. 单一尺度输出——标准 ViT 只输出全局特征,无法直接用于逐像素预测任务

PVTv2 给出了一组优雅的解决方案,README.md 将其概括为三点:

设计决策解决的问题核心手段
卷积融入 Transformer局部特征学习能力弱Patch Embedding 与空间降采样均改用卷积
无需位置编码位置嵌入参数冗余、泛化受限卷积与 SR 机制本身编码了空间信息
多尺度特征输出单一尺度不适配密集任务4 个 Stage 输出 1/4~1/32 共 4 组特征图

💡 这三点正是 PVTv2 被 SegFormer、Deformable DETR 等热门模型选作骨干的原因。

二、PVTv2-B3 架构全景:4 个 Stage 如何工作

pvt_v2_b3由4 个 Stage(编码器 Block)组成,每个 Stage 包含若干 Transformer Block。从 config.json 可以读出 B3 的完整超参数:

参数(config.json)Stage 1Stage 2Stage 3Stage 4
hidden_sizes(通道数)64128320512
depths(Block 层数)34183
num_attention_heads(注意力头)1258
patch_sizes(卷积核)7×73×33×33×3
strides(下采样步长)4222
sr_ratios(SR 压缩比)8421

📌 Stage 3 堆叠了 18 层 Block,是模型的主力"深加工区",贡献了大部分参数量。

以224×224输入(config.json 中image_size)为例,前向过程的特征分辨率变化:

输入图像 224 × 224 × 3 │ ▼ Stage 1:7×7 卷积,stride 4 → 特征图 1/4 56 × 56 × 64 (3136 个 token) │ ▼ Stage 2:3×3 卷积,stride 2 → 特征图 1/8 28 × 28 × 128 (784 个 token) │ ▼ Stage 3:3×3 卷积,stride 2 → 特征图 1/16 14 × 14 × 320 (196 个 token) │ ▼ Stage 4:3×3 卷积,stride 2 → 特征图 1/32 7 × 7 × 512 (49 个 token)

最终通过out_features参数(stage1~stage4,见 config.json)把 4 个尺度的特征图全部输出——这就是 PVTv2 的"金字塔"输出的由来。

2.1 卷积替代了哪些"Transformer 组件"

在标准 ViT 中,Patch Embedding 是简单的"切块 + 线性投影"。PVTv2 做了两处关键替换:

① 重叠卷积做 Patch Embedding

用7×7(Stage 1)和3×3(Stage 2~4)的重叠卷积取代线性投影。卷积核在相邻 patch 间共享感受野,相当于在 token 化的同时就完成了局部信息融合——这是"卷积融入 Transformer"的第一步。

② 卷积做空间降采样

Stage 之间不再用简单的 reshape 或 stride 变换,而是用 3×3 卷积 + stride 2 下采样。相比直接丢分辨率,卷积下采样保留了更多上下文,且无需额外可学习的位置嵌入。

🎯 这两步合起来,让 PVTv2 完全抛弃了位置编码:空间关系由卷积的局部感受野和特征图的网格结构隐式承载,省掉一组可学习参数,也让模型对输入分辨率更鲁棒。

三、SR Attention:注意力算力的"减负阀"

Token 序列太长是 Transformer 落地图像的大敌——Stage 1 有 3136 个 token,若做完整自注意力,计算量按 O(n²) 爆炸增长。

PVTv2 的解法是SR(Spatial Reduction)模块:在注意力计算前,先把 token 序列做自适应平均池化再投影,大幅压缩序列长度,注意力算完后再恢复原始分辨率。压缩比由 config.json 中的sr_ratios控制:

Stagesr_ratio注意力时的 token 数(224 输入)
Stage 183136 →约 400
Stage 24784 →约 196
Stage 32196 →约 98
Stage 4149 → 49(保持,无需再压)

🧮 粗略估算:Stage 1 的注意力复杂度从 O(3136²) ≈ 985 万降到 O(400²) ≈ 16 万,约 60 倍的计算节省——这就是 PVTv2 能以 43M 参数量跑出高效推理的关键。

配合qkv_bias=true(Q/K/V 投影带偏置,见 config.json),SR Attention 既省算力又保效果。

四、多尺度特征图的实战价值

PVTv2 的金字塔输出(out_indices: [0, 1, 2, 3])对下游任务是"即插即用"的。README.md 列出的四个代表性应用:

下游模型任务为什么需要多尺度
SegFormer语义分割逐像素预测,需要 1/4 到 1/32 全尺度特征融合
Panoptic Segformer全景分割实例 + 语义联合,小目标依赖高分辨率层
Deformable DETR2D 目标检测多尺度锚点特征提升中小目标召回
GLPN单目深度估计密集回归,需要空间细节保留

💡 如果你要搭建分割/检测模型,不用换骨干:PVTv2 b3 的 4 组输出天然就是 FPN 式的多尺度输入,接上解码器即可训练。

五、模型文件与预处理配置速览

pvt_v2_b3仓库包含 3 个核心文件:

文件作用
model.safetensors模型权重(float32,见 config.jsontorch_dtype)
config.json完整架构超参数(Stage 结构、头数、SR 比例等)
preprocessor_config.json图像预处理配置

预处理要点(来自 preprocessor_config.json):

  • 输入尺寸:224 × 224(size)
  • 缩放因子:rescale_factor = 0.00392156862745098(即 /255,把 0~255 映射到 0~1)
  • 归一化均值:[0.485, 0.456, 0.406](RGB 三通道)
  • 归一化标准差:[0.229, 0.224, 0.225]
  • 插值方式:resample = 2(双线性)

这组均值/方差是 ImageNet 统计量,说明 B3 权重是在 ImageNet 上预训练的分类权重(architectures为PvtV2ForImageClassification),可直接作为骨干迁移到下游密集任务。

六、总结:PVTv2 b3 的核心设计记忆点

  1. 卷积干脏活:Patch Embedding 和空间降采样全用卷积,替代 ViT 的"切块 + 位置编码"
  2. SR 管算力:sr_ratios池化压缩 token 序列,注意力复杂度直降一个量级
  3. 无位置编码:空间信息由卷积感受野和特征图网格隐式表达,少一组参数
  4. 金字塔输出:4 个 Stage 输出 1/4~1/32 共 4 组特征图,分割/检测/深度即插即用

✅ 记住一句话:PVTv2 = 卷积负责"看局部",Transformer 负责"看全局",SR 负责"省算力"。理解这三点,就抓住了 pvt_v2_b3 的全部精髓。

【免费下载链接】pvt_v2_b3

项目地址:https://ai.gitcode.com/OpenGVLab/pvt_v2_b3
点击查看免费下载
上一篇:TKeed 调试实录:无任务时 CPU 为何飙到 90%?一个条件变量 bug 的完整排查过程
下一篇:【亲测免费】 Hap QuickTime 编解码器开源项目常见问题解决方案

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

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

Python连接串口并发送命令

在Python中,可以使用 pyserial 库来连接串口并发送命令。pyserial 是一个用于串行通信的第三方库,支持多种平台。首先,需要安装 pyserial 库。可以使用 pip 进行安装:pip install pyserial使用 pyserial 连接串口并发送命令以下是…

作者头像 李华
网站建设 2026/10/18 1:14:53

Paperless-ngx 实战指南:快速部署可全文检索的文档管理系统

Paperless-ngx 实战指南:快速部署可全文检索的文档管理系统 【免费下载链接】paperless-ngx A community-supported supercharged document management system: scan, index and archive all your documents 项目地址: https://gitcode.com/GitHub_Trending/pa/pa…

作者头像 李华
网站建设 2026/10/18 1:11:31

通过AgentScope在EKS部署远程沙盒与代理应用:TaoToken统一Key接入实践

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

作者头像 李华