放大一张小图,边缘糊成一片马赛克——这几乎人人遇到过。可换成 AI「变高清」,同一张图却能清楚不少。为什么普通放大越放越糊,AI 又凭什么能补回来?先做个能自己复现的实验:造一张有细线栅格、文字和斜线的图(我用代码合成的测试图),缩到边长的四分之一,再用双三次插值放大回原尺寸,跟原图逐像素比。
我算了两个数:PSNR 和高频能量(相邻像素灰度差的绝对值均值,衡量边缘和纹理还剩多少)。4× 那组,PSNR 只有 17.4 dB,高频能量掉到原图的 20.5%;2× 那组好一些,也就 51.8%。桌面 Chromium 上跑的,数字只对这张图负责,但趋势很稳定:缩小再放大,边缘和细纹大部分回不来了。
回不来的原因不复杂。图缩到四分之一时,那些细线、字的锐边所携带的高频信息,在低分辨率的像素里已经不存在了。插值放大做的事,是在现有像素之间按数学公式填过渡色——它能让边缘看起来平滑,但没法凭空造出原来那条线。丢掉的信息不在图里,插值就变不出来。
超分走的是另一条路
那超分模型凭什么能补?因为它不做插值,它做的是「见过很多真实照片之后的猜测」。
图映这条线上跑的是 Real-ESRGAN、SwinIR 和官方 Real-HAT-GAN 这几个模型。它们在大量「清晰图—退化图」的配对上训练过,学到的是「这种模糊、这种噪声、这种压缩块效应,背后大概率对应什么样的清晰结构」。推理时看到一张糊图,它不是去平滑,而是按学过的规律把可能的结构补上去。所以同样是放大,插值是铺开已有像素,超分是补出新结构——补的这部分,正好是插值丢掉的那 80%。
这里我得说清自己的边界:超分模型不是我做的,我在这个产品里碰的是模型加载和分块推理调度那一层,模型内部怎么补结构,我只能讲到「它是学出来的」这个程度。
分块推理是被内存逼出来的
从加载调度这层能讲的是另一件事:为什么大图不会一次占满内存。
一张几千像素的图整个塞进模型推理,显存和 JS 堆很容易爆,浏览器直接崩给你看。图映的做法是在独立 Worker 里分块:每块按模型自己的窗口大小读一小片,加上四周一圈上下文一起算,但只把中央预测可靠的区域写进最终图,边缘那圈上下文不足的不混回去。每块算完就释放 Tensor 和临时画布,处理完、换图、退出都会终止 Worker。模型文件留在浏览器磁盘缓存里,那是为了下次不用重下,跟「持续占着推理内存」是两回事——这个区分值得讲清楚,不然容易被理解成一直在吃内存。
至于每个模型都校验固定字节数和 SHA-256、校验不过不进推理,这条是加载链路的硬约束:模型文件几十到几百 MB,半路坏一块,推出来的东西没法看,还不如直接拦住。
五档在补什么,以及一条不能越的线
五档不是质量高低排排坐,是补的侧重不同:快速高清给预览用;保真高清偏文字、建筑、线条这类规则结构;老照片完整修复管的是全图层次的恢复;双模型自然精修连续照顾人物和背景两种材质;高阶自然精修单独跑官方 Real-HAT-GAN Sharper,用大有效区加四周上下文裁切拼接,面向高性能桌面,恢复更连续的自然纹理。选哪档,先看你这张图丢的是规则结构还是自然纹理,再看设备扛不扛得住。倍数上,移动端和本来就大的图优先 2×,小图和高性能桌面才上 4×。
最后是那条不能越的线,也是我觉得这个功能最该被讲清楚的地方:超分补出来的细节是模型推测的,不是原图真有的。 它适合视觉增强——图看着更清楚、更舒服;但不能用于证件、司法取证、历史考据或者 OCR 原文核验这类场景,因为那些场景要的是「原图真实是什么」,而模型给的是「大概率是什么」。这两件事在别的地方可以混,在这里不行。已经丢掉的真实细节,没有谁能证明它被准确恢复了,页面上也把这条边界写得很明白。