CAMixerSR: Only Details Need More “Attention”

Abstract

  • 为了满足对大图像(2K-8K)超分辨率(SR)的快速增长的需求,流行的方法遵循两条独立的路线:1)通过内容感知路由加速现有网络,以及2)通过令牌混合器精炼设计更好的超分辨率网络。尽管直接,但是它们遇到了不可避免的缺陷(例如,不灵活的路由或者非歧视性的处理),限制了质量-复杂性权衡的进一步改进。为了消除这些缺点,我们通过提出内容感知混合器(CAMixer)来整合这些方案,该混合器为简单上下文分配卷积,为稀疏纹理分配额外的可变形窗口注意。
  • 具体而言,CAMixer使用可学习的预测器来生成多个引导,包括用于窗口扭曲的偏移、用于对窗口进行分类的掩码以及用于赋予卷积动态属性的卷积关注,其自适应地调节关注以包括更多有用的纹理,并提高卷积的表示能力。我们进一步引入全局分类损失来提高预测器的准确性。通过简单地堆叠CAMixers,我们获得了CAMixerSR,它在大图像SR、轻量级SR和全方位图像SR上实现了优越的性能。GitHub - icandle/CAMixerSR: CAMixerSR: Only Details Need More “Attention” (CVPR 2024).
  • 论文地址:[2402.19289] CAMixerSR: Only Details Need More “Attention”
  • 为解决大图像(2K-8K)超分辨率(SR)中质量 - 复杂度权衡的问题,论文提出内容感知混合器(CAMixer),整合现有 “内容感知路由加速” 与 “令牌混合器优化” 两大独立策略:通过可学习预测器生成偏移量(用于窗口变形)、掩码(用于窗口分类)及卷积注意力(增强卷积动态性),为简单图像区域分配卷积运算,为复杂稀疏纹理区域分配额外可变形窗口注意力;基于 CAMixer 堆叠构建CAMixerSR,并引入全局分类损失提升预测器精度。
  • 现有SR两大独立策略局限:加速框架(如ClassSR、ARM):分类精度低、分区僵化、感受野有限;轻量模型(如IMDN、SwinIR-light):未区分处理不同复杂度内容,2K-8K场景适配差。
  • 核心方法,内容感知混合器(CAMixer),组件1:预测器(输入:局部C_l、全局C_g、窗口C_w;输出:偏移量∆p、掩码m、空间A_s/通道A_c注意力);组件2:注意力分支(处理复杂区域,用∆p变形窗口,稀疏注意力计算);组件3:卷积分支(处理简单区域,深度卷积+A_s/A_c增强);关键参数:注意力比例γ(0-1,控制SA/卷积分配)。CAMixerSR架构,改进SwinIR-light,浅特征提取器、深特征提取器(20个CAMixer+FFN块)、重建模块、全局预测器。训练损失,L₁损失(优化SR backbone),辅助损失:比例损失 ℓ r a t i o ℓ_ratio ratio(控制γ,预训练 γ r e f = 0.5 ,微调 γ r e f ∈ [ 0 , 1 ] γ_{ref}=0.5,微调γ_{ref}∈[0,1] γref=0.5,微调γref[0,1] )。

Introduction

  • 最近对神经网络的研究显著提高了图像超分辨率(SR)质量。然而,现有方法生成视觉上令人愉悦的高分辨率(HR)图像,但在现实世界使用中遭受密集计算,特别是对于2K-8K目标。为了减少开销,许多加速框架和轻量级网络被引入实际的超分辨率应用。然而,这些方法是完全独立的,不需要合作。
  • 第一种策略,加速框架,基于不同图像区域需要不同网络复杂性的观察,从不同模型的内容感知路由的角度解决问题。如图1的中间图像所示,他们将大量输入图像分解成固定的小块,并通过额外的分类网络将小块分配给网络。ARM 通过引入基于LUT的分类器和参数共享设计来提高效率,从而进一步发展了该策略。尽管这些策略对所有的神经网络都是通用的,但仍然存在两个不可避免的缺陷。一个是分类差,划分不灵活。图1显示了带有小细节的窗口,这些小细节被不恰当地发送到简单模型。另一个是有限的感受野。如表2中所示、将图像裁剪成小块限制了感受野,从而影响了表现。
    • 在这里插入图片描述

    • 图1。ClassSR 框架和CAMixer的比较。左)plain/complex 斑块的恢复难度各不相同。Middle)ClassSR将输入图像裁剪为子图像,通过不同复杂度的模型进行判别处理。右)我们引入了一个内容感知混合器(CAMixer)来计算复杂区域的自关注,而简单上下文的卷积。

  • 第二种策略,轻量级模型设计,侧重于细化神经算子(自关注或卷积)和主干结构,以在有限的层内实现更强的特征表示能力,即使用更多的内部信息来重建图像。例如,NGswin 利用N-Gram进行自我注意,以减少计算并扩大感受野。IMDN 为有效的区块设计引入了信息多重蒸馏。尽管这些轻量级方法在720p/1080p图像上达到了令人印象深刻的效率,但它们的使用很少在较大输入(2K-8K)下得到检验。此外,这些方法忽略了可以区别处理不同内容的固有特性。
  • 本文首先整合了上述策略,它是基于不同的特征区域需要不同级别的令牌混合器复杂性的观察结果。如表1中所示,简单卷积(Conv)可以类似地执行更复杂的卷积+自我关注(SA + Conv)用于简单的补丁。因此,我们提出了一个内容感知混合器(CAMixer)来根据内容路由具有不同复杂度的令牌混合器。如图1所示,我们的CAMixer对复杂窗口使用复杂自注意(SA ),对简单窗口使用简单卷积。
    • 在这里插入图片描述

    • 表1。由三个令牌混频器获得的PSNR(dB)值。

    • 在这里插入图片描述

    • 表2。将图像裁剪成更小的图块会导致更大的水滴。

  • 此外,为了解决ClassSR的局限性,我们引入了一个更复杂的预测器。该预测器利用多个条件来生成额外的有价值的信息,从而以改进的分区精度和更好的表示来增强CAMixer。基于CAMixer,我们为超分辨率任务构造了CAMixerSR。为了全面检验CAMixer的性能,我们对轻量级随机共振、大输入(2K-8K)随机共振和全向图像随机共振进行了实验。图2说明了CAMixerSR在轻量级SR和加速框架方面都取得了很大进步。我们的贡献总结如下:
    • 我们提出了一种结合卷积和自我注意的内容感知混合器(CAMixer ),它可以通过将简单区域分配给卷积,将复杂区域分配给自我注意来自适应地控制推理计算。

    • 我们提出了一个强大的预测器来生成偏移、掩模和简单的空间/通道注意,它调制CAMixer以用更少的计算来捕获更长范围的相关性。

    • 基于CAMixer,我们构建了CAMixerSR,它在三个具有挑战性的超分辨率任务上展示了最先进的质量计算权衡:轻量级SR、大输入SR和全向图像SR。

    • 在这里插入图片描述

    • 图2:Test8K上的性能(PSNR FLOP)比较。绿色虚线表示CAMixerSR的权衡曲线。

  • 基于对现有 SR 技术局限性的分析,论文提出 3 大核心观点:
    • “整合优于独立”:现有 “加速框架(内容感知路由)” 与 “轻量模型(令牌混合器)” 两大策略独立发展,前者分类粗、后者无区分处理,需整合二者优势,实现 “内容感知的令牌混合”;
    • “动态分配计算资源”:不同图像区域复杂度差异大(简单区域如天空、复杂区域如建筑),应自适应分配计算资源(简单用卷积、复杂用 SA),而非全区域用统一算子;
    • “预测器需多条件输入”:仅靠局部特征的分类器(如 ClassSR)精度低,需结合局部、全局、窗口位置信息,生成偏移量、注意力等多维度引导信息,提升区域分类与特征表示能力。

Related Work

  • SR的加速框架。随着复杂度不断增加以获得更好的恢复质量,SR模型的实际应用变得更加困难,尤其是2K-8K SR。最近的研究从不同的角度解决了这个问题。他们不是设计一个轻量级模型,而是使用内容感知路由将裁剪的补丁动态地发送给具有不同复杂性的模型。ClassSR 利用3类分类器来确定由复杂/中等/简单网络计算的子图像,这为8K数据集上的RCAN 节省了50%的计算。PathRestore 学会了根据上下文选择特征路径以适应FLOPs。

  • 自第一项工作SRCNN 在超分辨率任务中使用卷积神经网络(ConvNet)以来,已经提出了许多策略来降低复杂度,以实现更轻量级的推理。早期的DRCN 和DRRN 试图通过使用递归块来减少参数,但是计算量很大。为了缓解这一缺点,IDN 和IMDN 采用了有效的信息融合结构来减少参数和计算量。后一个ConvNet,例如EFDN 和RLFN 进一步简化了信息提取过程,并引入了重新参数化,以在移动设备上获得实时推理。随着最近transformers的快速发展,各种强大的令牌混合器,例如self-attention 和large kernel convolution 被引入轻量级SR。例如,SwinIR 利用基于窗口的SA,MAN 采用大核卷积,两者都实现了SOTA性能。尽管这些神经算子能够捕捉长程相关性,但它们需要大量的计算。为此,本文将内容感知路由整合到令牌混合器设计中,对信息区域采用复杂算子,而对普通区域采用简单算子。

    • 在这里插入图片描述

    • 图3。拟议的CAMixer概述。CAMixer由三个部分组成:预测器、自注意分支和卷积分支。

    • 类别 代表方法 核心思路 局限
      加速框架 ClassSR 3 分类器分配子块至复杂 / 中等 / 简单模型,节省 RCAN 50% 计算 分类精度低、感受野有限
      加速框架 ARM LUT 分类器 + 参数共享,优化效率 未解决分区僵化问题
      轻量模型 IMDN 信息多蒸馏模块,减少参数与计算 无内容区分处理
      轻量模型 SwinIR-light 窗口 SA 捕捉长程依赖 全区域用 SA,计算开销仍高
      轻量模型 NGswin N-Gram 优化 SA,扩大感受野 未适配大图像场景

Method

