GGT-100K: Generative Ground Truth for Generalizable Real-World Image Restoration

GGT-100K 数据集总览:规模、退化分布、来源构成与下游增益
Fig. 1 — GGT-100K 一览。规模:103K 训练对 + 500 测试对,统一 1024×1024。退化类型:通用混合 / 雨 / 雾 / 雪 / 低光 / 老照片。数据来源:已有数据集 50.1%、互联网 39.5%、自采 10.4%。构造流程:真实 LQ → 模型选择 → 生成 HQ → 处理 → 过滤。右侧柱状图显示用 GGT-100K 训练后,NAFNet/FoundIR/FLUX-ControlNet/Qwen-Image-Edit 在 PSNR、MUSIQ、VLM-R 上的提升。(论文 Fig. 1)

1. 出发点 (Motivation)

真实世界图像修复(real-world image restoration, IR)的目标是把现实里被「复杂、混合、未知」退化糟蹋过的照片复原。和经典 IR(只处理单一已知退化,如去噪/去模糊/超分)不同,真实场景里一张照片往往同时叠加了噪声、模糊、压缩、雨雾、低光……

挡在所有真实 IR 模型面前的不是网络结构,而是没有成对训练数据。现有两条造数据的路都走不通:

核心矛盾是:真实 LQ 图很容易拿到(满世界都是烂照片),但它对应的「干净参考图」(ground truth)根本不存在——那个干净场景在拍摄的瞬间就已经不可复现了。

GGT-100K 的破题点很直接:既然真实 GT 拿不到,那就用生成式多模态大模型(MFM)「生成」一张当 GT。现代 MFM(Nano-Banana-2、GPT-Image-2、Qwen-Image-Edit 等)能吃「图 + 指令」吐出想要的图,理论上可以给一张真实 LQ「画」出它的高质量版本,当作监督用的 Generative Ground Truth(GGT)。

但这事不 trivial:MFM 会扭曲结构、幻觉细节、对提示极度敏感、跨图行为不稳。论文要回答的关键问题是——MFM 生成的目标图,保真度和稳定性够不够格当真实 IR 的监督信号? 答案是:选对模型 + 选对提示 + 加上严格质控,就够格。

2. 方法 (Method)

这是一篇数据集论文,"方法"是一条数据构造流水线,而非一个网络。只有一个正式公式(MFM 评测打分),核心价值在流程设计。

GGT-100K 四阶段构造流水线
Fig. 3 — 四阶段构造流水线:① 源图收集(真实 LQ,来自已有数据集/互联网/自采)→ ② 系统评测 MFM(9 个候选模型 × 固定/自适应提示,按保真+感知+VLM+人工四维联合打分)→ ③ 目标生成(用胜出的 Nano-Banana-2 + Gemini 提示批量生成候选 HQ)→ ④ 多级质控(指标过滤 → VLM 复检改写 → 人工验收)。(论文 Fig. 3)

2.1 第一步:收集真实 LQ 源图

故意挑「没有 GT 参考、且现有成对数据集没覆盖」的退化图,以扩展泛化边界。三个来源:已有的无参考修复数据集 + 含恶劣天气的视觉数据集;带版权许可的网络爬取;自己用不同相机/手机采的(涵盖模糊、噪声、低光)。全部归一化到 1024×1024,涵盖通用混合、雨、雾、雪、低光、老照片六类。论文特别强调:这些类别不是孤立的单退化——雨天图同时还带模糊、噪声、压缩等真实摄影中常见的耦合退化。

2.2 第二步:系统评测 9 个 MFM(核心实证)

模型和提示是耦合的,必须联合评测。候选 = 3 个开源(FireRed-1.1、Qwen-Image-Edit-2511、FLUX.2-dev)+ 6 个闭源(Kling-Image-O1、Seedream-5.0、GPT-Image-1.5、GPT-Image-2、Nano-Banana-Pro、Nano-Banana-2)。提示策略 4 种:固定提示、固定提示+"别改内容"(Fix-NC)、GPT-5.4 自适应提示、Gemini-3.1 自适应提示(自适应 = 先让 VLM 分析图的内容和退化,再生成针对性指令)。

评测四个互补维度,并用 min-max 归一化后取平均得到总分:

\[\tilde{m}_{i,j} = \frac{m_{i,j} - m_j^{\min}}{m_j^{\max} - m_j^{\min}}, \quad s_i^a = \frac{1}{|\mathcal{M}^a|}\sum_{j\in\mathcal{M}^a}\tilde{m}_{i,j}, \quad \text{Avg.}_i = \frac{1}{3}\left(s_i^{\text{fid}} + s_i^{\text{per}} + s_i^{\text{vlm}}\right). \tag{1}\]

—— 翻译:第 $i$ 个「模型-提示」组合在第 $j$ 个指标上的原始分 $m_{i,j}$,先按该指标的全局最大最小值拉到 [0,1](消除不同指标量纲差异),得到 $\tilde{m}_{i,j}$;再在每个维度内(保真 fid / 感知 per / VLM)把归一化分求平均得维度分 $s_i^a$;最后三个维度分再平均得总分。第四维「人工偏好」单独做用户研究统计,不进这个公式。

