论文信息

  • 标题:Scaling Up to Excellence: Practicing Model Scaling for Photo-Realistic Image Restoration In the Wild
  • 会议:arXiv 2024
  • 单位:中国科学院深圳先进技术研究院、上海人工智能实验室、香港理工大学、腾讯PCG ARC Lab、香港中文大学
  • 代码:https://github.com/XPixelGroup/SUPIR
  • 论文:https://arxiv.org/pdf/2401.13627

一、开篇:图像恢复的"不可能三角"与SUPIR的破局之道

你是否有过这样的经历:翻出一张珍贵的老照片,却发现它模糊不清、满是噪点;截了一张视频里的关键帧,却因为分辨率太低看不清细节;拍了一张夜景照片,却因为光线太暗变成了"马赛克"?这些都是图像恢复(Image Restoration, IR) 任务要解决的问题。

长期以来,图像恢复领域一直面临着一个"不可能三角":

  • 通用性:能否同时处理模糊、噪声、低分辨率、压缩失真等多种未知退化?
  • 真实性:恢复的图像是否自然逼真,没有人工痕迹?
  • 保真度:是否严格保留原始图像的内容和结构,不"脑补"不存在的东西?

传统方法要么只能处理特定类型的退化(比如专门去高斯模糊的模型遇到运动模糊就歇菜),要么恢复的图像看起来像"油画"一样假,要么为了保真度牺牲了细节质量。直到SUPIR(Scaling-UP Image Restoration)的出现,它把大语言模型领域验证过的"模型缩放"定律引入图像恢复,用26亿参数的SDXL作为生成先验,搭配2000万张高质量图文训练数据,一举打破了这个不可能三角。

更厉害的是,SUPIR还支持文本可控恢复——你可以用文字告诉它"把远处的自行车修清楚"、“给这个人戴上牛仔帽”、“把年轻人变成老人”,它就能精准地按照你的要求调整恢复结果。

二、SUPIR核心思想:用大模型缩放解锁图像恢复的新边界

SUPIR的核心思想非常清晰:用最大规模的生成先验+最大规模的训练数据+针对性的工程优化,打造一个通用、真实、保真的图像恢复模型

通俗解释:生成先验就像一个见过数十亿张高清图像的"超级画家",它知道真实世界里的猫应该有什么样的毛发纹理,汽车应该有什么样的反光,人脸应该有什么样的五官比例。SUPIR把这个"超级画家"(SDXL)拿过来,然后教它如何根据低质量图像来"重画"出高清版本。
在这里插入图片描述

图1 SUPIR核心能力展示(出处:原论文图1)

  • 图1(a)展示了SUPIR在真实世界低质量图像上的惊人恢复效果,无论是模糊的动物、噪点满满的风景还是压缩失真的建筑,都能恢复出清晰自然的细节
  • 图1(b)展示了SUPIR的文本可控恢复能力,可以指定恢复远处的模糊物体、调整物体材质、修改高层语义属性

三、SUPIR关键技术详解

3.1 整体架构

在这里插入图片描述

图2 SUPIR整体工作流(出处:原论文图2)

SUPIR的整体架构由四个核心模块组成:

  1. 退化鲁棒编码器:把低质量图像转换成和SDXL兼容的隐空间特征
  2. 多模态大语言模型(LLaVA):自动分析低质量图像的内容,生成详细的文本描述作为引导prompt
  3. 裁剪版ControlNet+ZeroSFT连接器:控制SDXL的生成过程,让它严格遵循低质量图像的结构
  4. 带恢复引导的EDM采样器:在生成过程中平衡保真度和真实性

3.2 退化鲁棒编码器:让模型看懂低质量图像

SDXL原本是用来生成高清图像的,它的编码器只见过高质量图像。如果直接用它来编码低质量图像,模型会把噪声、模糊这些退化当成图像本身的内容,导致恢复结果出现奇怪的 artifacts。

为了解决这个问题,SUPIR对SDXL的编码器进行了微调,目标是让低质量图像和对应的高质量图像经过编码器后,解码出来的结果尽可能接近。

核心损失函数
LE=∥D(Edr(xLQ))−D(Edr(xGT))∥22L_E = \|D(E_{dr}(x_{LQ})) - D(E_{dr}(x_{GT}))\|_2^2LE=D(Edr(xLQ))D(Edr(xGT))22