Content-Aware Mixing

  • 我们提出的CAMixer的概述如图3所示。CAMixer由三个主要组件组成:预测器模块、注意分支和卷积分支。给定输入特征 X ∈ R C × H × W X ∈ \R^{C×H×W} XRC×H×W,首先通过逐点卷积投影得到值 V ∈ R C × H × W V ∈ \R^{C×H×W} VRC×H×W :

    • V = f P W C o n v ( X ) , ( 1 ) V = f_{ {PWConv}}(X ), (1) V=fPWConv(X),(1)
  • 预测器。基于局部条件 C l = V C_l = V Cl=V、全局条件 C g ∈ R 2 × H × W C_g ∈ \R^{2×H×W} CgR2×H×W 和线性位置编码 C w ∈ R 2 × H × W C_w ∈ \R^{2×H×W} CwR2×H×W ,预测器首先计算共享的中间特征图 F,然后生成偏移图、混合器掩模和简单的空间/通道注意:

    • F = f h e a d ( C l , C g , C w ) , F ^ = f r e d u c e ( F ) ∈ R H W M 2 × M 2 , Δ p = r ⋅ f o f f s e t s ( F ) ∈ R 2 × H × W , m = F ^ W m a s k ∈ R H W M 2 × 1 , A s = f s a ( F ) ∈ R 1 × H × W , A c = f c a ( F ) ∈ R C × 1 × 1 , ( 2 ) \begin {aligned} \rm F = f_{{head}}(\rm C _l&, \rm C _{g},\rm C _{w}),\quad \hat {\rm F }= f_{ {reduce}}(\rm F )\in \mathbb {R}^{\frac {HW}{M^2} \times M^2},\\ \Delta p & = r\cdot f_{ {offsets}}(\rm F )\in \mathbb {R}^{2\times H\times W}, \\ m &= \hat {\rm F }\rm W _{ {mask}}\in \mathbb {R}^{\frac {HW}{M^2}\times 1},\\ \rm A _{s}& = f_{ {sa}}(\rm F )\in \mathbb {R}^{1\times H\times W}, \\ \rm A _{c}& = f_{ {ca}}(\rm F )\in \mathbb {R}^{C\times 1\times 1}, \\ \end {aligned} (2) F=fhead(ClΔpmAsAc,Cg,Cw),F^=freduce(F)RM2HW×M2,=rfoffsets(F)R2×H×W,=F^WmaskRM2HW×1,=fsa(F)R1×H×W,=fca(F)RC×1×1,(2)

    • 其中p是内容相关的偏移矩阵,用于通过更复杂的结构来扭曲窗口。r 是控制偏移范围的标量。F 是根据注意窗口大小 m 缩小并重新排列的即时特征。m 是决定裁剪窗口是由注意力还是卷积计算的掩码。As 和 Ac 是空间和信道注意力以增强卷积分支。

  • 注意分支。为了计算复杂区域的稀疏注意力,我们使用偏移量p通过双线性插值 ϕ (来调制原始输入x,以在所选窗口中包括更多有用的内容:

    • X = ϕ ( X , Δ p ) . ( 3 ) {X } = \phi (X ,\Delta p). (3) X=ϕ(X,Δp).(3)

    • 我们随后根据窗口形状M ×M重新排列 X ˉ , V ∈ R H W M 2 × M 2 × C \bar X,V ∈ \R^{\frac{HW}{M^2} ×M^2×C} XˉVRM2HW×M2×C。在训练阶段,我们应用gumble softmax 计算二进制掩码 M = gumble softmax(m) ,用于硬和简单令牌采样。在推断期间,通过使用argsort(m)对排序掩码m进行降序排序,我们获得了用于稀疏注意力的前K个相关窗口的索引 I h a r d I_{hard} Ihard ,以及用于卷积的其他硬件 H W M 2 − K \frac{HW}{M^2}-K M2HWK 个窗口的 I s i m p l e I_{simple} Isimple ,其中 K = ∑ M K =\sum M K=M 。我们将注意力碎片的比率表示为 γ = K / H W M 2 γ = K/ \frac{HW}{M^2} γ=K/M2HW。根据索引,我们将 X ˉ \bar X Xˉ 和 V 除以:

    • X h a r d = X [ I h a r d ] ∈ R K × M 2 × C , V h a r d = V [ I h a r d ] ∈ R K × M 2 × C , V s i m p l e = V [ I s i m p l e ] ∈ R ( H W M 2 − K ) × M 2 × C . \begin {aligned} {\rm X }_{ {hard}} &= {\rm X }[I_{{hard}}]\in \mathbb {R}^{K\times M^2\times C},\\ {\rm V }_{ {hard}} &= {\rm V }[I_{ {hard}}]\in \mathbb {R}^{K\times M^2\times C},\\ {\rm V }_{ {simple}} &= {\rm V }[I_{ {simple}}]\in \mathbb {R}^{(\frac {HW}{M^2}-K)\times M^2\times C}. \end {aligned} XhardVhardVsimple=X[Ihard]RK×M2×C,=V[Ihard]RK×M2×C,=V[Isimple]R(M2HWK)×M2×C.

    • 获得 X h a r d X_{hard} Xhard 后,由线性层生成查询 Q h a r d Q_{hard} Qhard 和密钥 K h a r d K_{hard} Khard:

    • Q = X h a r d W q , K = X h a r d W k ∈ R K × M 2 × C . ( 5 ) {\rm Q } ={\rm X }_{{hard}}\rm W _q, \quad {\rm K } = {\rm X }_{ {hard}}\rm W _k\in \mathbb {R}^{K\times M^2\times C}. (5) Q=XhardWq,K=XhardWkRK×M2×C.(5)

    • 基于以上推导,对于复杂窗口的自我关注可以表示为:

    • V h a r d = s o f t m a x ( Q K T d ) V h a r d ∈ R K × M 2 × C . ( 6 ) {\rm V }_{{hard}} = {softmax}(\frac { {\rm Q } {\rm K }^{T}}{\sqrt {d}}){\rm V }_{ {hard}}\in \mathbb {R}^{K\times M^2\times C}. (6) Vhard=softmax(d QKT)VhardRK×M2×C.(6)

    • 对于windows Vsimple for light操作,我们使用重新排列的As通过逐元素乘法实现简单注意:

    • V s i m p l e = A s ⋅ V s i m p l e ∈ R ( H W M 2 − K ) × M 2 × C . ( 7 ) {\rm V }_{{simple}} = {\rm A }_{s}\cdot {\rm V }_{{simple}}\in \mathbb {R}^{(\frac {HW}{M^2}-K)\times M^2\times C}. (7) Vsimple=AsVsimpleR(M2HWK)×M2×C.(7)

    • 总的来说,我们整合了Vhard和Vsimple,以在指标的帮助下获得注意分支 V a t t n ∈ R C × H × W V_{attn} ∈ \R^{C×H×W} VattnRC×H×W 的输出。

  • 卷积分支。我们利用深度方向卷积和预先生成的信道注意力来捕捉局部相关性,其可以被公式化为:

    • V c o n v = f D W C o n v ( V a t t n ) ⋅ A c + V a t t n ( 8 ) {\rm V }_{ {conv}} = f_{ {DWConv}}({\rm V }_{ {attn}})\cdot \rm A _c + {\rm V }_{ {attn}} (8) Vconv=fDWConv(Vattn)Ac+Vattn(8)

    • 最后,CAMixer的输出通过逐点卷积投影如下:

    • V o u t = f P W C o n v ( V c o n v ) , ( 9 ) \rm V _{ {out}} = f_{ {PWConv}}({\rm V }_{ {conv}}), (9) Vout=fPWConv(Vconv),(9)

  • CAMixer. 总的来说,通过控制自我注意比率γ,我们调整了内容感知混合。当γ = 1时,CAMixer是自我注意和卷积的结合,类似于ACMix 。对于γ = 0,CAMixer是一个低复杂度的纯卷积令牌混合器。对于γ ∈ (0,1),CAMixer学习内容感知混合,该混合对硬区域使用复杂模式,但对平原区域使用简单模式。

  • 复杂性分析。我们从理论上比较了Tab 3 中卷积、基于窗口的自注意和CAMixer的复杂度。具体来说,CAMixer的FLOPs由三部分组成:卷积、注意力和预测器。给定C ×h×w的输入,卷积分支利用计算成本为 K 2 C h w K^2Chw K2Chw 的深度卷积。对于注意力分支,四次投影操作花费 2 ( 1 + γ ) C 2 h w 2(1 + γ)C^2hw 2(1+γ)C2hw ,而注意力计算花费 2 γ M 2 C h w 2γM^2Chw 2γM2Chw ,其中 γ = K / ( h w M 2 ) γ = K/(\frac{hw}{M^2}) γ=K/(M2hw) 是硬窗口的比率。对于预测器模块,它增加了一系列计算:用于共享头的 ρ C ( C + 4 ) h w ρC(C + 4)hw ρC(C+4)hw ,用于掩模的Mhw,用于偏移的 2 ρ C h w 2ρChw 2ρChw ,用于空间注意的 ρ k 2 c h ρk^2ch ρk2ch,以及用于通道注意的ρC2,其中 ρ = 1 8 ρ =\frac 1 8 ρ=81 是减少计算的减少比率。

    • 在这里插入图片描述

    • 表3。卷积、基于窗口的多头自注意和我们的CAMixer之间的复杂性比较。CAMixer在语义上将卷积和自我关注与可变计算相结合。h、w:输入图像的高度和宽度。C:输入和输出通道。k:卷积核大小。M:窗口大小。γ:由SA计算的令牌比率。ρ:缩减比率。

Network Architecture

  • 最后,我们通过修改swinir-light构建了CAMixerSR。通常,CAMixerSR由四个组件组成,其中三个来自SwinIR:浅层特征提取器、深层特征提取器、重建模块和附加的全局预测器模块,如图3所示。此外,我们用CAMixer代替了基于窗口的自我注意,减少了块数。

Training Loss

  • 我们描述了我们的 CAMixerSR 的训练目标,包括超分辨率框架和预测器的优化。继以前的工作,我们采用初级ℓ1损失训练骨干。假设输入批次具有N个图像对,即 { I i L R , I i H R } i = 1 N \{I^{LR}_i,I^{HR}_i \} ^N_{i=1} {IiLRIiHR}i=1N ,该过程可以由下式表示:

    • ℓ 1 = 1 N ∑ i = 1 N ∥ I i H R − f C A M i X e r S R ( I i L R ) ∥ 1 , ( 10 ) \ell _1 = \frac {1}{N}\sum _{i=1}^{N}\left \| I_i^{ {HR}}-f_{CAMiXerSR}(I_i^{ {LR}}) \right \|_1, (10) 1=N1i=1N IiHRfCAMiXerSR(IiLR) 1,(10)

    • 其中 f C A M i x e r S R ( ⋅ ) f_{CAMixerSR}(·) fCAMixerSR() 是建议的 C A M i x e r S R CAMixerSR CAMixerSR 。为了监控S- camixer 的预测值,根据之前控制SA稀疏性的工作,我们采用一个简单但有效的MSE损失来控制比率γi:

    • ℓ r a t i o = 1 N ∑ i = 1 N ∥ γ r e f ⋅ ( 1 − 2 S ∑ i = 1 S γ i ) ∥ 2 , ( 11 ) \ell _{{ratio}} = \frac {1}{N}\sum _{i=1}^{N}\left \| \gamma _{ref} \cdot \left (1- \frac {2}{S}\sum _{i=1}^{S}\gamma _i\right ) \right \|_2, (11) ratio=N1i=1N γref(1S2i=1Sγi) 2,(11)

    • 其中, γ r e f γ_{ref} γref 表示参考总比率,γi表示第I个混频器的硬令牌比率。为了实现动态比率的一次训练,我们用 γ r e f = 0.5 γ_{ref} = 0.5 γref=0.5 对CAMixerSR进行预训练,并用 γ r e f ∈ [ 0 , 1 ] γ_{ref} ∈ [0,1] γref[01] 进行微调。总的来说,我们通过简单地结合上述目标来训练CAMixerSR:

    • ℓ = ℓ 1 + ℓ r a t i o . ( 12 ) \ell = \ell _1 + \ell _ {ratio}. (12) =1+ratio.(12)

核心方法:CAMixer 与 CAMixerSR

  • 内容感知混合器(CAMixer),CAMixer 是核心算子,由预测器模块注意力分支卷积分支三部分组成(图 3),输入特征为 X ∈ R C × H × W X∈\R^{C×H×W} XRC×H×W

    • 组件 核心功能 关键公式 / 参数
      预测器 生成引导信息,优化区域分类与特征表示 输入:局部条件 C l = V C_l=V Cl=V、全局条件 C g C_g Cg、窗口条件 C w C_w Cw; 输出:偏移量 Δ p \Delta p Δp(控制窗口变形)、掩码m(SA / 卷积分配)、空间注意力 A s A_s As、通道注意力 A c A_c Ac
      注意力分支(复杂区域) 稀疏 SA 计算,捕捉长程依赖 1. 用(\Delta p)变形窗口(双线性插值 ϕ \phi ϕ); 2. 掩码m排序选 Top-K 窗口( K = ∑ M K=\sum M K=M,M为窗口大小); 3. SA 计算: V h a r d = s o f t m a x ( Q ^ K ^ T d ) V h a r d V_{hard}=softmax(\frac{\hat{Q}\hat{K}^T}{\sqrt{d}})V_{hard} Vhard=softmax(d Q^K^T)Vhard
      卷积分支(简单区域) 轻量局部特征提取 深度卷积 + 通道 / 空间注意力: V c o n v = f D W C o n v ( V a t t n ) ⋅ A c + V a t t n V_{conv}=f_{DWConv}(V_{attn})·A_c + V_{attn} Vconv=fDWConv(Vattn)Ac+Vattn
      动态控制 调节 SA / 卷积比例 注意力比例 γ = K / ( H W / M 2 ) \gamma=K/(HW/M²) γ=K/(HW/M2) γ = 1 \gamma=1 γ=1(全 SA + 卷积)、 γ = 0 \gamma=0 γ=0(全卷积)、 γ ∈ ( 0 , 1 ) \gamma∈(0,1) γ(0,1)(自适应分配)
  • CAMixerSR 网络架构,基于 SwinIR-light 改进,包含 4 大模块:浅特征提取器:1×1 卷积将输入映射为特征图;深特征提取器:20 个 “CAMixer+FFN” 块(通道数 60,窗口大小 16×16);重建模块:上采样 + 卷积,生成 HR 图像;全局预测器:补充 CAMixer 的预测器功能,提升全局分类精度。

  • 训练损失,总损失为主损失 + 辅助损失,公式如下:主损失(L₁损失):优化 SR 主干网络,最小化 HR 与预测图像差异: ℓ 1 = 1 N ∑ i = 1 N ∥ I i H R − f C A M i x e r S R ( I i L R ) ∥ 1 \ell_1=\frac{1}{N}\sum_{i=1}^N \|I_i^{HR} - f_{CAMixerSR}(I_i^{LR})\|_1 1=N1i=1NIiHRfCAMixerSR(IiLR)1。辅助损失(比例损失):控制各 CAMixer 的 γ i \gamma_i γi,实现动态计算分配: ℓ r a t i o = 1 N ∑ i = 1 N ∥ γ r e f ⋅ ( 1 − 2 S ∑ i = 1 S γ i ) ∥ 2 \ell_{ratio}=\frac{1}{N}\sum_{i=1}^N \|\gamma_{ref}·(1-\frac{2}{S}\sum_{i=1}^S \gamma_i)\|_2 ratio=N1i=1Nγref(1S2i=1Sγi)2 S = 20 S=20 S=20为 CAMixer 数量,预训练 γ r e f = 0.5 \gamma_{ref}=0.5 γref=0.5,微调 γ r e f ∈ [ 0 , 1 ] \gamma_{ref}∈[0,1] γref[0,1])。

  • CAMixer 的核心创新在于内容感知的动态分配机制与增强型预测器设计:

    • 动态分配:ACMix 固定使用 “SA + 卷积” 混合(γ=1),而 CAMixer 通过掩码 m 排序选择 Top-K 窗口用 SA(γ∈(0,1)),其余用卷积,实现 “复杂区域用 SA、简单区域用卷积” 的自适应计算分配,可节省 25% 计算量;
    • 增强预测器:ACMix 无专门预测器,CAMixer 预测器输入 “局部 C l C_l Cl + 全局 C g C_g Cg + 窗口 C w C_w Cw” 三条件,输出偏移量(窗口变形以包含更多有用纹理)、空间 / 通道注意力(增强卷积动态性),较简单分类器(如 ClassSR 的 3 分类器)提升 0.17dB PSNR(Urban100)。
  • CAMixerSR 通过两大机制平衡:

    • CAMixer 的 γ 参数调节(γ 为 SA 窗口比例),γ=0.5 时仅对 50% 复杂窗口用 SA,其余用轻量卷积,实现计算量节省;
    • 预测器生成偏移量∆p,优化窗口采样(边缘区域精细分区),避免裁剪导致的感受野损失,保持性能。
  • 训练过程中,CAMixerSR 的 “比例损失 ℓ r a t i o ℓ_ratio ratio” 作用是什么?为何要分 “预训练 γ r e f = 0.5 γ_ref=0.5 γref=0.5 ” 与 “微调 γ r e f ∈ [ 0 , 1 ] γ_{ref}∈[0,1] γref[0,1] ” 两步?

    • 比例损失 ℓ r a t i o ℓ_ratio ratio 的作用:控制各 CAMixer 块的注意力比例 γ i γ_i γi,避免单一块 γ i γ_i γi过高 / 过低导致的计算量浪费或性能下降,公式中通过 γ r e f \gamma_{ref} γref 引导全局 γ 平均值,确保整体计算量与性能平衡;
    • 两步训练原因:预训练 γ r e f = 0.5 γ_{ref}=0.5 γref=0.5:让模型先学习 “中等比例 SA 分配” 的基础能力,避免初始 γ r e f γ_{ref} γref 极端(如 0/1)导致训练不稳定;微调 γ r e f ∈ [ 0 , 1 ] γ_{ref}∈[0,1] γref[0,1]:适应不同场景需求(如低计算场景用 γ r e f = 0.25 γ_{ref}=0.25 γref=0.25,高性能场景用 γ r e f = 1.0 γ_{ref}=1.0 γref=1.0),实现 “动态复杂度适配”,无需重新训练多个模型

