2x 超分:模型对比与踩过的坑

一批带 alpha 通道的二次元角色素材需要放大到两倍。原本预计是挑一个模型跑一遍的工作量, 实际花了两天,其中大部分时间用在评测方法本身,中途推翻过一次结论。 本文记录试过的模型、遇到的问题,以及最终的选型依据。

环境

模型统一用 spandrel 加载,没有安装 basicsr。 后者与新版 torchvision 和 Python 3.12 的兼容性有问题,而 spandrel 支持 42 种超分架构, 可以直接读 .pth 权重推理。准备的 16 个权重全部加载成功,没有候选因为拿不到权重被跳过。

spandrel 0.4.2 / torch 2.8.0+cu128 / RTX 5080
fp32,分块推理 + 上下文边(丢弃边缘,只保留块的核心)

素材由几百个小块组成,最小的只有 8×5 和 14×3,全部带直通(非预乘)alpha。 尺寸小和带 alpha 这两个特征,是后面大部分问题的来源。

试过的模型

候选架构参数倍率来源
RealESRGAN_x4plus_anime_6BESRGAN 64nf/6nb4.47Mx4Real-ESRGAN release v0.2.2.4
realesr-animevideov3SRVGG轻量x4同上(下载后未采用)
DAT_2_x2 / DAT_2_x4DAT medium11.1Mx2 / x4HF silveroxides/DAT_upscale_models
IllustJaNai_DAT2_x4DAT + 动漫插画微调11.2Mx4HF tomjackson2023/upscale_models
HAT_L_x4HAT large40.9Mx4HF anchuang/HAT-L_SRx4_ImageNet-pretrain
RealHAT_GAN_sharper_x4HAT medium20.8Mx4HF anchuang/Real_HAT_GAN_SRx4_sharper
APISR2x_RRDBESRGAN unshuffle4.47Mx2GitHub Kiteretsu77/APISR
APISR4x_RRDB / _GRL / _DATESRGAN / GRL / DAT4.47 / 1.03 / 10.9Mx4同上
cugan2x_{conservative,no-denoise,denoise1x}RealCUGAN1.28Mx2bilibili/ailab Real-CUGAN
cugan4x_conservativeRealCUGAN1.41Mx4同上
AnimeSharp_x4ESRGAN 23nb16.7Mx4HF Kim2091/AnimeSharp
Remacri_x4ESRGAN 23nb16.7Mx4HF FacehugmanIII/4x_foolhardy_Remacri
LANCZOSx2对照组

Lanczos 这一行是对照组。没有对照组的超分评测不成立,下面第四个问题正是对照组设置不当造成的。

遇到的问题

1. 预乘 alpha 不能直接送进网络

预乘图的半透明边缘像素,RGB 已经被 alpha 压暗。送进网络等于让模型去锐化一批并不存在的边。 正确做法是使用直通 alpha 的母版,RGB 与 alpha 分别过网络(alpha 复制成三通道当灰度图处理), 推理完成后再按运行时约定重新预乘。

2. ESRGAN 会把细弱的 alpha 当噪点抹掉

代价最大的一个问题。第一次跑完之后,最终画面少了四个元素,不是变糊,而是整体变成全透明。

逐块测量 alpha 之后定位到原因:一个 14×3 的小块,原始 alpha 峰值 33/255, 超分后峰值为 0,质量比 0.024。模型把这条接近不可见的线判成了压缩噪点并清除。

处理方式是加一道闸门:每个小块同时计算 SR alpha 与 Lanczos alpha, 只有 SR 的 alpha 质量比落在 [0.95, 1.05] 区间内才采用,否则该块的 alpha 退回 Lanczos, RGB 仍然走网络。180 个小块中有 27 个触发退回。

闸门的第一版是失效的。写回顺序按面积从大到小,那 27 个小块没有机会写入自己的像素。 改成从小到大写入、已写像素不再覆盖之后才真正生效。

3. 先归一化 alpha 再超分是死路

思路是既然模型嫌这一块太淡,就先把它的 alpha 归一化到满量程,超分后再反变换回去。

第一次实现时,量程取在了包含相邻内容的上下文块上。上下文里几乎总有 alpha=255 的像素, 归一化因此退化成恒等变换,最大偏差 3e-5,该轮实验没有产生任何信息。

改成取小块自身的量程重跑:对被抹掉的那条线没有任何改善(0.024 到 0.024), HAT-L 反而明显变差,闸门失败数从 4 涨到 13。

结论是模型删除它的原因不是量程低,而是它的形态接近噪声。这个方向不需要再尝试。

4. 对照组必须与候选走完全相同的边界处理

最初的参照系是把小块紧裁出来后 Lanczos 放大,而候选走的是带 12px 真实上下文进网络、 推理后裁回。仅这一处边界差异,就足以把 180 个小块中的 38 个判成回归, 即使候选本身就是 Lanczos。

改成参照系与候选共用同一个上下文块之后,Lanczos 对照组的锐度、颜色、alpha 三项比值 精确等于 1.000,180 个小块全部判为中性。此后每一处偏离才可以归因到网络。

