FEATURED · 精选文章

TinySR:轻量级扩散模型如何攻克真实世界图像超分难题?

发布时间 / 2026/9/10 7:01:24
来源 / 创域科博编辑部
栏目 / 资讯中心
TinySR:轻量级扩散模型如何攻克真实世界图像超分难题? 做真实世界图像超分辨率的人大多有过这种体验在公开基准集上刷到很高的PSNR一放到自己拍的模糊照片、老照片、监控截图或者网络压缩图上效果立刻现出原形不是边缘糊成一团就是纹理被磨平甚至出现伪影。原因不复杂——真实世界的退化远比训练时用的“双三次下采样”复杂得多。这也是为什么当扩散模型开始进入图像超分领域时很多人都眼前一亮。TinySR就是在这个背景下出现的一种思路用轻量级扩散模型去解决真实世界图像超分辨率的难题在不过分吃显存、不拖慢推理速度的前提下把纹理生成和细节恢复的能力做上去。这篇文章会从真实世界超分的痛点讲起再拆解TinySR的核心设计、关键实现、实验评估和训练部署中的坑。适合已经在做图像复原、SR或扩散模型相关工作的朋友参考也适合刚入门想了解“轻量级扩散模型为什么能做超分”的读者。我尽量把每个选择的“为什么”说清楚而不是只甩出一个网络结构图。1. 从真实世界超分说起为什么通用超分模型一到真实场景就翻车1.1 理想退化与真实退化的差距传统超分模型在训练时通常会做一件事把高分辨率图像用双三次插值降采样得到低分辨率输入然后让模型学一个从低到高的映射。这样做的好处是干净、可控、容易生成成对训练数据但坏处也明显真实世界的退化过程包含了模糊、噪声、压缩伪影、采样偏移、传感器响应差异等多种因素双三次下采样只是其中最理想化的一种。我在早期的超分项目里就踩过这个坑。模型在Set5、Set14、Urban100这些标准集上表现很好PSNR也漂亮但一接到用户上传的旧照片效果就变得不可控。照片本身有颗粒噪点还有当年扫描留下的网纹模型没有见过这类退化于是会尝试把噪声也当成纹理去“恢复”结果就是皮肤上出现密密麻麻的假细节。这类问题不是靠调loss能解决的本质上是训练数据分布和真实数据分布没有对齐。后来业内开始用更复杂的退化模型去合成数据比如在高分辨率图像上叠加高斯模糊、多次下采样、JPEG压缩、随机噪声等。这一套组合拳确实有效Real-ESRGAN等模型之所以在真实场景下表现提升关键也在退化建模上。但合成退化再怎么模拟也覆盖不了真实世界的长尾分布所以更进一步的思路是让模型具备更强的先验能力而不是死记退化的反向映射。扩散模型正好提供了这种先验。1.2 扩散模型凭什么能扛起真实超分这杆旗扩散模型的核心逻辑是通过多步去噪逐步把纯噪声还原成清晰图像。这个过程中模型并不是简单学习一个低分辨率到高分辨率的映射而是在学习数据本身的分布。换成超分的语境来说扩散模型不只是在“补细节”它在“生成缺掉的细节”。这个区别至关重要。举个例子一张低分辨率人脸照片放大到4倍后眉毛的走向、发丝的纹理、皮肤的质感其实存在很多种可能传统SR模型会取一个平均结果所以看起来“平滑但缺乏真实感”。扩散模型则会在采样过程中不断根据条件图像修正生成方向最终产出一张在视觉上更真实、纹理更自然的图像。这也是扩散模型在生成领域能碾压GAN的根本原因——它不做单步映射而是逐步细化。但扩散模型的代价也众所周知大。参数动辄上亿采样步数动辄几十步一张图要跑好几秒甚至更久。这在云端的离线任务里还能忍一旦放到真实应用里比如手机端、Web服务、批量处理管线就非常吃力。TinySR要解决的问题就是在保留扩散模型生成真实感细节能力的同时把参数量、计算量、采样成本降到一个可接受的范围。1.3 TinySR的定位不是做超大模型而是把扩散模型塞进有限算力“轻量级”这三个字在不同人眼里含义不同。有人觉得参数量少于1亿就算轻量有人觉得能跑在手机端才算轻量。TinySR的目标不是追求极致的压缩而是在“真实世界SR效果”和“计算成本”之间找一个实用平衡点。从我自己的实践来看真实世界超分任务里模型体积往往不是第一瓶颈算力才是。一张720p的图要做4倍超分输出是2880p中间特征图的尺寸非常大。这时候哪怕参数量只有几千万推理时的显存占用和耗时也会让你很头疼。所以TinySR的轻量化不只是压缩参数还要控制中间特征尺寸、削减冗余计算、缩短采样步数。这是一个系统工程而不是单纯把ResNet块换成MobileNet块那么简单。2. TinySR整体设计轻量与保真的拆解思路2.1 整体架构从骨干网络到采样策略TinySR给我的印象是它没有走“魔改网络结构”的路线而是把已有扩散模型SR方案的各个模块都做了瘦身和适配。整体上可以看作三部分条件编码器、去噪U-Net主体、采样调度器。条件编码器负责从低分辨率图像中提取条件特征。它不需要太深因为主要目的是引导生成而不是直接产出高分辨率结果。去噪U-Net是核心负责在每一步去噪时接收条件特征和当前噪声图预测噪声或直接预测原图。采样调度器则控制从噪声到最终图像的步数、噪声强度变化曲线这一步对效果和速度的影响极大很多人会忽略。用生活化的类比来理解条件编码器像是一个戴着眼镜的译者把低分辨率图像的关键信息翻译给去噪U-Net听去噪U-Net像一个画家每步细化画布采样调度器则决定画家要画多少笔以及每笔的粗细。TinySR在每一环上都做了精简特别是去噪U-Net内部的通道数、Block数量、Attention位置都经过了一轮取舍。2.2 轻量化的三条路小模型、少步数、精简通道第一小模型。直接把扩散U-Net的通道基数从常见的128或256降到64甚至更低。这不是单纯“减少一点”因为扩散模型在生成任务中对容量很敏感通道数降到一定程度后生成质量会出现断崖式下跌。TinySR的做法是先找到质量可接受的最低通道数再通过增加深度来弥补宽度不足而不是盲目瘦身。第二少步数。扩散模型最耗时的就是迭代采样。传统的DDPM需要1000步后来DDIM压缩到50步再后来DPM-Solver等加速采样器可以做到20步甚至更少。TinySR在采样上直接采用少步数策略但问题是步数变少后每次去噪的误差会被放大。为了解决这个问题它会在训练时同步使用少步数采样来模拟推理过程而不是训练时用大步数、推理时才发现误差积累。第三精简通道。步数多是因为单次去噪能力不够单次去噪能力不够有时又是因为通道数太少。这是轻量化的核心矛盾。TinySR的思路是把通道资源集中在需要高频细节的位置也就是中间层和Attention模块浅层特征则用更少通道避免在低层次特征上浪费计算量。2.3 为什么不能直接裁剪已有扩散模型扩散模型的算力陷阱很多人觉得“轻量”就是把现有的扩散模型裁掉一些层、降低一些通道但实际做过之后会发现直接裁剪往往会遇到两个问题。第一扩散模型在训练时学到的是整个分布裁剪后分布建模能力下降不是平滑的变化而是某些类别的纹理完全崩坏。第二扩散模型的推理成本不只是参数量决定的还和中间特征图的通道数、注意力计算范围强相关。裁掉注意力层固然省算力但图像超分恰恰需要长程依赖来保持结构一致性裁过头就会产生结构扭曲。我试过把一些经典超分扩散模型的U-Net通道数直接减半继续训练效果让人崩溃整体颜色偏掉边缘出现“水波纹”般的伪影且模型训练很难收敛。后来我才明白扩散模型不像CNN分类网络那样有冗余它的每一层都在逐步“细化”信息过早压缩信息会破坏生成过程。TinySR的高明之处在于它不是简单压缩而是重新设计了一个容量分配方案让有限参数尽量用在刀刃上。3. 核心细节与关键实现3.1 退化建模与数据合成既然TinySR面向真实世界SR训练数据的退化过程就不能是简单的双三次下采样。实际项目中我建议从四个维度来合成退化数据模糊核高斯模糊、运动模糊、散焦模糊模糊核尺寸和强度需要随机采样覆盖多种真实镜头退化。下采样除双三次外加入最近邻、双线性、甚至随机采样偏移模拟传感器采样过程的损失。噪声高斯噪声之外尽量加入一些真实噪声模型比如泊松噪声、JPEG压缩噪声。如果有条件用真实噪声提取网络从暗光照片中分离噪声再叠加进去。压缩伪影JPEG质量因子在30到90之间随机采样必要时加入两次压缩。这个组合策略是真实世界SR模型效果的基础很多复现不理想的模型往往最后查下来是数据退化模拟不够充分。TinySR在数据合成上延续了类似思路但会更关注“难例”的采样。训练过程中如果一直给模型中等难度的退化样本它会停留在舒适区适当加入高难度样本比如重度模糊加高噪声可以逼着扩散模型启用更强的先验去恢复细节而不是偷懒依赖输入图像的低频信息。不过难度增加要控制比例我习惯按7:2:1分配中等、困难、简单样本。3.2 条件注入方式把低分辨率图的特征送进扩散模型扩散模型做SR最关键的设计之一就是如何把低分辨率图像条件注入到去噪过程中。常见有三种方式Concat方式直接把放大的低分辨率图像与噪声图在通道维度拼接。实现最简单但条件信息占比低模型容易弱化条件生成内容会产生幻觉。特征级注入通过条件编码器提取特征然后加到U-Net中间层。信息利用率高但需要设计特征对齐方式。Cross-Attention用低分辨率特征做Key/Value噪声特征做Query。效果最灵活但计算量偏大轻量级场景需要慎重。TinySR在条件注入上采用的是“多尺度特征注入”的思路。条件编码器在不同层级提取低分辨率图像特征然后分别注入U-Net对应分辨率的层。这样既能保留低频结构信息又能在高频层引导细节生成。这个设计在实际实验中效果明显尤其是面对大倍率超分时没有多尺度注入的版本经常出现“大结构对、小纹理乱”的问题。3.3 损失函数与训练技巧感知损失、对抗损失、稳定性平衡扩散模型的训练核心是噪声预测损失也就是让模型预测加入的噪声。但这对于图像超分任务来说还不够最终目标是生成高分辨率图像而不是单纯学一个去噪器。TinySR在训练中往往会搭配额外的监督信号像素损失生成的最终图像与高分辨率原图的L1距离。可以帮助稳定训练太快收敛到平庸结果权重不宜过高。感知损失在VGG特征空间计算距离能显著提升视觉质感但对着重纹理的区域容易过度锐化。对抗损失用判别器逼真生成结果。加入对抗损失后真实感会上一大截尤其对人眼敏感的区域眼睛、毛发、草地效果明显但训练稳定性会变差。噪声预测损失尽力保持原扩散训练损失避免破坏分布建模能力。这些损失在轻量级模型里的配比要小心。模型容量有限时感知损失权重过高会导致纹理过于“油”对抗损失过高容易产生伪细节。我在跑TinySR这一类模型时一般会把像素损失和感知损失当作主监督对抗损失作为一个小的辅助项权重设在0.05到0.2之间根据验证集效果调节。3.4 推理时的步数与去噪策略优化训练结束后推理阶段的步数选择直接决定了速度与效果。用太少的步数会残留噪声伪影用太多则失去“轻量级”意义。目前主流的快速采样器主要有DDIM、DPM-Solver、DPM、UniPC等。其中DPM-Solver和UniPC在少步数10到20步下有比较好的表现。TinySR在推理时通常会配合这类采样器并把采样步数控制在10到20步之间。实测下来15步是一个比较甜点的数字效果与20步差距不大但速度快了不少。另外无条件引导或无分类器引导的强度也值得调。超分属于强条件任务低分辨率输入已经提供了大量约束所以guidance scale不宜设置太高否则模型会过度自信生成纹理时容易脱离真实结构。我这边测试下来guidance scale在1.0到1.5之间比较合理过高会让肤色和纹理变成“塑料质感”。还有一个容易被忽略的点扩散模型通常在潜在空间Latent Space里跑而不是直接在像素空间跑。输入图先经过一个编码器压缩到低维潜在表示去噪完成后用解码器还原成像素图。这能大幅降低计算量TinySR的轻量化有一部分就来自这个选择。代价是编码器-解码器会带来信息损失但考虑到真实世界SR任务本身就需要一定程度的“创造性重构”潜在空间反而是合适的。4. 实验设置与效果分析4.1 数据集与评估指标评估真实世界SR模型不能只看PSNR原因在于PSNR对像素级误差敏感但无法衡量纹理真实性。一个平滑到没有任何细节的图像可能拿很高的PSNR但人眼并不买账。TinySR这类扩散模型的目标本来就是生成“看似真实”的细节所以评估时我一般会做三件事用PSNR/SSIM做基础指标确认结构没有崩。用LPIPS感知距离评估感知质量这是更贴近人眼感受的指标。做一定规模的用户主观评测让真人给不同模型的输出打分。数据集方面公开的真实世界SR测试集并不多常用的有RealSR、DRealSR以及一些基准集如Set5、Set14、Urban100的合成退化版本。要注意的是在合成退化版本上评测结果只能说明模型对特定退化模拟的适应能力不能完全代表真实场景表现。所以有条件的话一定要留一批自己采集的真实照片作为测试集。4.2 在不同退化场景下的表现从我和同行交流的结果来看TinySR这类轻量级扩散模型在中等退化场景下表现最为稳定。所谓中等退化就是低分辨率图像本身还保留大致结构但细节模糊、有一定噪声。这种场景下模型能用先验知识补充合理纹理效果明显优于ESRGAN风格的GAN模型画面干净且真实。重度退化就麻烦了。比如一张低分辨率图像已经压缩到肉眼都看不清五官扩散模型会开始“脑补”生成一张看着真实但和原图不像的脸。这是先验过强带来的幻觉问题。轻量级模型因为容量小幻觉问题反而比大模型轻一些但代价是重建的细节不够丰富。在这个问题上没有免费的午餐。还有一个场景值得关注超分倍数。4倍超分是TinySR这类模型的最佳工作区间既有足够的细节恢复空间又不至于让模型因为自由度太大而失控。8倍超分的话我建议把TinySR当作一个组件接入“先粗超分再细超分”的级联流程不要指望单模型一步到位。4.3 轻量带来的收益速度、显存与实际部署轻量不是自嗨的指标最终要落到实际部署上。我按一下常规配置做过一组对比同样输入一张512×512的低分辨率图4倍超分输出2048×2048大扩散模型约4亿参数50步采样单张耗时约30秒以上显存占用超过10GB基本告别实时场景。TinySR约5000万参数15步采样单张耗时约2到4秒显存占用3GB左右中等GPU即可流畅运行。这个速度在批量离线任务里已经具备可行性比如老照片修复、历史影像增强、电商商品图优化。如果配合TensorRT或ONNX Runtime做推理优化在边缘设备上也不是完全没有机会。对于Web服务场景2到4秒的单张耗时可以靠异步任务队列消化用户体验依然是可接受的。5. 训练与部署中的常见问题与避坑5.1 训练不稳定的典型表现与对策扩散模型训练最常见的问题不是不收敛而是“假收敛”。具体表现是损失数值一直在降但生成图像却出现明显伪影或者验证集上的LPIPS不降反升。这种情况通常有三个原因学习率太大导致参数在最优解附近震荡尤其是Adam优化器配合扩散模型时建议初始学习率控制在1e-4到5e-4之间并配合warmup和余弦衰减。混合精度训练时某些层的数值溢出。扩散模型对数值精度比普通CNN敏感建议在关键损失计算处保持FP32。损失函数权重不稳定。上面说的对抗损失如果你用了判别器它的学习率一般要比生成器低否则判别器过强会导致生成器梯度爆炸。另外训练数据中的低分辨率图像要确保范围归一化到[-1, 1]或[0, 1]统一区间扩散模型对输入分布漂移非常敏感稍微错位都会让采样结果偏色或者产生网格伪影。5.2 轻量化网络容量不足怎么办如果发现TinySR在复杂场景下细节不够先别急着加通道。你可以从三个方面入手增加训练数据多样性。容量不够时数据多样性带来的收益往往比模型变大更明显尤其是纹理类数据、不同光照条件下的数据。改用更强的采样器。有些细节丢失不是模型没学到而是推理时采样器不够精确。换用DPM或UniPC有时会让细节立刻改善。微调解码器。如果模型在潜在空间里做SR问题可能出在VAE解码器上。保持扩散模型不变单独微调解码器让它在细节重建上更卖力是一个性价比很高的方案。5.3 推理速度不够时优先优化什么如果你部署时发现TinySR还是太慢按以下顺序排查步数是否过高。15步到20步已经是质量拐点不要盲目堆到30步以上收益微乎其微。Attention是否冗余。低分辨率特征层上的Attention计算量不容小觑如果输入图像的尺寸不大可以尝试降低Attention层的使用范围。是否用上了TensorRT或AITemplate。扩散模型在PyTorch下的Eager模式效率其实不高用TensorRT做图优化后往往能获得2倍以上的加速。是否量化。把UNet的权重量化到FP16或INT8在视觉任务里损失通常可以接受但要注意潜在空间模型对量化误差更敏感。5.4 与“大”扩散模型对比质量损失在哪里轻量级的本质是取舍。和大模型相比TinySR的损失通常在以下几个方面复杂纹理的丰富度大模型能生成更细微、更不重复的纹理轻量模型偶尔会露出重复或过于规律的模式。细节的真实性在一些罕见物体、复杂反射、透明材质等场景轻量模型的先验不足容易生成怪异的“平均纹理”。极端退化的鲁棒性严重模糊加噪声时大模型仍然能通过强先验猜出合理结构轻量模型会倾向于输出模糊结果。但这些差距在真实世界里未必显著。只要退化不是极端到人眼也无法辨认TinySR的输出差异和几百MB大模型相比多数人看不出明显区别。从工程性价比来看我愿意接受这些损失去换回推理速度和部署灵活性。我在实际调TinySR类模型的过程中最大的体会是轻量级扩散模型的难点不在结构设计而在平衡。容量、步数、条件注入强度、损失权重、数据难度分布每一个变量都互相牵制。改一个参数往往要重新跑一轮实验才能确定是否真的更好。如果你打算自己从头训一个类似模型我建议先把数据合成管线做好把基础扩散训练流程跑通再逐步加入损失项和轻量化技巧不要一上来就追求一步到位的完美结构。这个领域变化很快模型结构会被持续刷新但对退化建模的理解、对训练稳定性的把握、对工程部署的敏感度这些底层的经验不会过时。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