Experiment

Implementation Details

  • 模型。按照SwinIR 和ELAN 的方法,我们用20个CAMixer和FFN嵌段构建了整个主链。通道数是60。自注意的窗口大小为16,卷积分支由两个3×3深度卷积实现。具体来说,我们手动设置γ = 1.0为原始模型(基线),γ = 0.5 为CAMixer模型(目标)。我们在补充材料中提供了其他设置的更多结果。

  • 测试。我们首先以γ = 1.0为基线测试CAMixerSR-Original,它代表了所有正在被自注意和卷积处理的令牌。然后,我们验证了所提出的γ = 0.5的CAMixerSR,它对部分令牌使用自我注意。对于轻量级SR,我们采用了五个常用的验证数据集:Set5 、Set14 、BSD100 、Urban100 和Manga109 。

  • 对于大图像SR,我们使用Flickr2K(F2K)和DIV8K[10](Test2K、Test4K和Test8K)来生成测试数据集作为ClassSR。对于ODI SR,我们在ODI-SR测试集和SUN360[36]数据集上评估我们的模型。为了进行评估,我们使用PSNR和SSIM以及额外的失真加权版本WS-PSNR和WS-SSIM进行ODI-SR。

  • 实验内容 实验设置 核心目的
    窗口大小 M M=8/16/32,对比 MAdds 与 Urban100 的 PSNR 确定 SA 窗口的最优大小(平衡性能与计算量)
    偏移量标量 r r=0/1/4/8/16,对比 BSD100/Urban100/Manga109 的 PSNR 验证偏移量对窗口变形的作用,确定最优 r 值
    预测器组件 移除偏移量(\Delta p)、空间注意力(A_s)、通道注意力(A_c),对比 PSNR 验证预测器各输出的必要性,是否缺一不可
    预测器输入条件 移除全局条件(C_g)、窗口条件(C_w),对比 Set5/Urban100 的 PSNR 验证多条件输入对预测器精度的提升作用
    注意力比例 γ γ∈[0,1],绘制 PSNR-FLOPs 曲线(图 5) 验证 γ 对性能与计算量的影响,确定最优 γ(γ=0.5)