5. 评分里缺少噪点指标

最初的评分包含三类:收益看锐度(laplacian 方差比 ≥ 2.0),代价看 alpha 覆盖量、明暗和色阶。

问题在于,一个只是把源图已有高频残留放大的模型,这三项都能拿高分。 DAT-2 与 HAT-L 属于这种情况,放大到 9:1 观察,边缘有明显的颗粒和阶梯。

补测 resid = luma − median3x3(luma) 之后,差异才显现:

模型平均 |resid|高幅噪点占画稿像素
Lanczos 对照0.1310.036%
ESRGAN anime6B0.2890.542%
DAT-2 x20.3630.695%

成因也已确认,不是分块推理造成的:整块一次性送进网络,结果与分块一致。 DAT-2 和 HAT-L 是在 bicubic 退化下训练的经典 SR 模型,而源图并非 bicubic 降采样得到, 它们不做去退化,只做锐化,因此把源图自带的编码残留一并放大了。

6. 裁切级的锐度数字不可靠

第一版报告里,脸部裁切的 laplacian 方差从 31 涨到 291,被记为"眼睛收益最大,+845%"。

眼部裁切三格对比:Lanczos 放大 / 超分 / 差分
左为 Lanczos 放大,中为超分结果,右为差分(越黑表示变化越大)

把统计拆到每个元素单独进行之后,结论变了:这部分收益几乎全部来自睫毛线和眉毛这类黑线 (×9.9 至 ×11.5),虹膜本身只有 ×2.5,其中一侧的瞳孔只有 ×1.67。

裁切区域里混有线条,线条一锐化,整块的方差就被拉高。锐度指标需要拆到最小单位再读。

7. 实际被改变的是中间调

按亮度分箱统计整幅画面:

亮度带Lanczos 放大超分变化
250–255(近白)6,510,9306,798,478+4.42%
240–249373,524205,438−45.00%
200–239518,338418,949−19.17%
100–199120,74489,583−25.81%
0–99(暗部)2,951,1252,962,213+0.38%

两端几乎不动,中间三段下降 19% 至 45%。这是对比度提升的典型特征,像素被从过渡带推向两极。

线条方面,"线变细了"这个判断不成立:亮度 <128 的覆盖面积只差 0.18%。 变化发生在最深的部分,<32 的像素减少 8.9%,被抬进 32 至 64 区间。

直接比较超分前后的原图也得到同样结果:浅色被抬高 3.4 至 4.3,深色基本不变 (浅色的脸 +3.63、眼白 +3.43,深色的大衣 +0.25、深色的武器 −0.32)。 因此脸、眼白、高光这些最浅的区域,损失了原本就很微弱的明暗分离。

8. 羽化带宽度不随图像放大

统计 8 < alpha < 247 的像素占有覆盖像素的比例:原图 8.114%,2x 超分后 4.410%, 相对柔度比 0.543。比值 1.00 表示羽化带随图像一同放大(Lanczos 的行为), 0.50 表示羽化带保持原有的像素宽度。

实测值说明超分把软边固定在了约 1px。同一个机制在不同素材上后果相反: 硬轮廓(武器、手指、发丝)因此受益,而本应保持柔和的元素 (加色光晕、腮红、柔光阴影)失去了过渡。

9. x4 后降采样与 native x2 的差别不是主因

模型路线240–249 亮度带
ESRGAN anime6Bx4 → Lanczos 缩半−54.2%
DAT-2x4 → Lanczos 缩半−11.4%
DAT-2native x2−10.7%
APISR RRDBnative x2−39.8%
Real-CUGAN conservativenative x2−6.8%

同一路线下跨模型可以差 5 倍,同一模型跨路线只差 0.7 个百分点。决定结果的是模型,不是路线。

10. RGB 与 alpha 可以完全解耦

素材存的是直通 alpha,两条通路互不影响,任何模型的 alpha 都可以配任何模型的 RGB。

这一点后来改变了整个方案。把 DAT-2 的 alpha 接到 ESRGAN 的 RGB 上, 闸门失败数从 27 降到 3,细弱小块的保留数从 7/26 升到 23/26,RGB 侧不受任何影响。

排名

修正对照组、补上噪点指标之后重跑,按回归数升序、纯改善数降序排列(节选):

候选架构倍率回归纯改善闸门失败240s 带噪点
Lanczos(对照)x20013+0.01.00
IllustJaNai_DAT2_x4DATx4→L1417−13.63.06
DAT2_x4DATx4→L2434−11.44.24
HAT_L_x4HATx4→L2364−9.74.80
DAT2_x2DATx23413−10.74.36
APISR2x_RRDBESRGANx243747−39.82.65
cugan4x_conservativeRealCUGANx4→L42915−7.82.31
AnimeSharp_x4ESRGANx4→L4186−28.02.74
ESRGAN_anime6B_x4ESRGANx4→L4125−54.22.98
cugan2x_conservativeRealCUGANx251526−6.81.97
RealHAT_GAN_sharper_x4HATx4→L12741−31.12.68