公式中每个符号的含义:

  • LEL_ELE:编码器的损失值,越小越好
  • DDD:SDXL固定的解码器,用来把隐空间特征转换成图像
  • EdrE_{dr}Edr:我们要微调的退化鲁棒编码器
  • xLQx_{LQ}xLQ:输入的低质量图像
  • xGTx_{GT}xGT:对应的高质量真实图像
  • ∥⋅∥22\|\cdot\|_2^222:L2范数,计算两个图像之间的像素差

通俗解释:这个公式就像在教编码器"透过现象看本质"——不管图像有多模糊、有多少噪点,你都要提取出和高清图像一样的核心内容特征。

3.3 大规模适配器设计:驯服26亿参数的SDXL

有了强大的生成先验(SDXL),我们还需要一个适配器来引导它完成图像恢复任务。现有的适配器方案都有各自的问题:

  • LoRA:参数量太少,无法精确控制像素级的恢复
  • T2I适配器:能力不足,无法准确识别低质量图像的内容
  • 原版ControlNet:参数量太大,和SDXL一起训练需要的计算资源无法承受

SUPIR设计了一个全新的适配器,完美解决了这些问题:

  1. 裁剪版ControlNet:保留ControlNet的高层设计,但把每个编码器块里的ViT块砍掉一半,参数量减少50%,同时保留了核心的控制能力
  2. ZeroSFT连接器:在ControlNet的零卷积基础上,增加了空间特征转移(SFT)和组归一化操作,大幅增强了对SDXL的控制精度

在这里插入图片描述

图3 适配器架构设计(出处:原论文图3)

  • 图3(a):整体适配器架构,基于裁剪后的ControlNet
  • 图3(b):裁剪后的编码器块,每个块只保留一半的ViT块
  • 图3©:ZeroSFT连接器结构,比传统零卷积多了特征融合和归一化步骤

3.4 训练数据缩放:2000万张高质量图文数据集

模型缩放的同时,训练数据也必须同步缩放。SUPIR收集了目前最大规模的图像恢复训练数据集:

  • 2000万张1024×1024分辨率的高质量、纹理丰富的通用图像
  • 7万张未对齐的高分辨率人脸图像,专门提升人脸恢复效果
  • 10万张负质量样本图像,用来支持负prompt功能
    在这里插入图片描述

图4 数据集规模对比(出处:原论文图5(a))

  • 横轴是像素总数(对数刻度),纵轴是不同数据集
  • SUPIR的数据集不仅规模巨大,而且质量远高于ImageNet、LAION-5B等通用数据集,每个图像都配有详细的文本描述

3.5 多模态语言引导:让模型"理解"它在恢复什么

SUPIR最大的创新之一就是把文本模态引入了图像恢复。它使用130亿参数的LLaVA多模态大模型,自动分析低质量图像的内容,生成详细的文本描述作为引导prompt。

这样做有三个好处:

  1. 显式地告诉模型图像里有什么,帮助模型更准确地恢复缺失的细节
  2. 支持用户手动修改prompt,实现可控恢复
  3. 可以通过文本描述指定输出图像的质量风格

自动生成的prompt示例

“The image features a close-up of a white and gray cat sitting on a wooden surface. The cat’s fur is fluffy, and its eyes are wide open, with its front paws resting on the wooden surface. cinematic, High Contrast, highly detailed, unreal engine, taken using a Canon EOS R camera, hyper detailed photo-realistic maximum detail, 32k, Color Grading, ultra HD”

3.6 负质量样本与负prompt:让模型知道"不要生成什么"

扩散模型的Classifier-Free Guidance(CFG)技术允许我们通过负prompt来指定模型不要生成的内容。SUPIR利用这个特性,用负prompt来告诉模型"不要生成低质量的图像"。