Ablation Study

  • 自我关注的影响。我们首先比较表4中SA分支的窗口大小M。窗口大小为32的模型比窗口16大约大2.5倍,同时在Urban100上提高了0.17dB。具有窗口16的模型将窗口8提前0.23dB,但仅增加16G MAdds。此外,当我们设置γ=0.5时,32×32窗口的性能下降幅度比其他两个模型更大,因为大窗口很难分类。为此,我们使用窗口16×16在性能和计算之间进行更好的权衡。此外,我们在图5中比较了不同的自我关注率γ。对于轻量级SR和2K SR,计算量呈线性增长,而当γ<0.5时,PSNR增长更快,但当γ>0.5时增长更慢。因此,我们手动选择γ=0.5,其中PSNR几乎与γ=1.0相同,但减少了SA计算的一半

    • 在这里插入图片描述

    • 图5。注意力比γ的消融研究。

    • 在这里插入图片描述

    • 表4。Urban100上窗口尺寸的消融研究。

  • 预测器组件的影响。与仅输出决策分数的简单分类器相比,所提出的预测器生成了更有用的度量(偏移和空间/通道注意力),以实现更好的划分和表示。我们在表5中检查了这些额外的组件。删除其中任何一个都会导致性能大幅下降。具体来说,偏移带来了0.05dB的增益,卷积注意共同获得了0.1dB的改善。

    • 在这里插入图片描述

    • 表5。预测器组件的消融研究。

  • 混合器掩码m的效果。为了研究混合器掩码划分硬令牌和简单令牌的偏好,我们将学习到的掩码可视化在图4中。所提出的预测器可以学习适当的掩码,将复杂的令牌(如建筑、船只和蜜蜂)分配给注意力分支,而将普通令牌(如天空和花瓣)分配给卷积分支。

    • 在这里插入图片描述

    • 图4。CAMixerSR的预测混音器掩码m的可视化。颜色越浅,幅度越大。注意力窗口的分数是黑色的,卷积窗口是白色的。内容更复杂(得分更高)的未屏蔽令牌由自我关注处理。

  • 在图6中,我们进一步比较了不同比率γ下不同块的分区掩码。SA的令牌数K根据γ减小,实际比率接近目标。这大大满足了我们控制推理复杂性的目标。大多数块学习使用SA处理复杂内容。有趣的是,他们关注的是语义上不同的上下文,例如,Block 7保留行星,Block 14保留边缘,Block 20保留建筑物。此外,在图4中,Cl表明卷积的输出与注意力不同。因此,对于1号和17号 Block ,他们采用SA来协调普通窗户的特征。

    • 在这里插入图片描述

    • 图6。不同比率 γ 下渐进分类标记的可视化。未掩蔽的区域由自我注意处理,而掩蔽的区域则由卷积注意处理。 K = ∑ M K=\sum M K=M 是SA分支的窗口号。γ 和 γ′ 分别是SA tokens 的目标和实际比率。

  • 偏移的影响∆p。在表7中,我们通过将偏移标量r从0调整到16来验证性能变化,以探索偏移的有效性。可以观察到,r=8的模型表现最佳。相比之下,当r设置为4或16时,模型性能可以忽略不计地提高,甚至下降。为了全面理解,我们在图7中描绘了偏移矢量。r=8的偏移更合理,因为最有效的偏移位于边缘区域并提供细粒度的分区

    • 在这里插入图片描述

    • 图7。各种偏移的可视化。偏移量是根据输入图像生成的。采样步长为16。

  • 输入条件的影响。我们在表6中消除了输入条件(局部、全局和窗口)。由于我们的方法是内容感知的,因此我们为所有模型维护本地内容。全局/窗口条件的缺失将导致Urban100上的0.08dB下降。禁用这两个选项会进一步将PSNR降低到26.46dB,比初始模型低0.17dB。结果表明,多种条件的组合可以提高预测精度。

    • 在这里插入图片描述

    • 表6。输入条件下的消融研究。

    • 在这里插入图片描述

    • 表7。偏移消融研究。

Large-Image SR

  • 根据ClassSR 和ARM ,我们用2K-8K大图像SR任务验证了CAMixerSR的效率。与之前省略轻量级模型的工作不同,我们还添加了IMDN 和SwinIR light 作为参考。所有型号都在相同的FLOP限制下运行。

  • 定量结果。在表8中,我们实现了具有36/48/60通道的CAMixerSRSmall/Media/Base。一般来说,CAMixerSR明显优于其他方法。与ClassSR或ARM加速的经典SRResNet和RCAN相比,CAMixerSR Original提供了类似或更好的恢复质量,但重量减轻了3.2×-11×。此外,我们的CAMixer模型进一步节省了约25%的计算。总体而言,CAMixerSR(765K/747M)可以与RCAN(15.6M/32.6G)竞争2K-8K图像恢复。与轻量级型号SwinIR light相比,我们的CAMixerSR在FLOP更少的情况下可提高0.14dB的PSNR,在PSNR更高的情况下,FLOP减少51%

    • 在这里插入图片描述

    • 表8。2K-8K测试集的定量比较(PSNR)。报告了加速框架、轻量级模型和提出的网络,以进行一般比较。对于CAMixerSR,“+ClassSR”使用CAMixerSR-S/M/B-Original作为三个具有不同复杂性的分支。对于内容感知和ClassSR的混合策略,“⊎ClassSR”使用CAMixerSR-B(γ=0.25/0.3/0.5)作为ClassSR的三个分支。“⊎CAMixer”表示对SR类使用CAMixerSR-S/M/B(γ=0.5)。对于类SR方法,{tile,overlap}为{32,2},而对于轻量级模型,{tiles,overlap}为{64,4},以保持5G下的最大FLOP。

  • 为了公平地比较加速框架,即ClassSR和提出的内容感知混合,我们将ClassSR应用于具有三个类的CAMixerSR。ClassSR有助于减少与ContentAware类似的计算,但在F2K上落后于0.12dB。这种PSNR差距可能是由于小裁剪尺寸的接收域有限造成的,我们将在进一步的研究中探索。

  • 我们还说明了ClassSR和CAMixer的两种潜在组合方式。“⊎ClassSR”表示在CAMixerSRB上应用ClassSR,即使用相同的主干,但将γ=0.25/0.3/0.5调整为ClassSR的三个分支。“⊎CAMixer”采用γ=0.5的CAMixer作为ClassSR的三个分支,用于CAMixerSR-S/M/B。正如预期的那样,前一种方法保持了更好的恢复质量,而后者减少了更多的计算。总之,内容感知混合器是大型图像任务的更好选择,可以与其他策略一起使用,没有任何困难

  • 高质量的结果。在图8中,我们展示了CAMixerSR与其他方法的视觉结果。CAMixerSR比其他方法恢复了更清晰的晶格内容。此外,具有内容感知策略的CAMixerSR比ClassSR的性能下降更少。

    • 在这里插入图片描述

    • 图8。CAMixerSR与其他方法在Test4K数据集上进行×4任务的可视化比较。

Lightweight SR

  • 为了评估CAMixer的通用性,我们将提出的CAMixerSR与众多SOTA轻量级模型进行了比较,包括IMDN、LatticeNet、FDIWN、SwinIR light、ELAN light、NGswin和DiVANet。表9显示了定量比较。包括在内,我们的CAMixerSR在所有五个基准数据集上都以适中的参数和较少的计算获得了卓越的恢复质量。特别是,与最新的SwinIR NG相比,CAMixerSR可以在节省9.2G计算的同时获得更好的性能。结果强烈表明,我们的CAMixer不仅可以用于具有大量平坦区域的大输入图像,还可以用于经典的SR任务。
    • 在这里插入图片描述

    • 表9。采用最先进的方法进行定量比较(平均PSNR/SSIM、参数和多相加),以实现高效的图像SR。最佳结果和次佳结果分别以粗体和下划线表示。在将图像放大到1280×720的设置下测量多加(MAdds)。补充材料中提供了更多结果。

Omni-Directional-Image SR

  • 为了了解CAMixer在大分辨率输入的实际应用中的有效性,我们在全方向图像(ODI)SR任务上测试了CAMixerSR,该任务具有2K输出和复杂失真。具体来说,我们添加失真图作为预测器的额外条件。

  • 在表10中,我们展示了我们的CAMixerSR与其他方法的定性比较。我们的CAMixerSR在几乎所有验证指标上都获得了更好的恢复质量。详细地说,与30倍大的EDSR相比,CAMixerSR在SUN 360基准上提高了0.26dB。此外,CAMixerSR在不使用额外训练集的情况下,将 OSRT-light 提高了0.05dB/0.0028(WS-PSNR/WS-SSIM)。

    • 在这里插入图片描述

    • 表10。Fisheye 下采样下ODI-SR、SUN 360的定量比较。“†”表示使用增强数据集。

