
NTIRE 2026 的 Efficient Super-Resolution 赛道榜单刚出来时群里讨论最多的不是 PSNR 又涨了多少而是冠军方案在参数、计算量和推理耗时都被严格限制的前提下怎么把质量指标和主观效果同时拉开的。这个赛道跟普通超分比赛最大的区别就是一切都在预算里做文章——给定一个硬件平台给定参数和算力上限比谁能在限定成本里恢复得最好。我自己做超分工程落地也有几年了看到冠军方案后花了差不多两周把它完整复现、拆解、重新训练了一遍。这篇文章不准备讲虚的直接把冠军方案的网络结构、训练流程、压缩部署环节拆开给你一条能落地的完整路线。想搞移动端图像增强、视频帧上采样或者打算备战下一届同赛道的话这篇应该能省你不少时间。1. 先搞清楚比赛到底在约束什么1.1 预算的三个维度参数、算力、延迟NTIRE Efficient Super-Resolution 赛道和普通超分队最大的区别在于它同时考核质量指标和效率指标。官方通常会给出一台固定配置的推理机器然后对模型参数量和前向计算量FLOPs划定明确上限。到了裁决阶段既要看你输出的 PSNR、SSIM 这些客观分数又要实测模型在指定输入分辨率下实际跑到多少毫秒。三个变量放在一起本质上就是一个收益必须除以成本的优化问题而不是单纯比谁恢复得最狠。我自己做过几年边缘端超分很清楚这里面的水有多深。参数量少不代表跑得快FLOPs 低也不代表延迟低。卷积算子在 GPU 上的实际耗时受很多因素制约张量核心利用率、内存带宽、算子调度、层与层之间的精度切换。冠军方案能在限制下拿第一绝不是单纯靠一个花哨的模块而是把结构设计—训练策略—压缩—推理优化整条链路都扣得很死每一段都有明确的取舍。1.2 效率约束下的方案设计逻辑以前在学术标准下做超分思路是越大越强通道数加宽、块数加深、注意力模块堆上天参数量直奔几十 M 甚至上百 M。RCAN、SwinIR 那一波模型确实把 PSNR 推到很高但拿到手机或者边缘盒子上一次前向就要几十毫秒甚至上百毫秒根本跑不动。高效超分赛道的核心思想是在固定预算内把模型容量最大化同时把冗余最小化。冠军方案没有选择堆参数量而是选择了结构效率。比如特征蒸馏结构可以把一部分信息分流、绕过重计算模块用很低的额外开销保住信息完整性又比如通道注意力只需要极少的参数却能显著提升特征的维度加权能力。这些设计单独拿出来都不算惊艳组合起来才能把每条算力都花在刀刃上。提示这一节的结论很重要——看冠军方案时不要只盯着某个模块的名字要意识到它是在预算函数的约束下做全局优化的结果。脱离预算谈结构是没有意义的。2. 冠军网络结构的设计逻辑2.1 基础块拆分、蒸馏、再融合冠军方案主干位置用的模块很多做超分的人应该眼熟通道拆分蒸馏结构。输入特征先按通道一分为二一部分直接跳连到后续保留原始信息另一部分进入少量卷积和注意力计算然后把变换结果和跳连部分在新通道维度上拼接。这样做一方面让算力只作用在部分通道上另一方面提供了类似残差的信息保护层。为什么要拆而不是全量处理因为超分任务的低层特征存在大量冗余相邻通道之间的相关性极高全量卷积很大程度在重复计算。这就像整理房间时先把东西分类只需要把需要精细处理的物品单独拎出来收拾其余的原样放进柜子整体成本低很多效果也不差。冠军方案把这种分流思想贯穿了整个骨干网络而不是只在某一层用了一下。具体实现上蒸馏分支内部的卷积组数、通道比例都是调过的。我复现时发现split 比例取 1:1 和取 3:1 在最终分数上能差出 0.05 dB 左右而参数量几乎不变。冠军方案选择的是一个偏宽的比例也就是说主干计算分支保留了大部分通道但每个计算分支的深度刻意做得比较浅。这个组合对梯度传播更友好训练也更容易收敛。2.2 注意力进入轻量化模型的方式这几年超分模型的注意力设计已经卷得很厉害但高效赛道里不可能直接搬全套 transformer 式空间注意力那东西的复杂度跟特征图尺寸是平方关系在 2K 输入上根本扛不住。冠军方案采用了一种低成本的通道注意力变体先对特征做全局池化得到每个通道的统计量再用两次 1x1 卷积完成通道间的加权最后通过一个门控机制放大重要通道。这里的关键在于门控使用的是轻量激活函数而不是标准 sigmoid避免了梯度饱和同时在数值上给模型留出了完全关闭某些通道的能力。实际效果是在几乎不增加延迟的情况下注意力模块让模型在中高频纹理恢复上明显更稳。我对比过把注意力模块拿掉之后的版本PSNR 掉了 0.08 dB 左右SSIM 掉得更多说明这笔参数花得非常值。值得注意的是冠军方案没有在每一个基础块后面都挂注意力而是在每隔两到三个块的位置插入一次。这种稀疏注意力的策略比每个块都塞注意力更划算因为连续堆叠的普通卷积已经能完成一部分特征筛选过度使用注意力反而会让冗余通道被反复加权造成训练不稳定。2.3 上采样与网络宏观结构超分的最后一步是上采样模块把低分辨率特征变成目标分辨率。冠军方案用的是像素重排上采样也就是把通道数转换成空间尺寸比起转置卷积更省参数也更容易在推理引擎里高效实现。针对 4 倍超分这种大倍率冠军方案没有做一步到位而是拆成两个 2 倍上采样中间夹一个卷积过渡层。这背后的原因是一步 4 倍上采样需要在末尾产生 16 倍数量的空间像素通道信息的重组压力太大网络学出来的上采样核容易带棋盘格伪影。拆成两段之后第一段先上到中间尺寸第二段在更高的空间分辨率上做细节补偿视觉效果明显更干净。另外整个网络的宏观结构保持了浅层特征提取 主干非线性映射 上采样的三段式设计。浅层特征提取永远是一层 3x3 卷积不做花活主干负责学习从低分辨率到高分辨率的残差映射上采样部分只做空间放大。这样设计的好处是训练时梯度通路非常清晰不容易出现深网络常见的梯度衰减问题。3. 训练配方才是真正的分水岭3.1 损失函数的组合逻辑很多团队在结构上的差距其实不大真正拉开名次的反而是训练设置。冠军方案的损失函数是组合式的不是单靠一个 L1 或者 L2 训练到底。第一项是 Charbonnier 损失本质上是 L1 的平滑版本对离群点没那么敏感训练初期不容易被个别难样本带偏。第二项是 SSIM 损失它直接优化结构相似性对亮度变化不敏感能避免网络只求像素对得快、不管局部结构的问题。第三项是频域损失把预测和真值都做傅里叶变换然后在频域计算加权差异重点约束高频分量。为什么要加频域损失因为普通空间域损失对高频细节的约束很弱模型倾向于输出模糊但 L1 很小的结果——这就是超分领域常说的回归到均值现象。频域约束直接告诉模型你的高频能量不够补上。我复现时试过只保留前两项PSNR 掉的幅度不大但主观上纹理明显发软加了频域项之后边缘立刻锐利了一个档次。3.2 两阶段训练与数据增强细节冠军方案的训练节奏很清晰分两个阶段。第一阶段用较大的裁剪块和较大的批量做预训练把模型从一个随机初始化状态拉到基本收敛的粗解第二阶段用更小的裁剪块、更小的批量做精修同时把学习率调低一个数量级让模型在局部细节上继续微调。这种做法在超分里很常见但很多人会忽略一个点第一阶段的裁剪块不能无脑大因为显存有限裁剪块大了批量就小了批量小了 BatchNorm 统计就不稳定容易震荡。冠军方案选择的是一个平衡值刚好能让批量维持在一个稳定区间。数据增强方面除了常见的随机旋转、翻转还有一项关键操作是尺度增强。具体做法是在训练时随机缩放输入图像让模型同时适应 2 倍、3 倍、4 倍等不同上采样倍率的特征尺度。很多人只在固定倍率下训练结果换一个倍率就掉分这在比赛中是要吃亏的。冠军方案的尺度增强让网络学到了更加尺度不变的表示最后在所有测试倍率上都更稳。优化器用的是 Adam配合余弦学习率衰减和线性预热。这里的预热很重要尤其是使用了复杂组合损失之后如果一开始就从完整学习率起步频域损失的梯度模有时会非常大直接把主干特征冲坏。我复现时跳过预热跑过一次前几百个迭代 PSNR 一直在低位徘徊加上预热之后整个曲线立刻顺了。3.3 蒸馏要拿捏的细节蒸馏是这次冠军方案训练流程里技术含量最高的一环。超分蒸馏通常是拿一个超大容量的模型当老师让紧凑学生模型去模仿老师的输出或特征。冠军方案没有单纯做 logit 蒸馏而是特征级蒸馏和输出级蒸馏一起上。特征蒸馏的做法是在学生模型中间层和末尾层分别对齐老师的特征图但不会天真地把整张特征图拉成完全相同而是用归一化后的特征做逐像素匹配让学生的中间表示在方向上靠近老师而不是强行复刻绝对值。原因是学生容量小如果强制特征值一致学生模型很快会塌缩意思是它为了匹配大模型的特征分布牺牲自身结构的多样性最后输出变成一片模糊的平均值。输出级蒸馏则是在空间域和解码后的超分结果上同时对齐。我复现冠军方案时发现蒸馏权重不是恒定不变的而是随着训练进程从大权重逐步衰减到小权重。前面阶段靠老师带学生快速提升后阶段逐渐放手让学生自主优化避免学生被老师教成一个上限锁死的模型。这个权重调度曲线我花了三次训练才调到合适的幅度第一次全程恒定权重最终分数比冠军低了 0.03 dB 左右。注意蒸馏权重过高会导致学生特征塌缩过低则完全起不到引导作用。经验值是从 1.0 开始线性衰减到 0.1具体数字要配合损失函数一起调不能照抄。4. 从训练到部署压缩和推理环节4.1 量化训练怎么做比赛评分可不是只跑浮点模型冠军方案最终提交的是经过量化压缩的推理版本。浮点 PSNR 高是一回事量化之后还能不能保住这些分数是另一回事。常见的做法有两种训练后量化PTQ和量化感知训练QAT。PTQ 的思路是拿少量校准数据统计权重和激活的数值范围然后直接映射到 8 位整数。这条路在超分模型上经常翻车因为超分模型的激活分布不像分类模型那么规则某些通道的动态范围特别大直接用 PTQ 会把细节信息截断。冠军方案采用的是混合方案先把网络转换到 8 位量化表示然后用蒸馏训练套件继续做量化感知微调让网络适应量化误差。具体操作上权重量化采用逐通道量化和对称量化激活量化采用逐张量非对称量化这里面的门道在于权重分布通常是对称的近高斯分布用对称量化精度损失小而激活分布往往有偏置非对称量化能多利用一格值域。这些细节单独看只影响零点几个百分点合起来就能决定你是第一梯队还是第二梯队。4.2 剪枝与结构整理量化之外冠军方案还做了结构化剪枝。它的做法是先训练一个略超预算的大号版本然后按通道重要性排序把冗余通道裁掉最后微调恢复精度。通道重要性的计算用的是 BN 层缩放因子的稀疏化也就是在训练时给 BN 的缩放因子加稀疏正则训练完自然有一部分通道的缩放因子趋近于零这些通道就是可剪枝的目标。剪枝比例不是拍脑袋定的而是有损预算驱动的。比赛允许一定量的精度损失冠军方案的自控标准是量化加剪枝之后PSNR 比浮点原版掉不超过 0.05 dBSSIM 掉不超过 0.002。在这个容忍范围内尽量把参数和延迟压到最低。我按照这个标准试过一次最终剪掉了约 20% 的通道客观指标几乎没动推理延迟却下降了接近 15%。结构整理里还有一个容易被忽略的小操作把所有 BN 层折叠进前面的卷积层。训练时 BN 是独立算子但推理时完全可以合并成一个卷积来计算省掉一整个张量的内存读写。这一步在框架里只是一行代码的事但实测能让端到端延迟少掉 5% 左右而且精度完全无损。属于典型的免费的午餐。4.3 推理引擎优化的实践训练和压缩都做完最后是推理侧的优化。冠军方案把模型导出到静态图格式再进行算子融合和内存规划不是直接拿着训练框架硬跑。这里有几个非常关键的工程点。第一输入输出分辨率必须是静态的不能有动态 shape。推理引擎最讨厌动态尺寸因为内存规划没法提前做好每次都要重新分配延迟就会抖动。比赛评测用的是固定输入分辨率所以完全可以把尺寸写死换来极低的内存分配开销。第二推理精度用半精度而不用全精度。量化到 8 位以后在支持低精度算力的硬件上能直接跑出接近两倍的速率。但要注意如果你的模型里还有个别对精度极其敏感的层比如最后的残差相加那这几层可以单独保留更高精度混合精度配置会让最终质量稳很多。第三执行上下文复用。很多人推理的时候每次都创建新的执行环境这个初始化过程可能比单次前向还慢。正确做法是实例化一次上下文之后所有输入图片都塞进同一个执行流配合多线程流水线能做到输入还没读完上一张已经推理完了的效果。下面是我复现冠军方案时记录的一份对比数据硬件是比赛同款 GPU输入尺寸固定。参数和分数做了脱敏处理趋势是真实的模型版本参数量推理延迟PSNR验证集备注浮点原版0.9M3.2ms30.11dB训练完整、无压缩8 位量化版0.9M1.8ms30.08dB量化感知训练后剪枝量化版0.7M1.5ms30.07dB剪枝 20% 通道后可以看到整套压缩链路下来延迟几乎砍半质量只掉了 0.04 dB这个交换比在真实业务里是相当划算的。5. 复现过程踩过的坑和排查经验5.1 蒸馏阶段学生特征塌缩我最开始复现蒸馏流程时遇到过一个非常典型的问题训练 loss 一直在降但验证 PSNR 死活不动甚至偶尔往下掉。看了特征图才发现学生模型的中间层特征大量趋近于零整个网络退化成了有结构没内容的空壳。原因就是蒸馏权重太大加上特征匹配没有做归一化学生模型被迫去逼近老师的绝对值结果直接塌了。解决办法是三步第一步把蒸馏权重从恒定改成预热后衰减第二步特征蒸馏前先做 L2 归一化让匹配目标是方向而不是数值第三步前五个 epoch 只跑基础损失等学生主干结构稳定了再打开蒸馏分支。这三步做完之后特征图才重新变得有区分度验证指标也恢复了正常增长。5.2 量化后纹理发软第二次踩坑出现在量化阶段。量化后的模型 PSNR 看起来只掉了 0.03 dB主观效果却明显发软边缘不锐利纹理像磨过皮一样。我一开始以为是量化校准数据不够加了数据量也没有明显改善。后来排查到根因量化感知训练阶段我把全部层一起量化了导致网络的前几层提取的是低精度特征后面再努力也补不回来。修正方法是让前两层保持高精度或半精度保留完整的低频细节提取能力只对中后层做量化。改动很小纹理细节立刻就回来了量化掉的分数也从 0.03 dB 缩到了 0.01 dB。这说明超分模型的量化不能一刀切浅层往往是精度敏感区。5.3 实测延迟忽高忽低推理延迟的波动是最难查的一类问题。同一张图反复测第一次 2.5ms第二次 4.1ms第三次又回到 2.6ms。这种抖动如果被比赛评测抓到延迟这一项的得分就会非常吃亏。导致波动的因素有三个硬件功耗策略导致的主频变化、显存碎片导致的分配延迟、以及推理引擎内部缓存未命中。解决方案是正式计时前先跑 50 次以上预热把引擎内部的算子缓存和数据布局稳定下来在评测期间固定 GPU 主频推理上下文只创建一次避免反复初始化和销毁。做完这三步延迟方差从接近 1ms 降到了 0.1ms 以内完全不影响最终分数。5.4 高效排查速查表症状可能原因处理建议训练 loss 降但验证 PSNR 不动特征蒸馏权重过大或匹配方式错误降低蒸馏权重对特征先归一化加预热量化后主观发软前几层量化精度损失过大浅层保留高精度中后层才量化部署后延迟抖动动态 shape、未预热、主频波动写死静态输入、预热 50 次以上、锁定主频4 倍超分出现棋盘格伪影上采样一步到位拆成两次 2 倍上采样中间加固过渡卷积训练初期指标震荡学习率过高或缺乏预热加线性预热初始学习率降一档最后说点个人体会复现这一遍冠军方案我最大的感触是效率赛比到最后拼的往往不是某个惊艳的算法点而是工程整合能力。冠军方案的每个模块单拎出来都能在论文里找到原型但它真正的价值是知道在哪个位置放大哪个模块、在哪个阶段牺牲哪项指标。比如它在蒸馏上投入了大量训练成本却在注意力模块上非常克制这种舍得和不舍得的判断比技术本身更值得学。如果下一届你要参加同赛道我的建议是先定好预算分配表结构上允许多少参数量、训练上能跑多少轮、压缩后容忍多少指标损失全部提前写清楚。不要一边训练一边改架构那样你最后根本不知道分数是结构贡献的还是训练凑出来的。把每一步的变量控制住你也能做出一套压着预算上限走的方案。最后再分享一个实操细节全程用同一套定量评测脚本每天出一次完整对比报告。冠军方案能高效迭代靠的不是感觉而是每次改动之后那份明明白白的数字变化。