各候选的具体问题:

  • APISR(四个变体):锐度最高,但它在重画线条。虹膜暗环被压到 22/255,墨量翻倍; 平坦区局部对比度达到 Lanczos 的 11.8 倍,出现明显振铃;alpha 是全场最差的一档。 它声称针对手绘线条的退化建模,实测行为是强化重绘而非保真。
  • HAT-L:保真类指标表现好,噪点是全场最高。
  • Real-CUGAN conservative:噪点最低,中间调保持最好,但放大幅度很小, 眼部锐度只有 ×1.61。它的保真来自于几乎没有改动图像。开启去噪后行为与 ESRGAN 一致,同样推白。
  • RealHAT_GAN_sharper:12 个回归,眼部锐度比 0.33,眼睛被模糊掉。
  • AnimeSharp / Remacri:干净但收益有限,中间调下降 24% 至 28%,没有选择理由。
睫毛与瞳孔的三方对比:Lanczos / ESRGAN / DAT-2
8:1 放大。左为 Lanczos 参照,中为 ESRGAN,右为 DAT-2。ESRGAN 将眼白的淡灰层抹成纯白,虹膜周围的暗环同时消失。

按这套指标,DAT-2 native x2 排第一:89 个元素中有 78 个属于纯改善(ESRGAN 为 11 个), 掉色阶的元素从 65 个降到 3 个,颜色比几何均值 1.095,高于 Lanczos, 说明它在放大过程中解析出了更多层次,而不是生成色块。

结论的修正

目视对比中我始终认为 ESRGAN 的线条重建质量明显更好,与上述排名不符。 换一批素材、改变测量层级后重新测量,结果是在最终合成画面上, ESRGAN 的锐度高出 13% 至 36%,同时噪点更低,三组素材、两项指标全部占优,与前面的排名相反。

场景素材的三方对比:原图 / DAT-2 / ESRGAN
左为原图,中为 DAT-2,右为 ESRGAN。标注依次为 lapvar、颜色数、噪点。

两次测量都没有出错,差异来自三处:

  1. 测量层级不同。 前一套排名测的是每个元素单独裁切、透明底的结果, 这次测的是最终合成画面。两者的判定一致率只有 75%。
  2. 素材类型不同。 前者是角色线稿,后者接近照片的场景图。 ESRGAN 的 anime 权重在这两类内容上的行为差别很大。
  3. ESRGAN 的主要缺陷被绕开了。 这一轮 alpha 走 DAT-2 供体(见第 10 条), 闸门在 646 个小块中只触发 3 次。它在第一次评测里失分最多的那一项已经不在链路中。

这里的结论不是目视判断优于量化指标,而是第一次测量的对象与实际用途不匹配。 那套优先级排序服务于"作为后续加工的源素材",而不是"直接渲染的成品", 用途改变之后,排序随之改变。

GAN 的行为是重建而非保真

亚像素文字的三格对比,超分后字形被改写
6 倍最近邻放大。左为 Lanczos,中为超分结果,右为差分。末尾的 A 变成实心楔形,R 的腿被重新绘制。

上图是一处亚像素文字。左侧是可辨认的模糊字形,中间笔画变干净,但字形被改写: 末尾的 A 变成一个实心楔形,R 的腿也被重新绘制。深色像素数增加 13.6%, 即笔画被加粗并重新造型。这是 GAN 在亚像素文字上的典型行为, 且分辨率提高之后更容易被识别为伪造。

量化结果一致:将 2x 结果缩回原尺寸后与真实原图比较,PSNR 只有 27 至 35 dB, DAT-2 为 40 至 50 dB。模型确实改写了原图。

结论

不存在通用意义上最好的超分模型,只有对特定测量层级、特定素材类型和特定用途最合适的模型。

四个候选的定位:

  • RealESRGAN anime6B:线条重建能力最强,噪点低。代价是中间调损失明显 (240–249 亮度带 −45%)、会把细弱 alpha 当噪点清除、对亚像素文字产生幻觉。 适合直接呈现给人看的成品。
  • DAT-2 x2:色阶保持最好(掉色阶从 65 降到 3),alpha 全程稳定,没有元素被清除。 代价是边缘噪点比 ESRGAN 高 28%。适合作为后续加工的源素材。
  • Real-CUGAN conservative:最保守,收益也最小。需要确保不出问题时可以选择。
  • APISR:锐度最高,但行为是重绘而非保真。用于成品放大可行,用作源素材不可行。

最终采用的是混合方案,RGB 走 ESRGAN,alpha 走 DAT-2 供体。 这不是折中的结果,而是两条通路本来就互不影响,两个模型各自的优势恰好落在不同通路上。

方法上有几点适用于其他类似的评测:

  1. 设置 Lanczos 对照组,并保证它与候选走完全相同的预处理。
  2. 先确定测量层级,是单个元素还是最终画面。这一步选错会导致后续全部结论失效。
  3. 锐度指标拆到最小单位再读,裁切级的数字会被其中的线条带偏。
  4. 评分中加入噪点指标。只奖励锐度的评分会把放大源图噪声的模型排到前面。
  5. 带 alpha 的素材,RGB 与 alpha 分开处理、分别选型。