Conclusion

  • 本文提出了一种内容感知混合器(CAMixer),该混合器根据内容恢复的难度,通过路由不同复杂度的神经算子(自注意和卷积),将模型加速方案和令牌混合器设计相结合。特别是,简单的令牌通过卷积捕获,而复杂的令牌则通过可变形的自我注意进行额外处理。为了提高路由的准确性,我们引入了一种有效的预测器,该预测器使用丰富的输入条件来生成多个有用的指导信息。基于CAMixer,我们构建了CAMixerSR,在三个SR任务上实现了显著的性能计算权衡。

  • 现有图像超分辨率(SR)技术面临大图像(2K-8K)应用瓶颈:虽能生成高视觉质量图像,但计算开销大;现有解决方案分两大独立赛道,均存在缺陷:

    • 加速框架(内容感知路由),将图像裁剪为子块,通过分类网络分配至不同复杂度模型(如 ClassSR 用 3 分类器)。①分类精度低(简单区域误分配至复杂模型);②分区僵化(固定块大小);③感受野有限(裁剪导致性能下降,如表 2 中 RCAN 裁剪为 32×32 时 PSNR 较 128×128 降 0.06dB)。
    • 轻量级模型(令牌混合器优化),优化算子(如 SA、大核卷积)或骨干结构(如 IMDN 的信息蒸馏、SwinIR 的窗口 SA),降低层数量。①未区分处理不同复杂度内容;②2K-8K 大图像场景适配性未验证。
    • 核心目标:整合两大赛道优势,设计内容感知混合机制,实现 “简单区域用卷积、复杂区域用 SA” 的动态计算分配,突破质量 - 复杂度权衡。
  • CAMixerSR 的核心是内容感知混合器(CAMixer) 与基于其堆叠的网络架构,整体设计围绕 “动态分配计算资源” 展开 —— 对简单图像区域用轻量卷积,对复杂区域用可变形窗口注意力(SA),平衡性能与计算量。基于 SwinIR-light 改进,共 4 大模块(图 3+3.2 节),输入为低分辨率(LR)图像 I L R I^{LR} ILR,输出为超分辨率(HR)图像 I H R I^{HR} IHR

    • 模块 结构细节 核心作用 数据维度变化(以输入(H×W×3)为例)
      浅特征提取器 1 层 1×1 点卷积(PWConv) 将 RGB 图像映射为低维特征图,减少后续计算量 (H×W×3) → (H×W×C)(C=60,论文实验设置)
      深特征提取器 20 个 “CAMixer 块 + FFN(前馈网络)” 堆叠 核心特征学习:CAMixer 实现 SA 与卷积的自适应融合,FFN 增强非线性表达 (H×W×C) → (H×W×C)(特征维度保持,内容逐步细化)
      重建模块 上采样层(如转置卷积)+ 1×1 卷积 将深层特征映射为 HR 分辨率,恢复图像细节 (H×W×C) → (rH×rW×3)(r 为缩放因子,如 ×4)
      全局预测器 与 CAMixer 的局部预测器协同,输入全局特征(全局平均池化) 优化全局区域分类精度,避免局部预测器的 “视野局限” 全局特征(1×1×C)→ 辅助引导信息(与 CAMixer 预测器融合)
  • CAMixer 是 “动态计算分配” 的核心载体,由预测器模块注意力分支卷积分支三部分组成(图 3),输入为深特征提取器的中间特征 X ∈ R C × H × W X \in \mathbb{R}^{C×H×W} XRC×H×W ,输出为融合后特征 V o u t ∈ R C × H × W V_{out} \in \mathbb{R}^{C×H×W} VoutRC×H×W

    • 预测器模块:“决策中枢”—— 生成引导信息,通过 “局部 + 全局 + 窗口” 多条件输入,精准判断图像区域复杂度,生成 “偏移量(窗口变形)、掩码(区域分类)、注意力(卷积增强)” 三大引导信息,解决传统 ClassSR“分类粗、分区僵” 的问题。输入条件(3 类):
      • 局部条件(C_l):特征图X经 1×1 卷积得到的 V = f P W C o n v ( X ) ( R C × H × W V = f_{PWConv}(X)(\mathbb{R}^{C×H×W} V=fPWConv(X)RC×H×W),捕捉局部纹理细节;
      • 全局条件(C_g):对V做全局平均池化得到 R C × 1 × 1 \mathbb{R}^{C×1×1} RC×1×1,再通过 1×1 卷积扩展为 R 2 × H × W \mathbb{R}^{2×H×W} R2×H×W ,捕捉全局内容分布;
      • 窗口条件(C_w):线性位置编码 R 2 × H × W \mathbb{R}^{2×H×W} R2×H×W (编码窗口空间位置,避免注意力 “位置混淆”)。
      • 输出引导信息(4 类,公式 2):
      • 偏移量 Δ p ∈ R 2 × H × W : Δ p = r ⋅ f o f f s e t s ( F ) ,其中 F = f h e a d ( C l , C g , C w ) \Delta p \in \mathbb{R}^{2×H×W}:\Delta p = r \cdot f_{offsets}(F),其中F = f_{head}(C_l,C_g,C_w) ΔpR2×H×WΔp=rfoffsets(F),其中F=fhead(Cl,Cg,Cw)是共享中间特征,r是控制偏移范围的标量(实验中(r=8)最优)。通过双线性插值 ϕ ( X , Δ p ) \phi(X, \Delta p) ϕ(X,Δp)变形窗口,让复杂区域窗口包含更多有用纹理(如边缘、细节),解决固定窗口 “漏纹理” 问题。
      • 掩码 m ∈ R ( H W / M 2 ) × 1 : F ^ = f r e d u c e ( F ) (将 F 按窗口大小 M × M 重排为 R ( H W / M 2 ) × M 2 m \in \mathbb{R}^{(HW/M²)×1}:\hat{F} = f_{reduce}(F)(将F按窗口大小M×M重排为\mathbb{R}^{(HW/M²)×M²} mR(HW/M2)×1F^=freduce(F)(将F按窗口大小M×M重排为R(HW/M2)×M2),再经线性层 W m a s k W_{mask} Wmask 得到m。训练时用 Gumbel-Softmax 将m转为二进制掩码M,推理时按m排序选 Top-K 窗口( I h a r d I_{hard} Ihard )用 SA,其余( I s i m p l e I_{simple} Isimple)用卷积,实现 “动态分区”。
      • 空间注意力 A s ∈ R 1 × H × W : A s = f s a ( F ) A_s \in \mathbb{R}^{1×H×W}:A_s = f_{sa}(F) AsR1×H×WAs=fsa(F)(Sigmoid 激活),作用:增强卷积分支的空间局部特征(简单区域)。
      • 通道注意力 A c ∈ R C × 1 × 1 : A c = f c a ( F ) A_c \in \mathbb{R}^{C×1×1}:A_c = f_{ca}(F) AcRC×1×1Ac=fca(F)(Sigmoid 激活),作用:增强卷积分支的通道重要性(突出关键通道特征)。
    • 注意力分支:“复杂区域处理器”—— 稀疏 SA 计算,仅对掩码筛选出的复杂窗口( I h a r d I_{hard} Ihard)用 SA,减少计算量;同时用偏移量变形窗口,提升 SA 对细节的捕捉能力,解决传统 SA“全区域计算、开销大” 的问题。
      • 窗口筛选与重排:按 I h a r d I_{hard} Ihard 索引拆分变形后的特征 X ~ = ϕ ( X , Δ p ) \tilde{X} = \phi(X, \Delta p) X~=ϕ(X,Δp) ,得到复杂窗口特征 X ~ h a r d ∈ R K × M 2 × C \tilde{X}_{hard} \in \mathbb{R}^{K×M²×C} X~hardRK×M2×C (K为 SA 窗口数,(M=16)实验最优)。
      • Q/K/V 生成: Q ^ = X ~ h a r d ⋅ W q , K ^ = X ~ h a r d ⋅ W k \hat{Q} = \tilde{X}_{hard} \cdot W_q,\hat{K} = \tilde{X}_{hard} \cdot W_k Q^=X~hardWqK^=X~hardWk((W_q,W_k)为线性层权重), V h a r d V_{hard} Vhard 直接取自V的 I h a r d I_{hard} Ihard 区域。
      • 自注意力计算: V h a r d = s o f t m a x ( Q ^ K ^ T d ) ⋅ V h a r d V_{hard} = softmax\left(\frac{\hat{Q}\hat{K}^T}{\sqrt{d}}\right) \cdot V_{hard} Vhard=softmax(d Q^K^T)Vhard 其中 d \sqrt{d} d ((d=C)为特征维度)是 “温度系数”,防止 Q K T QK^T QKT 数值过大导致 softmax 梯度消失;softmax 确保注意力权重总和为 1,聚焦关键纹理。
    • 卷积分支:“简单区域处理器”—— 轻量局部特征提取,对简单窗口 I s i m p l e I_{simple} Isimple 用深度卷积(DWConv)+ 注意力增强,在保证局部特征提取能力的同时,将计算量降至最低(DWConv 计算量仅为普通卷积的 1/C)。
      • 简单窗口特征筛选:按 I s i m p l e I_{simple} Isimple 索引拆分V,得到 V s i m p l e ∈ R ( H W / M 2 − K ) × M 2 × C V_{simple} \in \mathbb{R}^{(HW/M²-K)×M²×C} VsimpleR(HW/M2K)×M2×C ,用空间注意力(A_s)增强: V s i m p l e = A s ⋅ V s i m p l e V_{simple} = A_s \cdot V_{simple} Vsimple=AsVsimple (元素乘)。
      • 深度卷积与通道增强: V c o n v = f D W C o n v ( V a t t n ) ⋅ A c + V a t t n V_{conv} = f_{DWConv}(V_{attn}) \cdot A_c + V_{attn} Vconv=fDWConv(Vattn)Ac+Vattn。其中 V a t t n V_{attn} Vattn 是 SA 分支输出与 V s i m p l e V_{simple} Vsimple 的拼接结果; f D W C o n v f_{DWConv} fDWConv 为 3×3 深度卷积(每个通道独立卷积,捕捉局部相关性);(A_c)通道注意力增强关键通道;“+V_{attn}” 是残差连接,避免梯度消失。
    • CAMixer 输出融合,拼接 V h a r d 与 V s i m p l e V_{hard} 与 V_{simple} VhardVsimple,经 1×1 卷积( f P W C o n v f_{PWConv} fPWConv)统一维度,得到最终输出 V o u t V_{out} Vout ,确保特征平滑过渡。
  • 训练损失函数:“优化导向”—— 平衡性能与计算量,用 L1 损失优化 SR 核心性能,用比例损失控制 CAMixer 的注意力比例(\gamma)(SA 窗口占比),实现 “性能不降、计算量可控”。

    • 主损失:L1 损失 ℓ 1 = 1 N ∑ i = 1 N ∥ I i H R − f C A M i x e r S R ( I i L R ) ∥ 1 \ell_1 = \frac{1}{N}\sum_{i=1}^N \|I_i^{HR} - f_{CAMixerSR}(I_i^{LR})\|_1 1=N1i=1NIiHRfCAMixerSR(IiLR)1.比 MSE 损失对异常值更鲁棒,避免生成图像 “模糊”(MSE 易让像素趋近均值),更符合 SR 的视觉需求。优化 CAMixerSR 的主干网络,最小化 HR 与预测图像的像素差异。
    • 辅助损失:比例损失 ℓ r a t i o = 1 N ∑ i = 1 N ∥ γ r e f ⋅ ( 1 − 2 S ∑ i = 1 S γ i ) ∥ 2 \ell_{ratio} = \frac{1}{N}\sum_{i=1}^N \left\|\gamma_{ref} \cdot \left(1 - \frac{2}{S}\sum_{i=1}^S \gamma_i\right)\right\|_2 ratio=N1i=1N γref(1S2i=1Sγi) 2。控制所有 CAMixer 的 γ i \gamma_i γi平均值趋近 γ r e f \gamma_{ref} γref ,避免单一块 γ i \gamma_i γi 过高(计算量浪费)或过低(性能下降);微调时 γ r e f ∈ [ 0 , 1 ] \gamma_{ref} \in [0,1] γref[0,1] ,支持动态复杂度适配。

以 “LR 图像(如 256×256×3)→ 4×SR(1024×1024×3)” 为例,详细拆解数据形态、维度及处理过程:

  • LR 图像 I L R I^{LR} ILR (256×256×3,RGB 通道,像素值 [0,255]),来自训练集 DIV2K(轻量 / 大图像 SR)或 ODI-SR(全向 SR)。预处理步骤(预处理后数据:256×256×3(或 64×64×3 patch),数值范围 [0,1]):

    • 归一化:将像素值缩至 [0,1]( I n o r m L R = I L R / 255 I^{LR}_{norm} = I^{LR} / 255 InormLR=ILR/255),避免数值过大导致梯度爆炸;
    • 数据增强(训练阶段):随机水平翻转、90° 旋转,扩大训练集多样性,提升泛化能力;
    • 裁剪(训练阶段):将大图像(如 8K)裁剪为 64×64×3 的 patch(batch=32,符合 GPU 显存限制),测试阶段按 {tile, overlap}(如 {32,2})分块处理(避免显存溢出)。
  • 模型训练阶段的数据流转

    • 浅特征提取器,处理:输入 256×256×3 → 1×1 PWConv(权重维度 3×60)→ 激活函数(ReLU);256×256×3 → 256×256×60(C=60),特征维度从 RGB 通道转为高维特征通道,保留空间分辨率。
    • 深特征提取器(20 个 CAMixer+FFN 块),以单个 CAMixer 块为例(输入 256×256×60)(20 个块后数据:256×256×60(特征细节逐步细化,长程依赖与局部特征融合)):
      • 预测器模块:输入:局部条件V(256×256×60,1×1 Conv 处理)、全局条件 C g C_g Cg(256×256×2,全局池化 + 1×1 Conv)、窗口条件 C w C_w Cw(256×256×2,位置编码);输出:偏移量(\Delta p)(256×256×2)、掩码m((256×256/16²)×1=256×1)、空间注意力 A s A_s As(256×256×1)、通道注意力 A c A_c Ac (60×1×1)。
      • 注意力分支:窗口变形: X ~ = ϕ ( X , Δ p ) \tilde{X} = \phi(X, \Delta p) X~=ϕ(X,Δp)(256×256×60,双线性插值变形窗口);窗口筛选:按m排序选 Top-K=128 个窗口 I h a r d → X ~ h a r d I_{hard}→ \tilde{X}_{hard} IhardX~hard(128×16²×60=128×256×60);SA 计算: Q ^ = X ~ h a r d ⋅ W q \hat{Q} = \tilde{X}_{hard} \cdot W_q Q^=X~hardWq(128×256×60)、 K ^ = X ~ h a r d ⋅ W k \hat{K} = \tilde{X}_{hard} \cdot W_k K^=X~hardWk(128×256×60)→ 注意力权重 s o f t m a x ( Q ^ K ^ T / 60 ) softmax(\hat{Q}\hat{K}^T/\sqrt{60}) softmax(Q^K^T/60 ) (128×256×256)→ (V_{hard})(128×256×60)。
      • 卷积分支:简单窗口筛选: I s i m p l e I_{simple} Isimple 窗口(256-128=128 个)→ V s i m p l e V_{simple} Vsimple(128×256×60);注意力增强: V s i m p l e = A s ⋅ V s i m p l e V_{simple} = A_s \cdot V_{simple} Vsimple=AsVsimple(128×256×60,元素乘);深度卷积:3×3 DWConv(60 个卷积核,每个通道独立)→ 输出 128×256×60 → 通道增强 A c A_c Ac(元素乘)→ V c o n v V_{conv} Vconv(128×256×60)。
      • 融合输出:拼接 V h a r d 与 V c o n v V_{hard}与 V_{conv} VhardVconv → 256×256×60 → 1×1 Conv → CAMixer 输出(256×256×60);FFN 处理:CAMixer 输出 → 2×Conv(60→240→60)+ GELU 激活 → 残差连接 → 深特征提取器输出(256×256×60)。
    • 重建模块,上采样:256×256×60 → 转置卷积(步长 4,填充 1)→ 1024×1024×60(分辨率放大 4 倍);特征映射:1×1 Conv(60→3)→ 1024×1024×3(将高维特征映射回 RGB 通道);激活函数:Sigmoid(将输出缩至 [0,1])→ 预测 HR 图像 I ^ H R \hat{I}^{HR} I^HR。256×256×60 → 1024×1024×3(数值范围 [0,1])。
    • 损失计算与反向传播,损失输入: I ^ H R \hat{I}^{HR} I^HR(1024×1024×3)与真实 HR 图像 I H R I^{HR} IHR(1024×1024×3);计算 ℓ 1 \ell_1 1(像素差异)与 ℓ r a t i o \ell_{ratio} ratio γ i \gamma_i γi控制)→ 总损失 ℓ \ell ;通过 AdamW 优化器(初始学习率 5e-4)更新所有参数(卷积权重、SA 权重、预测器权重),最小化总损失。
  • 测试推理阶段的数据流转,无数据增强、分块处理大图像(如 8K)、掩码用 argsort 排序(非 Gumbel-Softmax,避免随机性);

    • 输入 LR 图像(如 64×64×3,全向 SR 需额外输入畸变图)→ 预处理(归一化);
    • 浅特征提取→深特征提取(20 个 CAMixer, γ = 0.5 \gamma=0.5 γ=0.5)→重建模块;
    • 分块拼接(若分块处理):按 overlap 去除重复区域,拼接为完整 HR 图像;
    • 后处理:将像素值从 [0,1] 缩至 [0,255]( I f i n a l H R = I ^ H R × 255 I^{HR}_{final} = \hat{I}^{HR} × 255 IfinalHR=I^HR×255),四舍五入为整数像素值。HR 图像(如 1024×1024×3,全向 SR 为球面投影图像)。无额外复杂处理,核心是像素值缩放分块拼接:缩放:确保输出符合图像存储格式(0-255 整数);拼接:大图像分块推理后,去除 overlap 区域(如 {32,2} 分块,重叠 2 像素),避免边缘 artifacts,保证图像完整性。
  • 论文的核心思路是:对图像中简单区域(如平滑背景)用计算量低的卷积处理,对复杂纹理区域(如细节纹理)用更强大的窗口注意力机制,通过内容感知动态分配计算资源,在保证性能的同时提升推理效率。具体创新点包括:

    • 内容感知加速框架:通过 “重要性预测器” 判断图像区域的复杂度,动态决定是否启用注意力机制(复杂区域)或仅用卷积(简单区域)。
    • Token Mixer 设计:融合卷积(处理局部相关性)与窗口注意力(处理长距离依赖),兼顾效率与性能。
    • 通用性:适用于大图像超分(高分辨率输入)、轻量级超分(低计算资源场景)、全向图像超分(特殊球面图像)等多任务。

核心代码解析

  • 按 “任务类型 + 代码模块” 划分,直接对应论文的多场景验证需求:

    • CAMixerSR/
      ├── figures/            # 论文中的可视化结果(性能表格、对比图)
      ├── pretrained_models/  # 预训练模型,按任务分LargeSR/ LightSR/ ODISR
      ├── codes/              # 核心代码
      │   ├── basicsr/        # 基础超分工具(基于BasicSR框架)
      │   ├── classsr/        # 大图像/轻量级超分相关模块
      │   ├── odisr/          # 全向图像超分相关工具
      │   └── options/        # 训练/测试配置文件(分任务定义参数)
      
  • 将大图像超分(classsr)、全向图像超分(odisr)分离,共享核心 CAMixer 模块。通过 options 文件夹的 yaml 文件定义不同任务参数(分辨率、缩放因子等),便于扩展。子图像提取(extract_subimage.py),将大尺寸全向图像裁剪为小 patch,加速训练时的 IO 和计算。通过重叠滑动窗口裁剪,平衡数据利用率与边缘质量,适配大图像训练。

    • def main():
          root_path = '/mnt/bn/mmlab-wangyan-srdata/lau_dataset_clean/odisr/training/'
          opt = {
              'n_thread': 20,  # 多线程加速
              'compression_level': 3,  # PNG压缩级别
              'input_folder': root_path + 'HR',  # 高分辨率图像路径
              'save_folder': root_path + 'HR_sub',  # 裁剪后保存路径
              'wh': (2048, 1024),  # 原始图像尺寸
              'scale': 1,  # 缩放因子
              'crop_size': 512,  # 裁剪 patch 大小
              'step': 256,  # 滑动窗口步长(重叠256像素,避免边缘 artifacts)
              'thresh_size': 0  # 过滤过小 patch 的阈值
          }
          extract_subimages(opt)  # 执行裁剪
      
          # 对不同缩放因子的低分辨率图像执行相同操作(X2/X4/X8/X16)
          # ...(省略类似配置)
      
  • 数据增强(make_augmentation_dataset.py),将普通图像转换为全向图像(ERP 格式),扩充训练数据。通过透视投影转换和多尺度下采样,将普通图像转换为全向图像数据,解决全向图像训练数据稀缺问题。

    • def extract_odi_subimage(img_pth, save_pth, img_idx):
          # 全向图像经纬度裁剪参数(不同角度对应不同区域)
          crop_dict = {0: [[320, 704], [784, 1264]], ...}  # 纬度-15°~45°的裁剪范围
          img = cv2.imread(img_pth)  # 读取普通图像
          h, w, _ = img.shape
      
          # 滑动窗口裁剪子图像
          repeat_num = int(w/256 - 2)  # 横向裁剪次数
          for i in range(repeat_num):
              _img = img[:, i*256:(i+2)*256, :]  # 256x512 子图像
              for lat_sign in [-1, 0, 1]:  # 纬度方向增强(上/中/下)
                  # 提取局部区域并投影为全向图像(ERP格式)
                  _pers = _img[:512] if lat_sign == -1 else _img[-512:] if lat_sign == 1 else _img[h//2-256:h//2+256]
                  for phi in phi_list:  # 不同纬度角度
                      [[h0, h1], [w0, w1]] = crop_dict[phi]  # 裁剪范围
                      erp_hr = pers2erp(_pers, phi)  # 透视图像→全向图像
                      # 生成多尺度低分辨率图像(X2/X4)
                      for scale in [2, 4]:
                          _erp_lr = erp_downsample_fisheye(erp_hr, scale)  # 全向图像下采样
                          # 保存HR/LR图像
                          transforms.ToPILImage()(_erp_lr).save(osp.join(save_pth, 'LR/X%s' % scale, sub_name))
      
  • CAMixer 模块重要性预测器(PredictorLG) 是核心,直接对应论文的 “内容感知” 与 “token mixer” 设计。重要性预测器(PredictorLG):内容感知的核心PredictorLG类(位于CAMixerSR_arch.py)负责判断区域复杂度,决定是否启用注意力:

    • 输入:图像特征与位置信息(用于感知区域内容)。

    • 输出:训练时:mask(区分重要 / 非重要区域的二值掩码)。测试时:idx1(重要区域索引)和idx2(非重要区域索引)。

    • 实现逻辑:通过卷积层提取特征,预测区域 “重要性分数”(pred_score)。用F.gumbel_softmax生成硬掩码(训练),或通过排序筛选重要区域(测试)。同时预测偏移量(offsets)用于可变形注意力,增强对复杂纹理的捕捉。

    • class PredictorLG(nn.Module):
          def __init__(self, dim, window_size=8, k=4, ratio=0.5):
              super().__init__()
              self.ratio = ratio  # 控制注意力区域的比例(0.5表示约50%区域用注意力)
              self.window_size = window_size  # 图像分块大小(8x8窗口)
              cdim = dim + k  # 输入特征维度 + 位置编码维度(k=4,含窗口坐标信息)
              embed_dim = window_size **2  # 窗口内像素数(8x8=64)
              
              # 特征压缩卷积:将输入特征降维,减少计算量
              self.in_conv = nn.Sequential(
                  nn.Conv2d(cdim, cdim//4, 1),  # 1x1卷积降维(如cdim=64→16)
                  LayerNorm(cdim//4),  # 层归一化,稳定训练
                  nn.LeakyReLU(negative_slope=0.1, inplace=True),  # 激活函数
              )
      
              # 预测偏移量(用于可变形注意力)
              self.out_offsets = nn.Sequential(
                  nn.Conv2d(cdim//4, cdim//8, 1),  # 进一步降维
                  nn.LeakyReLU(negative_slope=0.1, inplace=True),
                  nn.Conv2d(cdim//8, 2, 1),  # 输出2通道(x/y方向偏移)
              )
      
              # 预测区域重要性掩码(区分复杂/简单区域)
              self.out_mask = nn.Sequential(
                  nn.Linear(embed_dim, window_size),  # 窗口特征→窗口大小(64→8)
                  nn.LeakyReLU(negative_slope=0.1, inplace=True),
                  nn.Linear(window_size, 2),  # 输出2类(重要/不重要)
                  nn.Softmax(dim=-1)  # 归一化概率
              )
      
              # 预测通道注意力(CA):对不同通道加权
              self.out_CA = nn.Sequential(
                  nn.AdaptiveAvgPool2d(1),  # 全局平均池化(H,W→1,1)
                  nn.Conv2d(cdim//4, dim, 1),  # 输出与输入特征同维度的权重
                  nn.Sigmoid(),  # 权重归一化到[0,1]
              )
      
              # 预测空间注意力(SA):对不同空间位置加权
              self.out_SA = nn.Sequential(
                  nn.Conv2d(cdim//4, 1, 3, 1, 1),  # 3x3卷积提取空间相关性
                  nn.Sigmoid(),  # 空间权重归一化
              )  
      	def forward(self, input_x, mask=None, ratio=0.5, train_mode=False):
          # input_x:输入特征(含原始特征+位置编码),shape=(B, cdim, H, W)
          x = self.in_conv(input_x)  # 特征压缩,shape=(B, cdim//4, H, W)
      
          # 预测偏移量(用于可变形注意力的采样位置调整)
          offsets = self.out_offsets(x)  # shape=(B, 2, H, W)
          offsets = offsets.tanh().mul(8.0)  # 偏移量范围限制在[-8,8]
      
          # 预测通道注意力和空间注意力权重
          ca = self.out_CA(x)  # shape=(B, dim, 1, 1)(通道维度权重)
          sa = self.out_SA(x)  # shape=(B, 1, H, W)(空间位置权重)
          
          # 特征降维:取通道平均,用于重要性预测
          x = torch.mean(x, keepdim=True, dim=1)  # shape=(B, 1, H, W)
      
          # 窗口化重排:将图像按window_size分块,便于逐窗口预测
          # (B, 1, H, W) → (B, num_windows, window_size²×1),其中num_windows=(H/8)×(W/8)
          x = rearrange(x, 'b c (h dh) (w dw) -> b (h w) (dh dw c)', 
                        dh=self.window_size, dw=self.window_size)
          B, N, C = x.size()  # N=num_windows,C=window_size²
      
          # 预测每个窗口的重要性分数(2类概率)
          pred_score = self.out_mask(x)  # shape=(B, N, 2)
          # 生成硬掩码(训练时用Gumbel-Softmax采样,强制二值化)
          mask = F.gumbel_softmax(pred_score, hard=True, dim=2)[:, :, 0:1]  # shape=(B, N, 1)
      
          # 训练/测试分支:训练用掩码,测试用索引(更高效)
          if self.training or train_mode:
              return mask, offsets, ca, sa  # 掩码用于训练时的动态加权
          else:
              # 测试时:根据分数排序,选择top-K重要区域
              score = pred_score[:, : , 0]  # 取"重要区域"的概率,shape=(B, N)
              B, N = score.shape
              r = torch.mean(mask, dim=(0,1))*1.0  # 掩码均值(估计重要区域比例)
              # 计算保留的重要区域数量(不超过总窗口数)
              num_keep_node = min(int(N * r * 2 * self.ratio), N)
              # 按分数降序排序,取前num_keep_node个作为重要区域
              idx = torch.argsort(score, dim=1, descending=True)  # shape=(B, N)
              idx1 = idx[:, :num_keep_node]  # 重要区域索引
              idx2 = idx[:, num_keep_node:]  # 非重要区域索引
              return [idx1, idx2], offsets, ca, sa
      
    • 输入特征 input_x(B, cdim, H, W)→ 经 in_conv 降维 →(B, cdim//4, H, W)→ 窗口化重排后 →(B, N, 64)(N=HW/(88))→ 预测得分 → 生成掩码 / 索引。核心是将图像划分为 8x8 窗口,逐窗口判断重要性,为后续动态计算提供依据。

    • 窗口化:将图像分块(8x8)减少注意力计算量(复杂度从 O (H²W²) 降为 O ((H/Ws)²(Ws⁴)),Ws=8)。可变形:通过 offsets 调整采样位置,增强对倾斜 / 扭曲纹理的捕捉(尤其适合全向图像)。

  • CAMixer 模块:Token Mixer 的实现,CAMixer类是融合卷积与注意力的核心模块,根据PredictorLG的输出动态处理不同区域:

    • 对重要区域(复杂纹理):计算注意力:通过q1 @ k1.transpose实现窗口内注意力,捕捉长距离依赖。可变形机制:用flow_warpk进行偏移,适应复杂纹理的形变。

    • 对非重要区域(简单区域):用轻量卷积(conv_sptial)处理,包含分组卷积和空洞卷积,兼顾局部相关性与感受野。

    • 动态融合:训练时通过mask区分区域,直接对特征加权。测试时通过idx1/idx2索引选择区域,分别应用注意力和卷积后拼接。

    • class CAMixer(nn.Module):
          def __init__(self, dim, window_size=8, bias=True, is_deformable=True, ratio=0.5):
              super().__init__()    
              self.dim = dim  # 特征通道数
              self.window_size = window_size  # 窗口大小(与PredictorLG一致)
              self.is_deformable = is_deformable  # 是否启用可变形注意力
              self.ratio = ratio  # 注意力区域比例(与PredictorLG一致)
      
              k = 3  # 卷积核大小
              d = 2  # 空洞率(扩大感受野)
      
              # 价值向量(v)投影
              self.project_v = nn.Conv2d(dim, dim, 1, 1, 0, bias=bias)
              # 查询(q)和键(k)投影(线性层,用于注意力计算)
              self.project_q = nn.Linear(dim, dim, bias=bias)
              self.project_k = nn.Linear(dim, dim, bias=bias)
      
              # 轻量卷积(处理简单区域):分组卷积+空洞卷积,兼顾效率与感受野
              self.conv_sptial = nn.Sequential(
                  nn.Conv2d(dim, dim, k, padding=k//2, groups=dim),  # 深度卷积(逐通道独立卷积)
                  nn.Conv2d(dim, dim, k, stride=1, padding=((k//2)*d), 
                            groups=dim, dilation=d)  # 空洞卷积(感受野=3+(3-1)*2=7)
              )        
              # 输出投影(融合结果)
              self.project_out = nn.Conv2d(dim, dim, 1, 1, 0, bias=bias)
      
              self.act = nn.GELU()  # 激活函数
              # 关联重要性预测器
              self.route = PredictorLG(dim, window_size, ratio=ratio)
      	def forward(self, x, condition_global=None, mask=None, train_mode=False):
          N, C, H, W = x.shape  # 输入特征:(B, dim, H, W)
      
          # 生成价值向量v(用于注意力加权)
          v = self.project_v(x)  # (B, dim, H, W)
      
          # 构造条件特征(含窗口位置编码,用于可变形注意力)
          if self.is_deformable:
              # 生成窗口坐标编码(-1到1范围)
              condition_wind = torch.stack(
                  torch.meshgrid(torch.linspace(-1,1,self.window_size),
                                 torch.linspace(-1,1,self.window_size))
              ).type_as(x).unsqueeze(0).repeat(N, 1, H//self.window_size, W//self.window_size)
              # 拼接特征与位置编码(条件特征用于预测器)
              if condition_global is None:
                  _condition = torch.cat([v, condition_wind], dim=1)  # (B, dim+2, H, W)
              else:
                  _condition = torch.cat([v, condition_global, condition_wind], dim=1)
      
          # 调用PredictorLG获取区域划分结果
          mask, offsets, ca, sa = self.route(_condition, ratio=self.ratio, train_mode=train_mode)
      
          # 生成查询(q)和键(k),k加入可变形偏移(更精准捕捉复杂纹理)
          q = x  # (B, dim, H, W)
          # 对k进行偏移采样(flow_warp根据offsets调整像素位置)
          k = x + flow_warp(x, offsets.permute(0,2,3,1), interp_mode='bilinear', padding_mode='border')
          qk = torch.cat([q, k], dim=1)  # (B, 2*dim, H, W)
      
          # 简单区域特征(vs):用空间注意力加权v
          vs = v * sa  # (B, dim, H, W)
      
          # 窗口化重排:将特征按窗口划分,便于逐窗口处理
          v = rearrange(v, 'b c (h dh) (w dw) -> b (h w) (dh dw c)',  # (B, N, 8*8*dim)
                        dh=self.window_size, dw=self.window_size)
          vs = rearrange(vs, 'b c (h dh) (w dw) -> b (h w) (dh dw c)',  # 同上
                         dh=self.window_size, dw=self.window_size)
          qk = rearrange(qk, 'b c (h dh) (w dw) -> b (h w) (dh dw c)',  # (B, N, 8*8*2*dim)
                         dh=self.window_size, dw=self.window_size)
      
          # 训练/测试分支:区分重要/非重要区域
          if self.training or train_mode:
              # 训练时用掩码加权(软划分)
              N_ = v.shape[1]  # 窗口数N
              v1, v2 = v * mask, vs * (1 - mask)  # v1:重要区域,v2:简单区域
              qk1 = qk * mask  # 仅重要区域参与注意力计算
          else:
              # 测试时用索引选择(硬划分,更高效)
              idx1, idx2 = mask  # 重要/非重要区域索引
              _, N_ = idx1.shape  # 重要区域窗口数
              # 按索引提取区域特征
              v1, v2 = batch_index_select(v, idx1), batch_index_select(vs, idx2)
              qk1 = batch_index_select(qk, idx1)
      
          # 注意力计算(仅重要区域)
          # 重排v1为窗口内像素维度:(B, N_, 8*8*dim) → (B*N_, 64, dim)
          v1 = rearrange(v1, 'b n (dh dw c) -> (b n) (dh dw) c', 
                         n=N_, dh=self.window_size, dw=self.window_size)
          # 重排qk1为窗口内像素维度:(B, N_, 8*8*2*dim) → (B, N_*64, 2*dim)
          qk1 = rearrange(qk1, 'b n (dh dw c) -> b (n dh dw) c', 
                         n=N_, dh=self.window_size, dw=self.window_size)
          # 拆分q和k:各为(B, N_*64, dim)
          q1, k1 = torch.chunk(qk1, 2, dim=2)
          # 投影到目标维度
          q1 = self.project_q(q1)  # (B, N_*64, dim)
          k1 = self.project_k(k1)  # (B, N_*64, dim)
          # 重排q1和k1为窗口内像素:(B*N_, 64, dim)
          q1 = rearrange(q1, 'b (n dh dw) c -> (b n) (dh dw) c', 
                         n=N_, dh=self.window_size, dw=self.window_size)
          k1 = rearrange(k1, 'b (n dh dw) c -> (b n) (dh dw) c', 
                         n=N_, dh=self.window_size, dw=self.window_size)
        
          # 计算注意力权重:(B*N_, 64, 64)
          attn = q1 @ k1.transpose(-2, -1)  # 点积注意力
          attn = attn.softmax(dim=-1)  # 归一化
          # 注意力加权v1:(B*N_, 64, dim) → (B, N_, 8*8*dim)
          f_attn = attn @ v1
          f_attn = rearrange(f_attn, '(b n) (dh dw) c -> b n (dh dw c)', 
                             b=N, n=N_, dh=self.window_size, dw=self.window_size)
      
          # 融合重要区域(注意力结果)和简单区域(卷积结果)
          if not (self.training or train_mode):
              # 测试时用索引回填结果
              attn_out = batch_index_fill(v.clone(), f_attn, v2.clone(), idx1, idx2)
          else:
              # 训练时直接相加(掩码已区分区域)
              attn_out = f_attn + v2
      
          # 重排回图像维度:(B, N, 8*8*dim) → (B, dim, H, W)
          attn_out = rearrange(
              attn_out, 'b (h w) (dh dw c) -> b (c) (h dh) (w dw)', 
              h=H//self.window_size, w=W//self.window_size, 
              dh=self.window_size, dw=self.window_size
          )
          
          # 卷积处理+残差连接(增强简单区域表达)
          out = attn_out
          out = self.act(self.conv_sptial(out)) * ca + out  # 卷积结果×通道注意力 + 残差
          out = self.project_out(out)  # 最终输出投影
      
          if self.training:
              return out, torch.mean(mask, dim=1)  # 训练时返回输出和掩码均值(用于监控)
          return out
      
    • 输入特征 x(B, dim, H, W)→ 生成 v/q/k → 窗口化重排为(B, N, 64*dim)→ 重要区域 v1 经注意力计算 →(B, N_, 64*dim)→ 与简单区域 v2 融合 → 重排回(B, dim, H, W)→ 卷积增强 → 输出。核心是通过「窗口化 + 动态划分」实现注意力与卷积的按需分配,减少冗余计算。

  • 多任务支持:适配不同超分场景,

    • 大图像超分:测试时用TileModelTile_model.py)将图像分块(64x64 tile,重叠 4 像素),避免大分辨率输入的显存爆炸。配置文件如test_2K.ymltest_8K.yml,对应不同分辨率测试集。
    • 轻量级超分:网络参数(如ratio=0.5options/train/train_example.yml)控制注意力区域比例,降低计算量。测试用test_x2.ymltest_x4.yml,对应不同缩放因子。
    • 全向图像超分:专用数据处理脚本(odisr/utils/make_augmentation_dataset.py)处理球面图像(ERP 格式),通过经纬度裁剪和投影变换生成训练数据。适配全向图像的畸变特性,验证模型对特殊图像的适用性。

数据组织:构建超分数据集

  • 条形码超分需要低分辨率(LR)- 高分辨率(HR)成对数据,需按照 CAMixerSR 的数据集格式组织,参考仓库中PairedImageDataset的结构。HR 数据:高质量条形码图像(清晰、无模糊),建议分辨率统一(如 200x200 像素,根据实际场景调整)。LR 数据:通过对 HR 图像进行下采样生成(模拟低清输入),下采样方式建议用双三次插值(与仓库中 LRBI 一致),下采样倍数(scale)根据需求设置(如 x2、x4)。

    • barcode_dataset/
      ├── HR/                # 高分辨率条形码图像
      │   ├── barcode_001.png
      │   ├── barcode_002.png
      │   ...
      └── LR/                # 低分辨率条形码图像(对应HR下采样x4)
          ├── barcode_001.png
          ├── barcode_002.png
          ...
      
    • 确保图像格式为 PNG/JPG,文件名一一对应(如 HR 和 LR 的barcode_001.png为同一条形码的高低清对)。若数据集较大,可参考仓库中extract_subimage.py对图像进行裁剪(如裁剪为 64x64 子图,步长 32),加速训练时的 IO 效率。

数据预处理:适配模型输入

  • CAMixerSR 对输入数据有特定预处理要求,需执行以下步骤:

    • 数据增强(训练集): 条形码以线条为主,需避免过度增强破坏结构,use_hflip: true(水平翻转,条形码水平对称不影响识别);use_rot: false(旋转可能破坏条形码方向,按需关闭);参考配置:codes/options/train/train_example.yml中的datasets.train部分。

    • 格式转换与归一化,默认使用ToTensor将图像转为[0,1]范围的张量,无需额外处理,确保图像通道为 RGB(若条形码是灰度图,可转为 3 通道重复)。

    • 子图像提取(可选):若条形码图像尺寸较大,使用仓库中的extract_subimage.py裁剪为固定大小子图(如 128x128),参数示例:

    • opt['input_folder'] = 'barcode_dataset/HR'
      opt['save_folder'] = 'barcode_dataset/HR_sub'
      opt['crop_size'] = 128
      opt['step'] = 64  # 重叠裁剪,保留边缘信息
      extract_subimages(opt)  # 对LR执行相同操作
      
  • 基于仓库的训练框架微调模型,核心是修改训练配置文件(.yml),适配条形码场景。复制codes/options/train/train_example.ymltrain_barcode.yml,修改关键参数:

    • datasets:
        train:
          name: Barcode
          type: PairedImageDataset
          dataroot_gt: /path/to/barcode_dataset/HR_sub  # 高分辨率子图路径
          dataroot_lq: /path/to/barcode_dataset/LR_sub  # 低分辨率子图路径
          gt_size: 128  # 与裁剪尺寸一致
          use_hflip: true
          use_rot: false  # 关闭旋转增强
          batch_size_per_gpu: 16  # 根据GPU显存调整(如12GB可设16)
        val_1:
          name: BarcodeVal
          type: PairedImageDataset
          dataroot_gt: /path/to/barcode_dataset/HR_val
          dataroot_lq: /path/to/barcode_dataset/LR_val
      
    • CAMixerSR 的ratio参数控制 “注意力机制” 占比(值越大,越关注复杂区域),条形码以简单线条为主但需精确还原边缘:

    • network_g:
        type: CAMixerSR
        ratio: 0.3  # 降低注意力占比(默认0.5),减少冗余计算
        scale: 4  # 超分倍数(与数据集中的下采样倍数一致)
      
    • 训练参数

    • train:
        total_iter: 100000  # 条形码数据简单,可减少迭代次数
        optim_g:
          type: AdamW
          lr: 2e-4  # 微调学习率(小于默认5e-4,避免破坏预训练特征)
          weight_decay: 1e-4
        scheduler:
          type: MultiStepLR
          milestones: [50000, 80000]  # 分阶段降学习率
        pixel_opt:
          type: L1Loss  # 条形码注重像素级精度,L1损失更合适
      
    • 验证参数

    • val:
        val_freq: 5000  # 每5000次迭代验证一次
        metrics:
          psnr:
            crop_border: 4  # 与scale一致(x4则裁剪4像素边缘)
            test_y_channel: false  # 条形码为RGB/灰度,无需转Y通道
      
    • 加速收敛,可加载仓库提供的预训练模型(pretrained_models/),在配置中指定:

    • path:
        pretrain_network_g: /path/to/pretrained_models/LightSR/CAMixerSR_x4.pth
        strict_load_g: false  # 允许部分层不匹配(如输入通道调整时)
      
    • 执行训练脚本,指定自定义配置文件:

    • cd codes
      python basicsr/train.py -opt options/train/train_barcode.yml
      
    • 训练过程日志会保存至experiments/barcode_train/log/,包含损失曲线、PSNR 等指标。模型权重保存至experiments/barcode_train/models/,可通过 TensorBoard 查看训练动态:

    • tensorboard --logdir tb_logger/barcode_train
      
    • 训练完成后,使用测试脚本对新的低清条形码进行超分。复制codes/options/test/test_x4.ymltest_barcode.yml,修改:

    • datasets:
        test_1:
          name: BarcodeTest
          type: PairedImageDataset
          dataroot_gt: /path/to/barcode_test/HR  # 测试集HR(可选,用于评估)
          dataroot_lq: /path/to/barcode_test/LR  # 测试集LR(待超分图像)
      network_g:
        type: CAMixerSR
        ratio: 0.3
        scale: 4
      path:
        pretrain_network_g: /path/to/experiments/barcode_train/models/net_g_latest.pth  # 加载训练好的模型
      val:
        save_img: true  # 保存超分结果
        suffix: barcode_sr  # 结果图像后缀
      
    • 执行推理,超分结果会保存至results/BarcodeTest/

    • cd codes
      python basicsr/test.py -opt options/test/test_barcode.yml
      
  • 条形码为黑白线条,PSNR/SSIM 高不代表解码成功,需结合实际解码效果。使用条形码解码库(如pyzbar)验证超分结果:

    • from pyzbar.pyzbar import decode
      from PIL import Image
      
      def decode_barcode(img_path):
          img = Image.open(img_path)
          result = decode(img)
          return len(result) > 0  # 解码成功返回True
      # 统计超分后解码成功率
      sr_img_paths = glob.glob('results/BarcodeTest/*.png')
      success_rate = sum(decode_barcode(p) for p in sr_img_paths) / len(sr_img_paths)
      
  • 调优策略;增加训练数据多样性:包含不同模糊程度、噪声水平的条形码。强化边缘数据:对条形码边缘区域进行过采样,提升模型对线条的还原能力。ratio:若条形码边缘模糊,可适当提高(如 0.4),增强注意力对细节的捕捉。gt_size:若条形码尺寸较小(如 100x100),减小裁剪尺寸(如 64x64),避免信息丢失。损失函数:结合感知损失(perceptual_opt),提升视觉质量(需调整权重loss_weight)。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