CFG核心公式
zt−1pos=H(zt,zLQ,σt,pos)z_{t-1}^{pos} = \mathcal{H}(z_t, z_{LQ}, \sigma_t, pos)zt1pos=H(zt,zLQ,σt,pos)
zt−1neg=H(zt,zLQ,σt,neg)z_{t-1}^{neg} = \mathcal{H}(z_t, z_{LQ}, \sigma_t, neg)zt1neg=H(zt,zLQ,σt,neg)
zt−1=zt−1pos+λcfg×(zt−1pos−zt−1neg)z_{t-1} = z_{t-1}^{pos} + \lambda_{cfg} \times (z_{t-1}^{pos} - z_{t-1}^{neg})zt1=zt1pos+λcfg×(zt1poszt1neg)

公式中每个符号的含义:

  • zt−1z_{t-1}zt1:最终的去噪结果
  • zt−1posz_{t-1}^{pos}zt1pos:使用正prompt预测的去噪结果
  • zt−1negz_{t-1}^{neg}zt1neg:使用负prompt预测的去噪结果
  • H\mathcal{H}H:带适配器的扩散模型
  • ztz_tzt:当前时间步的带噪隐空间特征
  • zLQz_{LQ}zLQ:低质量图像的隐空间特征
  • σt\sigma_tσt:当前时间步的噪声方差
  • pospospos:正prompt,描述高质量图像
  • negnegneg:负prompt,描述低质量图像(如"模糊、噪点、低分辨率、变形")
  • λcfg\lambda_{cfg}λcfg:CFG引导强度,越大越遵循prompt

常用负prompt

“oil painting, cartoon, blur, dirty, messy, low quality, deformation, low resolution, oversmooth”

但是,如果训练数据里没有低质量图像,模型根本不知道"模糊"、"噪点"是什么意思,使用负prompt反而会引入 artifacts。所以SUPIR反其道而行之,用SDXL生成了10万张对应负prompt的低质量图像,加入训练数据,让模型学会识别这些负质量概念。
在这里插入图片描述

图5 负样本训练的效果(出处:原论文图4)

  • 左图:没有加入负样本训练时,使用负prompt会引入奇怪的 artifacts
  • 右图:加入负样本训练后,使用负prompt能显著提升图像质量

3.7 恢复引导采样:平衡保真度与真实性

强大的生成先验是一把双刃剑——它能生成非常逼真的细节,但也容易"脑补"出原始图像中不存在的内容,导致恢复结果失真。

为了解决这个问题,SUPIR修改了EDM采样算法,提出了恢复引导采样(Restoration-Guided Sampling)。它的核心思想是:

  • 在扩散的早期阶段(生成低频结构),让生成结果更贴近低质量图像,保证整体结构的保真度
  • 在扩散的后期阶段(生成高频细节),放开限制,让模型自由生成逼真的纹理细节

核心加权公式
kt=(σt/σT)τrk_t = (\sigma_t / \sigma_T)^{\tau_r}kt=(σt/σT)τr
zt−1=z^t−1+kt×(zLQ−z^t−1)z_{t-1} = \hat{z}_{t-1} + k_t \times (z_{LQ} - \hat{z}_{t-1})zt1=z^t1+kt×(zLQz^t1)

公式中每个符号的含义:

  • ktk_tkt:当前时间步的恢复引导权重
  • σt\sigma_tσt:当前时间步的噪声方差
  • σT\sigma_TσT:初始时间步的最大噪声方差
  • τr\tau_rτr:恢复引导强度超参数,是整个算法的关键
  • z^t−1\hat{z}_{t-1}z^t1:扩散模型预测的原始去噪结果
  • zLQz_{LQ}zLQ:低质量图像的隐空间特征
  • zt−1z_{t-1}zt1:最终的恢复引导去噪结果

通俗解释:τr\tau_rτr就像一个"保真度旋钮":

  • τr\tau_rτr很小时(如0.5),ktk_tkt很大,生成结果会非常贴近低质量图像,保真度高但细节少,图像会比较模糊
  • τr\tau_rτr很大时(如6),ktk_tkt很小,生成结果会非常自由,细节丰富但可能失真
  • 论文中选择τr=4\tau_r=4τr=4作为默认值,在保真度和真实性之间取得了最佳平衡

在这里插入图片描述

