CVPR 2025 顶级图像算法论文精读:PFT 如何用“渐进聚焦注意力”刷新单图超分?
CVPR 2025 顶级图像算法论文精读PFT 如何用“渐进聚焦注意力”刷新单图超分摘要最近看了一篇很值得分析的图像算法论文Progressive Focused Transformer for Single Image Super-ResolutionPFT。这篇论文发表在CVPR 2025聚焦的是经典但一直很卷的任务——单图像超分辨率Single Image Super-Resolution, SISR。和很多继续堆大模型、堆更复杂注意力的工作不同PFT 提出了一个很直接的问题Transformer 在做超分时真的有必要让每个查询 token 和窗口内大量不相关 token 都做相似度计算吗作者的答案是否定的。于是论文提出了Progressive Focused AttentionPFA把前一层的注意力图传给后一层通过逐层继承和筛选让模型越来越聚焦真正重要的 token同时把大量无关计算提前剪掉。最终PFT 在精度和效率之间找到了很不错的平衡。本文将从问题背景、核心思路、模型结构、公式理解、实验结果、优缺点以及复现代码几个方面系统分析这篇最近的顶级图像算法论文。一、论文信息论文标题Progressive Focused Transformer for Single Image Super-Resolution会议CVPR 2025研究方向图像超分辨率、图像恢复、Transformer、高效注意力关键词单图超分、PFT、PFA、Transformer、图像恢复、稀疏注意力二、这篇论文想解决什么问题单图超分任务的目标很明确给定一张低分辨率图像恢复出更高分辨率、更清晰、更细节丰富的图像。但这个任务真正难的地方在于高频纹理、边缘结构和重复细节并不是只靠局部卷积就能稳定恢复出来的。因此近年来很多超分方法都开始引入 Transformer因为它可以建模长距离依赖利用更大范围的上下文关系恢复纹理细节。问题也随之出现1. 标准自注意力计算量大Transformer 的自注意力会计算 query 和大量 key 之间的相似度。在图像任务中即使使用窗口注意力窗口内依然存在很多和当前 query 几乎无关的 token。也就是说模型花了大量算力去比较很多本就不重要的位置。这不仅增加了计算量还可能把无关特征混进来影响重建效果。2. 现有稀疏注意力仍然不够“聪明”很多方法已经尝试做 sparse attention例如 top-k 选择只保留一部分高相关位置。但这些方法通常只根据当前层的相似度做一次筛选缺少一种更稳定的跨层判断机制。换句话说当前层觉得重要不一定真的长期重要当前层觉得不明显也可能是更深层会逐渐强化的关键关系所以论文要解决的核心问题可以总结成一句话如何让注意力在网络深度方向上逐渐聚焦真正重要的 token同时减少无效相似度计算三、论文的核心思路是什么PFT 的核心思想可以概括成一句话让后一层继承前一层的注意力分布让注意力随着网络加深逐步“聚焦”。这就是论文提出的Progressive Focused AttentionPFA。和普通注意力不同PFA 不再只看当前层算出来的注意力图而是把前一层的注意力图当前层新算出来的注意力图做逐元素相乘再归一化得到新的注意力图。这样做有两个很直接的效果1. 持续重要的位置会被不断强化如果某些 token 在前后多层里都保持高相关它们就会在连续乘法中被保留下来并逐渐突出。2. 不重要的位置会被逐步压掉如果某些位置在前几层就已经权重很低那么后面这些位置就越来越不可能被保留最终在计算时直接跳过。这个思路比单次 top-k 更“稳”因为它不是一次性硬筛而是让网络自己在多层传播中逐步确认哪些位置才是真的关键。四、PFA 的公式怎么理解论文中给出的关键公式是AlNorm(Al−1⊙Acall) \mathbf{A}^{l} Norm(\mathbf{A}^{l-1} \odot \mathbf{A}^{l}_{cal})AlNorm(Al−1⊙Acall)其中Acall\mathbf{A}^{l}_{cal}Acall表示当前第lll层根据 query 和 key 计算得到的注意力图Al−1\mathbf{A}^{l-1}Al−1表示上一层的注意力图⊙\odot⊙表示逐元素乘法Norm(⋅)Norm(\cdot)Norm(⋅)表示按行归一化这个公式非常关键。它表达的不是“重新算一次注意力”而是当前层的注意力不再完全由当前层自己决定而是要参考上一层已经聚焦过的结果。从直觉上看这很像“逐层确认”第一层先粗看后一层在前一层基础上继续缩小关注范围越往后注意力越集中五、论文真正聪明的地方不仅改权重还提前剪计算PFA 不只是改进了权重分配它还有一个更实用的点可以提前判断哪些位置没必要再算相似度。因为前一层的注意力图已经能告诉我们哪些 key 位置大概率重要哪些 key 位置已经长期不重要所以论文进一步引入了基于稀疏索引的计算方式只在保留下来的位置上继续计算注意力。这一步本质上就是先用前层结果做预筛选再只对“候选重要位置”算相似度这比“先全部算完再丢掉一部分”更高效。六、模型结构怎么理解PFT 的整体结构并不是推倒重来而是沿用了近几年图像超分 Transformer 的主框架然后把标准注意力模块替换成了 PFA Block。整体流程可以理解成下面这样输入低分辨率图像 ↓ 浅层卷积特征提取 ↓ 多层 Transformer 超分主干 └─ 每个 Block 内部使用 PFA └─ 同时使用 shifted window ↓ 重建模块 / 上采样模块 ↓ 输出高分辨率图像也就是说PFT 不是去改超分任务的整体流程而是专门对最耗算力、也最关键的注意力部分下手。这种设计很合理因为它保持了超分框架的主干稳定性模块替换的通用性和现有 Transformer SR 方法的可比性七、PFT 的关键模块逐个分析1. 浅层特征提取输入图像首先经过卷积层提取浅层特征。这一部分主要负责提取边缘和低层纹理将 RGB 图像映射到高维特征空间为后续 Transformer 模块提供基础表示这一步和大多数图像恢复网络类似不是创新重点。2. PFA Block论文真正的核心PFA Block 可以理解成“带有跨层注意力继承机制的 Transformer Block”。它内部主要包括LayerNormProgressive Focused AttentionMLP残差连接不同于普通窗口注意力PFA 会在层与层之间传递注意力图。也就是说注意力不再是“每层各算各的”而是跨层连续传播。这一点非常重要因为它让注意力从“静态局部判断”变成了“动态逐层聚焦”。3. Shifted Window 仍然保留论文并没有放弃 shifted window。它依然使用了来自 Swin Transformer 的 shift window 思想用来增强不同窗口之间的信息流动。这说明作者并不是完全另起炉灶而是在已有高效窗口机制上继续优化注意力筛选过程。这也是 PFT 实用的一点保留成熟的窗口机制在此基础上提升注意力质量与效率4. 渐进式保留策略PFT 里还有一个很关键的参数叫focus ratio也就是保留比例。论文中设定KlαKl−1,0α1 K^{l} \alpha K^{l-1}, \quad 0 \alpha 1KlαKl−1,0α1这表示随着层数增加被保留的注意力位置数量逐渐减少。这就形成了一个很自然的聚焦过程浅层保留更多候选位置避免过早误删深层逐渐减少候选只聚焦真正核心的 token这个设计很重要因为如果一开始就筛得太狠很容易把有价值的信息提前丢掉。八、复杂度分析它为什么比普通注意力更省论文给出了标准窗口自注意力的复杂度Ω(SA)4hwLC22W2hwLC \Omega (SA) 4 h w L C^2 2 W^2 h w L CΩ(SA)4hwLC22W2hwLC而 PFA 的复杂度写成Ω(PFA)∑l1L(4hwC22α(l−1)W2hwC) \Omega (PFA) \sum_{l1}^{L} \left( 4 h w C^2 2 \alpha^{(l-1)} W^2 h w C \right)Ω(PFA)l1∑L(4hwC22α(l−1)W2hwC)这个式子的重点不在于形式有多复杂而在于第二项标准注意力中所有层都按完整窗口做计算PFA 中随着层数增加参与注意力计算的位置越来越少也就是说PFA 不是一开始就把窗口变小而是在深层逐步减少真正参与计算的 token。论文还举了一个很直观的例子当α0.5\alpha 0.5α0.5时经过 4 次衰减后这部分复杂度只剩原来的6.25%。这就是它能同时兼顾精度和效率的原因。九、论文的结构配置也很有意思论文给了两个版本1. PFT标准版用于经典 SR 任务配置更强6 个 block每个 block 的注意力层数为[4, 4, 4, 6, 6, 6]6 个 attention heads通道数为 240窗口大小为32×32每个 block 保留的注意力值数量为[1024, 256, 128, 64, 32, 16]2. PFT-light轻量版用于轻量级 SR5 个 block注意力层数为[2, 4, 6, 6, 6]4 个 attention heads通道数为 52窗口大小依然是32×32保留数量为[1024, 256, 128, 64, 32]这个设计说明作者不是只做一个“重模型刷榜器”而是同时考虑了轻量化应用。十、实验效果到底怎么样论文在经典单图超分数据集上进行了比较包括Set5Set14BSD100Urban100Manga109评估指标主要是PSNRSSIM十一、经典 SR 任务上的表现在经典 SR 任务中PFT 相较多个强基线都有竞争力尤其是和较新的 ATD 对比时体现出了比较明显的“精度更高、计算更低”的特点。以×4结果为例PFT 的表现为Set533.15 / 0.9065Set1429.29 / 0.7978BSD10028.02 / 0.7527Urban10028.20 / 0.8412Manga10932.63 / 0.9306而论文中明确指出PFT 相比 ATD 将计算量降低了17.1%同时在多数数据集上拿到了更高的 PSNR。这说明 PFT 并不是“降复杂度换精度”而是在结构设计上确实更有效。十二、轻量级 SR 上也很能打轻量版PFT-light也不是简单缩水。以×4为例它的结果为Set532.63 / 0.9005Set1428.92 / 0.7891BSD10027.79 / 0.7445Urban10027.20 / 0.8171Manga10931.51 / 0.9204论文中指出PFT-light 相较 ATD-light 将复杂度降低了20.1%。而且在Urban100 ×2上PFT-light 比 ATD-light 高0.40 dB比 IPG-Tiny 高0.63 dB在Urban100 ×4上它比 IPG-Tiny 高0.42 dB比 ATD-light 高0.23 dB。这说明它在轻量场景下依然很有实际价值。十三、消融实验说明了什么论文的消融实验非常能说明问题。作者比较了四种注意力方式Vanilla Self-AttentionTop-k AttentionProgressive AttentionProgressive Focused Attention结果显示在相同或更低 FLOPs 下PFA 的结果最好。例如在消融表里PFA 的 FLOPs 为50.9G低于前面几种方法的70.4G同时在 Set5、Urban100、Manga109 上都取得了最优表现。这说明单纯 top-k 选择还不够跨层继承注意力确实有用“边筛边算” 比 “算完再筛” 更有效十四、我觉得这篇论文最值得学的地方如果从“做研究怎么借鉴”的角度看我觉得这篇论文最值得学的不是某个细节而是下面三点。1. 它找准了真正浪费算力的地方很多方法一说优化 Transformer就从改 backbone改大结构改训练策略开始下手。但 PFT 抓住的其实是一个更核心的问题窗口里那么多根本不重要的 token为什么还要层层反复算这是一个很“工程本质”的思路。2. 它不是简单稀疏而是跨层聚焦很多稀疏注意力方法做的是“当前层选择”而 PFT 做的是“跨层继承”。这使得模型的筛选逻辑更连续也更稳定。3. 它兼顾了论文创新和工程可实现性论文不仅提出了机制还专门实现了高效 CUDA kernel 来支持稀疏矩阵乘法。这说明作者不是停留在理论层面而是考虑了真实推理效率。十五、这篇论文也有哪些不足再好的论文也不是没有缺点PFT 也一样。1. 任务集中在经典 SR它目前主要验证的是单图超分。虽然作者提到未来可以扩展到其他视觉任务但论文本身还没有在更广泛的恢复任务上证明通用性。2. 实现难度高于普通 SR Transformer如果只是看公式PFA 好像不复杂。但真正落到工程里会涉及注意力图跨层传递稀疏索引维护稀疏矩阵乘法优化odd/even shift 路径管理这些都不是很“新手友好”。3. 高效性部分依赖底层实现论文里明确提到为了让 SMM 高效他们开发了专门的 CUDA kernel。这意味着如果只写纯 PyTorch 教学版可能很难完全复现论文中的速度优势。十六、适合哪些人读这篇论文我觉得这篇论文特别适合下面几类人1. 做图像超分和图像恢复的人这是它最直接的适用人群。2. 做高效注意力机制的人如果你正在思考如何减少 Transformer 中的无效计算PFT 的思路很值得借鉴。3. 做工程部署和轻量化的人它不是只追精度也确实重视复杂度控制和推理实现。十七、简化版复现代码下面给一个教学理解版的 PFA 核心逻辑。注意这不是论文官方代码的逐行复现而是帮助理解“跨层继承注意力 逐步筛选”的简化写法。importtorchimporttorch.nnasnnimporttorch.nn.functionalasFclassSimplePFA(nn.Module):def__init__(self,dim,num_heads4,keep_ratio0.5):super().__init__()self.dimdim self.num_headsnum_heads self.keep_ratiokeep_ratio self.head_dimdim//num_heads self.scaleself.head_dim**-0.5self.qkvnn.Linear(dim,dim*3)self.projnn.Linear(dim,dim)defforward(self,x,prev_attnNone): x: [B, N, C] prev_attn: [B, heads, N, N] or None B,N,Cx.shape qkvself.qkv(x).reshape(B,N,3,self.num_heads,self.head_dim)qkvqkv.permute(2,0,3,1,4)# [3, B, heads, N, head_dim]q,k,vqkv[0],qkv[1],qkv[2]# 当前层注意力attn_cur(q k.transpose(-2,-1))*self.scale attn_curattn_cur.softmax(dim-1)# 若有前一层注意力则做逐元素乘法继承ifprev_attnisnotNone:attnprev_attn*attn_cur attnattn/(attn.sum(dim-1,keepdimTrue)1e-6)else:attnattn_cur# 简化版 top-k 筛选模拟 progressively focusedk_keepmax(1,int(N*self.keep_ratio))topk_val,topk_idxtorch.topk(attn,kk_keep,dim-1)sparse_attntorch.zeros_like(attn)sparse_attn.scatter_(-1,topk_idx,topk_val)sparse_attnsparse_attn/(sparse_attn.sum(dim-1,keepdimTrue)1e-6)outsparse_attn v outout.transpose(1,2).reshape(B,N,C)outself.proj(out)returnout,sparse_attnclassPFABlock(nn.Module):def__init__(self,dim,num_heads4,mlp_ratio4.0,keep_ratio0.5):super().__init__()self.norm1nn.LayerNorm(dim)self.pfaSimplePFA(dim,num_headsnum_heads,keep_ratiokeep_ratio)self.norm2nn.LayerNorm(dim)self.mlpnn.Sequential(nn.Linear(dim,int(dim*mlp_ratio)),nn.GELU(),nn.Linear(int(dim*mlp_ratio),dim))defforward(self,x,prev_attnNone):y,attnself.pfa(self.norm1(x),prev_attn)xxy xxself.mlp(self.norm2(x))returnx,attnif__name____main__:xtorch.randn(2,64,96)# B2, N64 tokens, C96block1PFABlock(dim96,num_heads4,keep_ratio1.0)block2PFABlock(dim96,num_heads4,keep_ratio0.5)block3PFABlock(dim96,num_heads4,keep_ratio0.25)x,attn1block1(x,None)x,attn2block2(x,attn1)x,attn3block3(x,attn2)print(output shape:,x.shape)print(attn1 shape :,attn1.shape)print(attn2 shape :,attn2.shape)print(attn3 shape :,attn3.shape)十八、官方代码怎么跑官方仓库已经公开环境配置和推理命令也给得比较清楚。1. 克隆仓库gitclone https://github.com/LabShuHangGU/PFT-SR.gitcdPFT-SR2. 创建环境conda create-nPFTpython3.9conda activate PFT pipinstall-rrequirements.txt python setup.py developcd./ops_smm ./make.sh3. 单张图推理# 经典 SRpython inference.py-iinference_image.png-oresults/test/--scale4--taskclassical# 轻量 SRpython inference.py-iinference_image.png-oresults/test/--scale4--tasklightweight十九、如果你想继续深入复现可以从哪些方向做1. 先复现教学版 PFA先把“跨层继承注意力”这个核心逻辑跑通。2. 再补齐窗口划分与 shifted window这一步是接近论文完整结构的关键。3. 实现逐层衰减的保留数量也就是让KKK随深度递减而不是固定 top-k。4. 最后再做 CUDA 优化如果只是研究结构前面三步就够了如果想复现论文的效率优势必须考虑稀疏计算实现。二十、总结PFT 是一篇很典型的“问题抓得准”的论文。它没有一味把 Transformer 做得更大也没有停留在普通稀疏注意力上而是提出了一个更有连续性的思路让注意力在层与层之间传播并随着深度逐步聚焦真正重要的 token。这个思路带来了两个直接收益更好的特征聚合权重更少的无效相似度计算从结果上看它确实做到了在经典 SR 和轻量 SR 两个场景下同时提升精度并降低复杂度。从研究角度看这篇论文最大的价值不只是“超分又涨了几点”而是它提醒我们高效注意力的关键不一定是更复杂的筛选规则而可能是让筛选在网络深度方向上连续发生。如果你最近想分析一篇最近、顶级、又有明确工程价值的图像算法论文这篇CVPR 2025 的 PFT很值得认真读一遍。