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 dB,SSIM 掉不超过 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 倍上采样,中间加固过渡卷积训练初期指标震荡学习率过高或缺乏预热加线性预热,初始学习率降一档最后说点个人体会复现这一遍冠军方案,我最大的感触是:效率赛比到最后,拼的往往不是某个惊艳的算法点,而是工程整合能力。冠军方案的每个模块单拎出来都能在论文里找到原型,但它真正的价值是知道在哪个位置放大哪个模块、在哪个阶段牺牲哪项指标。比如它在蒸馏上投入了大量训练成本,却在注意力模块上非常克制,这种"舍得"和"不舍得"的判断比技术本身更值得学。如果下一届你要参加同赛道,我的建议是先定好"预算分配表":结构上允许多少参数量、训练上能跑多少轮、压缩后容忍多少指标损失,全部提前写清楚。不要一边训练一边改架构,那样你最后根本不知道分数是结构贡献的还是训练凑出来的。把每一步的变量控制住,你也能做出一套压着预算上限走的方案。最后再分享一个实操细节:全程用同一套定量评测脚本,每天出一次完整对比报告。冠军方案能高效迭代,靠的不是感觉,而是每次改动之后那份明明白白的数字变化。
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 dB,SSIM 掉不超过 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 倍上采样,中间加固过渡卷积训练初期指标震荡学习率过高或缺乏预热加线性预热,初始学习率降一档最后说点个人体会复现这一遍冠军方案,我最大的感触是:效率赛比到最后,拼的往往不是某个惊艳的算法点,而是工程整合能力。冠军方案的每个模块单拎出来都能在论文里找到原型,但它真正的价值是知道在哪个位置放大哪个模块、在哪个阶段牺牲哪项指标。比如它在蒸馏上投入了大量训练成本,却在注意力模块上非常克制,这种"舍得"和"不舍得"的判断比技术本身更值得学。如果下一届你要参加同赛道,我的建议是先定好"预算分配表":结构上允许多少参数量、训练上能跑多少轮、压缩后容忍多少指标损失,全部提前写清楚。不要一边训练一边改架构,那样你最后根本不知道分数是结构贡献的还是训练凑出来的。把每一步的变量控制住,你也能做出一套压着预算上限走的方案。最后再分享一个实操细节:全程用同一套定量评测脚本,每天出一次完整对比报告。冠军方案能高效迭代,靠的不是感觉,而是每次改动之后那份明明白白的数字变化。