图6 恢复引导采样机制(出处:原论文图5(b))

  • 蓝色点是低质量图像的隐空间特征zLQz_{LQ}zLQ
  • 橙色点是扩散模型预测的原始去噪结果z^t−1\hat{z}_{t-1}z^t1
  • 绿色点是恢复引导后的最终结果zt−1z_{t-1}zt1
  • 早期阶段(大σt\sigma_tσt)更靠近zLQz_{LQ}zLQ,后期阶段(小σt\sigma_tσt)更靠近z^t−1\hat{z}_{t-1}z^t1

四、实验结果与分析

4.1 训练与测试设置

  • 训练资源:64张Nvidia A6000 GPU,训练10天,batch size=256
  • 优化器:AdamW,学习率=1e-5
  • 测试参数:采样步数T=100,CFG强度λcfg=7.5\lambda_{cfg}=7.5λcfg=7.5,恢复引导强度τr=4\tau_r=4τr=4
  • 处理分辨率:支持1024×1024分辨率的图像

4.2 定量对比

SUPIR在5种典型退化场景下与当前最先进的方法进行了对比,包括BSRGAN、Real-ESRGAN、StableSR、DiffBIR和PASD。

表1 合成数据定量对比(出处:原论文表1)

退化类型 方法 PSNR ↑ SSIM ↑ LPIPS ↓ ManIQA ↑ ClipIQA ↑ MUSIQ ↑
4倍超分 BSRGAN 25.06 0.6741 0.2159 0.2214 0.6169 70.38
Real-ESRGAN 24.26 0.6657 0.2116 0.2287 0.5884 69.51
StableSR 22.59 0.6019 0.2130 0.3304 0.7520 72.94
DiffBIR 23.44 0.5841 0.2337 0.2879 0.7147 71.64
PASD 24.90 0.6653 0.1893 0.2607 0.6466 71.39
SUPIR (ours) 22.66 0.5763 0.2662 0.4738 0.8049 73.83

结果分析

  • SUPIR在所有无参考质量指标(ManIQA、ClipIQA、MUSIQ)上都取得了压倒性的第一,说明它生成的图像视觉质量最好
  • SUPIR在全参考指标(PSNR、SSIM、LPIPS)上表现不佳,这是因为全参考指标是逐像素计算差异的,而生成式恢复方法会生成更自然的纹理,这些纹理和原始高清图像的像素并不完全一致,但人眼看起来更舒服

表2 真实世界数据定量对比(出处:原论文表2(a))

指标 BSRGAN Real-ESRGAN StableSR DiffBIR PASD SUPIR (ours)
CLIP-IQA ↑ 0.4119 0.5174 0.7654 0.6983 0.7714 0.8232
MUSIQ ↑ 55.64 59.42 70.70 69.69 71.87 73.00
MANIQA ↑ 0.1585 0.2262 0.3035 0.2619 0.3169 0.4295

结果分析

  • 在真实世界低质量图像上,SUPIR的优势更加明显,所有无参考指标都大幅领先第二名
  • 这说明SUPIR的泛化能力极强,能够处理真实世界中各种复杂的未知退化

4.3 用户研究

为了验证人眼对恢复结果的偏好,论文进行了一项用户研究,邀请20名参与者从5种方法的恢复结果中选择质量最高的一个。
在这里插入图片描述

图7 用户研究结果(出处:原论文图8(b))

  • SUPIR获得了**84.17%**的选票,远远超过第二名PASD的10.58%
  • 这充分证明了SUPIR生成的图像在人眼看来是质量最高的

4.4 定性对比

在这里插入图片描述

图8 不同方法定性对比(出处:原论文图6)

  • 第一行:低质量输入
  • 第二行:Real-ESRGAN结果,细节模糊,有明显的人工痕迹
  • 第三行:StableSR结果,细节有所提升,但仍然不够自然
  • 第四行:DiffBIR结果,纹理比较真实,但结构有轻微失真
  • 第五行:PASD结果,效果不错,但细节不如SUPIR丰富
  • 第六行:SUPIR结果,纹理清晰自然,结构准确,几乎看不出是恢复出来的图像

4.5 文本可控恢复

在这里插入图片描述

图9 文本可控恢复示例(出处:原论文图1(b))

  • 第一行:可以指定恢复远处模糊的自行车
  • 第二行:可以调整帽子的材质(麂皮帽→牛仔帽)
  • 第三行:可以修改人物的年龄(年轻人→老人)