结论:Nano-Banana-2 + Gemini 自适应提示最均衡——Avg. 0.84(最高)、人工偏好 32.5%(最高)。它不在每个单项夺冠,但四个维度都强且稳。对比之下:Qwen-Image-Edit/Kling 保真高但感知保守;GPT-Image 系列/FireRed 感知好但保真差、爱改内容。同一个模型换提示差别巨大:Nano-Banana-2 从固定提示 0.76 → Gemini 自适应 0.84。

2.3 第三、四步:批量生成 + 三级质控

用选定的 Nano-Banana-2 + Gemini 提示批量生成候选 GT,再过三道质控(这是数据可靠性的关键):

  1. 指标过滤(Metric-based Filtering):对每对 LQ 和生成 HQ 比无参考指标,几乎没提升甚至变差的直接判失败剔除
  2. VLM 复检改写(VLM-assisted Refinement):VLM 从五个维度审查——修复质量、物体一致性、几何对齐、内容合理性、色彩一致性。不满意的不直接丢,而是用 VLM 反馈拼接纠正指令重新生成,再复评。VLM 在这里既当质检员又当反馈源,形成迭代闭环。
  3. 人工验收(Manual Verification):人工复核保留样本,剔除仍有明显瑕疵/结构不一致/不合理改动的。500 张测试对由多名研究者联合人工精选,确保高保真、强修复、无明显幻觉。

2.4 下游怎么用:以 FLUX-ControlNet 为例

数据集本身是「LQ-HQ-prompt」三元组的 jsonl。每条记录把 LQ 当输入、HQ(即 GGT)当监督目标、prompt 是文本条件:

repo/test_GGT_500.jsonl:L1 — GGT-100K 测试集的一条记录(数据格式)

{"type": "GeneralMix", "gt": "/GGT_dataset/test/GeneralMix/gt/00001.png",
 "lq": "/GGT_dataset/test/GeneralMix/lq/00001.png",
 "prompt": "Restore this image to a clean and clear state. The image may be degraded by noise, blurring, compression artifacts, or combinations of these."}

训生成式修复模型时,GT 经 VAE 当扩散目标,LQ 经 VAE 当 ControlNet 条件,用 flow-matching(rectified flow)目标训练:

repo/flux-controlnet/train_controlnet_flux_ir.py:L984-L1021 — flow-matching 加噪 + ControlNet 注入 + 速度回归损失

# GT → 目标 latent;LQ → control_image(前面已各自 VAE 编码并 pack)
noise = torch.randn_like(pixel_latents)
sigmas = get_sigmas(timesteps, n_dim=pixel_latents.ndim, dtype=pixel_latents.dtype)
noisy_model_input = (1.0 - sigmas) * pixel_latents + sigmas * noise   # rectified flow 直线插值

controlnet_block_samples, controlnet_single_block_samples = flux_controlnet(
    hidden_states=noisy_model_input,
    controlnet_cond=control_image,          # ← LQ 作为 ControlNet 条件注入
    timestep=timesteps / 1000, guidance=guidance_vec,
    pooled_projections=pooled_prompt_embeds, encoder_hidden_states=prompt_embeds,
    txt_ids=text_ids[0], img_ids=latent_image_ids, return_dict=False,
)
noise_pred = flux_transformer(
    hidden_states=noisy_model_input, timestep=timesteps / 1000, guidance=guidance_vec,
    pooled_projections=pooled_prompt_embeds, encoder_hidden_states=prompt_embeds,
    controlnet_block_samples=[s.to(dtype=weight_dtype) for s in controlnet_block_samples] ...,
    txt_ids=text_ids[0], img_ids=latent_image_ids, return_dict=False)[0]

loss = F.mse_loss(noise_pred.float(), (noise - pixel_latents).float(), reduction="mean")  # 速度场目标

这里 loss = MSE(noise_pred, noise - pixel_latents) 正是 rectified flow 的速度回归(速度 = 终点噪声 − 起点数据),和 oftsr-2024 里的 flow 目标同源——只是这里把 LQ 作为 ControlNet 空间条件,GGT 作为要拟合的干净终点。

IR 任务没有现成文本描述,他们用 RAM(Recognize Anything)给 GT 打标签当 prompt

repo/flux-controlnet/train_controlnet_flux_ir.py:L966-L971 — 用 RAM 给 GT 抽标签作为文本条件

with torch.no_grad():
    gt_for_ram = ram_transforms((pixel_values.float() * 0.5 + 0.5).clamp(0, 1))
    captions = inference_ram(gt_for_ram.to(device=accelerator.device, dtype=torch.float16), ram_model)
prompt_embeds, pooled_prompt_embeds, text_ids = compute_embeddings_from_prompts(captions)

3. 结论 (Key findings)

FoundIR 与 Qwen-Image-Edit 在不同数据上训练的定性对比
Fig. 2 — 定性对比。四列分别是:LQ 输入 / 官方模型 / 在已有数据上训练 / 已有数据 + GGT-100K。FoundIR(上行)对真实雨雾泛化差,即便在已有修复数据上微调仍有伪影。Qwen-Image-Edit(下行)靠强生成先验能出锐利细节,但可能幻觉或偏色,而在已有数据上微调反而削弱了细节生成能力。加入 GGT-100K 后两者对真实退化的泛化都显著提升——细节更丰富且保持场景一致。(论文 Fig. 2)

4. 实现细节 (Implementation notes)

5. 批判性总结 (Critical assessment)

Strengths

Limitations / open questions

When to use / not use

Further reading

讨论 / Comments

评论托管在本仓库的 GitHub Discussions, 需 GitHub 账号。