在这里插入图片描述

图10 负prompt效果(出处:原论文图11(a))

  • 左列:没有使用负prompt的结果,图像比较模糊,细节不够清晰
  • 右列:使用负prompt的结果,图像变得更加清晰锐利,细节丰富
    在这里插入图片描述

图11 prompt一致性验证(出处:原论文图11(b))

  • 当输入的prompt和低质量图像内容不符时(比如原图是海滩,prompt说"一些人在海滩上",但原图没有人),SUPIR不会生成不存在的内容
  • 这保证了恢复结果的保真度,避免了"无中生有"的问题

4.6 消融实验

4.6.1 正负prompt与负样本的影响

表3 prompt与负样本消融实验(出处:原论文表2(b))

负样本 正prompt 负prompt PSNR ↑ SSIM ↑ LPIPS ↓ ManIQA ↑ ClipIQA ↑ MUSIQ ↑
22.90 0.5519 0.3010 0.3129 0.7049 68.94
22.31 0.5250 0.3108 0.4018 0.7937 72.00
20.63 0.4747 0.3603 0.4678 0.7933 73.60
20.66 0.4763 0.3412 0.4740 0.8164 73.66

结果分析

  • 单独使用正prompt或负prompt都能显著提升图像质量
  • 同时使用正prompt和负prompt能取得最佳效果
  • 如果没有加入负样本训练,正负prompt都无法发挥作用
4.6.2 ZeroSFT连接器的效果

表4 ZeroSFT连接器消融实验(出处:原论文表2©)

连接器 PSNR ↑ SSIM ↑ LPIPS ↓ ManIQA ↑ ClipIQA ↑ MUSIQ ↑
零卷积 19.47 0.4261 0.3969 0.4845 0.8184 74.00
ZeroSFT 20.66 0.4763 0.3412 0.4740 0.8164 73.66

结果分析

  • ZeroSFT连接器在全参考指标上大幅优于传统的零卷积,说明它能更好地保证恢复结果的保真度
  • 两者在无参考指标上表现接近,说明ZeroSFT没有牺牲图像的视觉质量
4.6.3 数据集规模的影响

在这里插入图片描述

图12 不同数据集规模的恢复效果(出处:原论文图12)

  • 左列:低质量输入
  • 第二列:在DIV2K数据集上训练的结果,细节非常少,图像模糊
  • 第三列:在LSDIR数据集上训练的结果,细节有所提升,但仍然不够丰富
  • 第四列:在SUPIR 2000万张数据集上训练的结果,细节清晰自然,效果最好

结果分析

  • 训练数据的规模和质量对生成式恢复模型的效果有决定性影响
  • 只有使用大规模高质量的训练数据,才能充分发挥大模型的生成能力
4.6.4 恢复引导强度τr\tau_rτr的影响

在这里插入图片描述

图13 不同τr\tau_rτr值的恢复效果(出处:原论文图13)

  • 左列:低质量输入
  • 第二列:τr=0.5\tau_r=0.5τr=0.5,图像非常模糊,保真度高但细节少
  • 第三列:τr=3\tau_r=3τr=3,效果较好,平衡了保真度和真实性
  • 第四列:τr=6\tau_r=6τr=6,细节非常丰富,但有一些不真实的纹理,保真度较低

五、核心代码实现

以下是SUPIR的简化推理代码,基于官方实现:

import torch
import numpy as np
from PIL import Image
from transformers import AutoProcessor, AutoModelForVision2Seq
from diffusers import StableDiffusionXLPipeline, ControlNetModel
from supir import SUPIRModel, DegradationRobustEncoder

# 设备设置
device = "cuda" if torch.cuda.is_available() else "cpu"

# 1. 加载模型组件
# 退化鲁棒编码器
dr_encoder = DegradationRobustEncoder.from_pretrained(
    "xpixelgroup/supir-dr-encoder",
    torch_dtype=torch.float16
).to(device)

# ControlNet适配器
controlnet = ControlNetModel.from_pretrained(
    "xpixelgroup/supir-controlnet",
    torch_dtype=torch.float16
).to(device)

# SDXL基础模型
pipe = StableDiffusionXLPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    controlnet=controlnet,
    torch_dtype=torch.float16
).to(device)

# LLaVA多模态模型,用于自动生成prompt
llava_processor = AutoProcessor.from_pretrained("llava-hf/llava-1.5-13b-hf")
llava_model = AutoModelForVision2Seq.from_pretrained(
    "llava-hf/llava-1.5-13b-hf",
    torch_dtype=torch.float16
).to(device)

# 2. 加载低质量图像
def load_image(image_path):
    image = Image.open(image_path).convert("RGB")
    # 调整短边到1024像素
    width, height = image.size
    if width < height:
        new_width = 1024
        new_height = int(height * (1024 / width))
    else:
        new_height = 1024
        new_width = int(width * (1024 / height))
    image = image.resize((new_width, new_height), Image.Resampling.LANCZOS)
    return image

# 3. 自动生成prompt
def generate_prompt(image):
    prompt = "USER: <image>\nDescribe this image and its style in a very detailed manner.\nASSISTANT:"
    inputs = llava_processor(text=prompt, images=image, return_tensors="pt").to(device)
    outputs = llava_model.generate(**inputs, max_new_tokens=200)
    image_description = llava_processor.decode(outputs[0], skip_special_tokens=True).split("ASSISTANT:")[-1].strip()
    
    # 添加质量描述
    quality_prompt = "cinematic, High Contrast, highly detailed, unreal engine, taken using a Canon EOS R camera, hyper detailed photo-realistic maximum detail, 32k, Color Grading, ultra HD, extreme meticulous detailing, skin pore detailing, hyper sharpness, perfect without deformations, Unreal Engine 5, 4k render"
    full_prompt = f"{image_description}, {quality_prompt}"
    return full_prompt

# 4. SUPIR推理
def supir_restore(image_path, positive_prompt=None, negative_prompt=None, tau_r=4.0, cfg_scale=7.5):
    # 加载图像
    lq_image = load_image(image_path)
    
    # 自动生成prompt
    if positive_prompt is None:
        positive_prompt = generate_prompt(lq_image)
    
    # 默认负prompt
    if negative_prompt is None:
        negative_prompt = "oil painting, cartoon, blur, dirty, messy, low quality, deformation, low resolution, oversmooth"
    
    # 编码低质量图像到隐空间
    lq_tensor = torch.from_numpy(np.array(lq_image)).permute(2, 0, 1).unsqueeze(0).float() / 127.5 - 1.0
    lq_tensor = lq_tensor.to(device, dtype=torch.float16)
    z_lq = dr_encoder(lq_tensor)
    
    # 恢复引导采样
    restored_image = pipe(
        prompt=positive_prompt,
        negative_prompt=negative_prompt,
        controlnet_conditioning_scale=1.0,
        image=z_lq,
        num_inference_steps=100,
        guidance_scale=cfg_scale,
        restoration_guidance_strength=tau_r,
        output_type="pil"
    ).images[0]
    
    return restored_image

# 5. 运行示例
if __name__ == "__main__":
    # 恢复一张低质量图像
    restored_image = supir_restore(
        image_path="low_quality_image.jpg",
        tau_r=4.0,
        cfg_scale=7.5
    )
    restored_image.save("restored_image.jpg")
    print("图像恢复完成,已保存为restored_image.jpg")

六、结论与展望

SUPIR通过将大模型缩放引入图像恢复领域,证明了模型缩放是提升图像恢复效果的有效途径。它的主要贡献包括:

  1. 首次将26亿参数的SDXL作为生成先验用于图像恢复,打造了目前最大规模的图像恢复模型
  2. 设计了裁剪版ControlNet+ZeroSFT连接器,高效地控制大模型完成恢复任务
  3. 收集了2000万张高质量图文数据集,为大模型训练提供了充足的数据支持
  4. 引入多模态语言引导,实现了文本可控的图像恢复
  5. 提出了恢复引导采样方法,解决了生成式恢复的保真度问题

未来,SUPIR可以在以下方向进一步改进:

  • 进一步扩大模型规模,探索更大参数的生成先验
  • 优化推理速度,降低计算资源需求
  • 支持视频恢复任务
  • 探索弱监督和无监督的训练方法,减少对高质量数据的依赖
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