Real-ESRGAN: Training Real-World Blind Super-Resolution with Pure Synthetic Data

Abstract

  • 尽管在盲超分辨率方面已经进行了许多尝试,以恢复具有未知和复杂退化的低分辨率图像,但它们仍然远远不能解决一般的真实世界退化图像。在这项工作中,我们将强大的ESRGAN扩展到一个实际的恢复应用程序(即Real ESRGAN),该应用程序是用纯合成数据训练的。具体而言,引入了高阶退化建模过程,以更好地模拟复杂的现实世界退化。我们还考虑了合成过程中常见的振铃和过冲伪影。此外,我们采用了一种具有频谱归一化的U-Net鉴别器来提高鉴别器的能力并稳定训练动态。广泛的比较表明,它在各种真实数据集上的视觉性能优于先前的工作。我们还提供了高效的实现来动态合成训练对。
  • Real-ESRGAN 是针对真实场景盲超分辨率(Blind SR) 提出的模型,通过纯合成数据训练扩展了 ESRGAN 的实用性;其核心创新包括:提出高阶退化模型(重点采用二阶) 以模拟真实场景中复杂的多次退化过程(如相机成像、编辑、网络传输等),引入sinc 滤波器处理常见的振铃和过冲伪影,设计带谱归一化(SN)的 U-Net 鉴别器以提升鉴别能力并稳定训练;实验中,该模型在 RealSR、DRealSR 等多个真实数据集上,相比 ESRGAN、RealSR 等方法,在去除伪影恢复纹理细节上表现更优(如 NIQE 分数更低),但仍存在线条扭曲、GAN 伪影、无法处理分布外退化等局限。
  • 研究背景和问题,传统SR假设双三次下采样,与真实退化 mismatch;现有盲SR(显式/隐式建模)泛化性差,想通过用纯合成数据训练,解决真实场景复杂盲超分问题。退化模型设计,经典退化模型:模糊(高斯/广义高斯/平台核)+下采样(面积/双线性/双三次)+噪声(高斯/泊松)+JPEG压缩,高阶退化模型:采用二阶,重复经典退化过程(不同超参),替换下采样为随机resize,伪影处理:sinc滤波器模拟/消除振铃、过冲伪影(用于模糊过程和合成最后一步)。
  • 网络结构,生成器:沿用ESRGAN的RRDB结构,扩展×2/×1尺度(用pixel-unshuffle降维减计算),鉴别器:U-Net结构+谱归一化(SN),提升局部细节反馈能力,稳定训练。训练策略,两阶段:先训Real-ESRNet(L1损失,PSNR导向),再初始化训Real-ESRGAN(L1+感知+GAN损失,权重1:1:0.1),优化:EMA稳定训练,训练对池提升退化多样性,锐化GT提升视觉锐度(Real-ESRGAN+)

Introduction

  • 单图像超分辨率(SR)是一个活跃的研究课题,其目的是从低分辨率(LR)图像重建高分辨率(HR)图像。自SRCNN 的开创性工作以来,深度卷积神经网络(CNN)方法在SR领域取得了蓬勃发展。然而,大多数方法,假设理想的双三次下采样内核,其不同于真实的降级。这种降级失配使得那些方法在真实世界场景中不实用。

  • 盲超分辨率则相反,其目的是恢复遭受未知和复杂退化的低分辨率图像。现有方法可以根据潜在的退化过程大致分为显式建模和隐式建模。经典退化模型由模糊,下采样,噪声和JPEG压缩(更多细节请参见第3.1节)组成,广泛用于显式建模方法。

  • 然而,现实世界的退化通常过于复杂,无法用多个退化的简单组合来建模。因此,这些方法很容易在现实世界的样本中失败。隐式建模方法利用生成对抗网络(GAN)的数据分布学习来获得退化模型。然而,它们仅限于训练数据集内的退化,并且不能很好地推广到分发外的图像。鼓励读者参考最近的盲SR调查以获得更全面的分类。

  • 在这项工作中,我们的目标是扩展强大的ESRGAN ,通过合成训练对与更实用的退化过程来恢复一般的真实世界LR图像。真实的复杂退化通常来自不同退化过程的复杂组合,例如相机的成像系统,图像编辑和互联网传输。例如,当我们用手机拍照时,照片可能会有几种退化,例如相机模糊,传感器噪音,锐化伪像和JPEG压缩。然后我们做一些编辑并上传到社交媒体应用程序,这会引入进一步的压缩和不可预测的噪音。当图像在互联网上被分享多次时,上述过程变得更加复杂。

  • 这促使我们将经典的“一阶”退化模型扩展到用于现实世界退化的“高阶”退化建模,即退化用几个重复的退化过程来建模,每个过程都是经典的退化模型。我们采用了二阶退化过程,以便在简单性和有效性之间取得良好的平衡。最近的工作也提出了一种随机洗牌策略来合成更实用的退化。然而,它仍然涉及固定数量的退化过程,并且是否所有洗牌的退化都是有用的还不清楚。相反,表示“高”之义阶退化模型更灵活,并试图模仿真实的退化生成过程。我们进一步将sinc滤波器的综合过程来模拟常见的振铃和过冲伪影

  • 由于退化空间比ESRGAN大得多,训练也变得具有挑战性。具体来说,1)鉴别器需要更强大的能力来区分真实性和复杂的训练输出,而鉴别器的梯度反馈需要更准确地增强局部细节。因此,我们将ESRGAN中的VGG风格鉴别器改进为U-Net设计。2)U-Net结构和复杂的退化也增加了训练的不稳定性。因此,我们采用谱归一化(SN)正则化来稳定训练动态。配备了专门的改进,我们能够轻松训练我们的Real ESRGAN,并在局部细节增强和伪影抑制之间实现良好的平衡

  • 总之,在这项工作中,1)我们提出了一种高阶退化过程来模拟实际退化,并利用sinc滤波器来模拟常见的振铃和过冲伪影。2)我们采用了一些基本的修改(例如,具有频谱归一化的U-Net鉴别器)来提高鉴别器的能力并稳定训练动态。3)使用纯合成数据训练的真实ESRGAN能够恢复大多数真实世界的图像,并实现比以前作品更好的视觉性能,使其在真实世界的应用中更实用

  • 退化模型类型 核心组成 关键参数 / 设置 优势
    经典退化模型(一阶) 1. 模糊:高斯 / 广义高斯 / 平台核;2. 下采样:面积 / 双线性 / 双三次(排除最近邻);3. 噪声:高斯(彩色 / 灰度)/ 泊松;4. JPEG 压缩(DiffJPEG 实现,q∈[30,95]) 模糊核尺寸 7-21,高斯 σ∈[0.2,3],噪声 sigma∈[1,30](泊松尺度 0.05-3) 基础退化模拟,用于对比实验
    高阶退化模型(二阶) 重复 2 次经典退化过程,每次超参随机,下采样替换为随机 resize 二阶平衡复杂度与效果,模糊核概率(高斯 0.7、广义高斯 0.15、平台 0.15),sinc 滤波器概率 0.8 模拟真实多次退化(如拍摄→编辑→上传),覆盖更广退化空间
    振铃 / 过冲伪影处理 引入sinc 滤波器(理想低通滤波器),用于模糊过程和合成最后一步(与 JPEG 顺序随机) 截止频率 ωc 可调,核尺寸 21 精准模拟并消除真实场景中由锐化、JPEG 压缩导致的振铃 / 过冲伪影

Related Work

  • 自SRCNN以来,图像超分辨率领域经历了各种发展。为了获得视觉上令人愉悦的结果,生成对抗网络通常被用作损失监督,以使解决方案更接近自然流形。大多数方法都假设一个双三次下采样核,在真实图像中通常会失败。最近的工作还包括在图像恢复之前的强化学习或GAN。

  • blind SR已经有了一些很好的探索。第一类涉及显式退化表示,通常由两个部分组成:退化预测和条件恢复。上述两个组件可以单独执行或联合(迭代)执行。这些方法依赖于预定义的降解表示(例如降解类型和级别),通常考虑简单的合成降解。此外,不准确的退化估计将不可避免地导致伪影。

  • 另一类是获取/生成尽可能接近真实数据的训练对,然后训练一个统一的网络来解决盲SR。训练对通常1)用特定的相机捕获,然后进行繁琐的对齐;2)或直接从具有循环一致性损失的未配对数据中学习;3)或与估计的模糊核和提取的噪声块合成。然而,1)捕获的数据仅限于与特定相机相关的劣化,因此不能很好地推广到其他真实图像;2)使用未配对数据学习细粒度退化具有挑战性,结果通常不令人满意。

  • 退化模型。经典退化模型在盲SR方法中被广泛采用。然而,现实世界的退化通常太复杂,无法明确建模。因此,隐式建模试图学习网络内的退化生成过程。在这项工作中,我们提出了一种灵活的高阶退化模型来综合更实用的退化

  • 在这里插入图片描述

  • 图1:双三次上采样、ESRGAN、RealSR和我们在真实图像上的Real ESRGAN结果的比较。使用纯合成数据训练的Real ESRGAN模型能够增强细节,同时消除常见真实世界图像的恼人伪影。(放大以获得最佳视图)

Methodology

Classical Degradation Model

  • 盲SR旨在从具有未知和复杂退化的低分辨率图像中恢复高分辨率图像。通常采用经典退化模型来合成低分辨率输入。通常,首先将地面真实图像y与模糊核k卷积。然后,执行具有比例因子r的下采样操作。低分辨率x是通过添加噪声n获得的。最后,还采用了JPEG压缩,因为它在现实世界的图像中得到了广泛的应用

    • x=D(y)=[(y⊙k)↓r+n]JPEG;(1) x = D(y) = [(y \odot k) \downarrow_r +n]_{JPEG}; (1) x=D(y)=[(yk)r+n]JPEG;(1)

    • 其中D表示劣化过程。在下文中,我们将简要回顾这些常用的降解方法。详细设置见第4.1节。更多描述和示例见附录A.

  • 模糊。我们通常将模糊退化建模为与线性模糊滤波器(核)的卷积。各向同性和各向异性高斯滤波器是常见的选择。对于核大小为2t+1的高斯模糊核k,其 (i;j)∈[−t;t](i;j)\in [-t;t](ij)[tt] 元素从高斯分布中采样,形式为:

    • k(i;j)=1Nexp(−12CTΣ−1C);C=[i;j]T;(2) k(i; j) = \frac1 N exp(−\frac 1 2 C^T Σ^{−1}C); C = [i; j]^ T ; (2) k(i;j)=N1exp(21CTΣ1C);C=[i;j]T;(2)

    • 其中∑是协方差矩阵;C是空间坐标;N是归一化常数。协方差矩阵可以进一步表示如下:

    • KaTeX parse error: Unexpected character: '' at position 122: …sinθ −sinθ cosθ̲; (4)

    • 其中σ1和σ2是沿两个主轴的标准偏差(即协方差矩阵的特征值);θ是旋转度。当σ1=σ2时,k是各向同性高斯模糊核;否则k是各向异性核。

  • 讨论。尽管高斯模糊核被广泛用于模拟模糊退化,但它们可能无法很好地近似真实的相机模糊。为了包含更多不同的核形状,我们进一步采用了广义高斯模糊核和平台形分布。它们的概率密度函数(pdf)分别为 1Nexp(−12(CT∑−1C)β和1N11+(CT∑−1C)β\frac 1 N exp(−\frac1 2(C^T∑^{-1}C)^β和\frac1 N\frac 1{1+(C^T∑^{-1}C)^β}N1exp21CT1CβN11+CT1Cβ1。β是形状参数。根据经验,我们发现包含这些模糊核可以为几个真实样本产生更清晰的输出

  • 噪音。我们考虑两种常用的噪声类型——1)加性高斯噪声和2)泊松噪声。加性高斯噪声具有与高斯分布相等的概率密度函数。噪声强度由高斯分布的标准偏差(即西格玛值)控制。当RGB图像的每个通道都有独立的采样噪声时,合成噪声是颜色噪声。我们还通过对所有三个通道使用相同的采样噪声来合成灰度噪声

  • 泊松噪声遵循泊松分布。它通常用于近似模拟由统计量子波动引起的传感器噪声,即在给定曝光水平下感测到的光子数量的变化。泊松噪声的强度与图像强度成正比,不同像素处的噪声是独立的。

  • 调整大小(下采样)。下采样是SR中合成低分辨率图像的基本操作。更一般地说,我们考虑缩减和上采样,即调整大小操作。有几种调整大小的算法——最近邻插值、面积调整、双线性插值和双三次插值。不同的调整大小操作会带来不同的效果——有些会产生模糊的结果,而有些可能会输出带有过冲伪影的过于清晰的图像

  • 为了包含更多样化和复杂的调整大小效果,我们考虑从上述选项中进行随机调整大小操作。由于最近邻插值引入了错位问题,我们将其排除在外,只考虑面积、双线性和双三次运算。

  • JPEG压缩。JPEG压缩是一种常用的数字图像有损压缩技术。它首先将图像转换为YCbCr颜色空间,并对色度通道进行下采样。然后,图像被分割成8×8的块,每个块都用二维离散余弦变换(DCT)进行变换,然后对DCT系数进行量化。JPEG压缩算法的更多细节可以在[Jpeg-resistant adversarial images]中找到。解压缩块伪影通常是由JPEG压缩引入的。

  • 压缩图像的质量由质量因子q∈[0;100]q\in[0;100]q[0100] 决定,其中较低的q表示较高的压缩比和较差的质量。我们使用PyTorch实现-DiffJPEG。

经典一阶退化子模块:基础退化单元
  • 模拟单轮退化过程,是高阶退化的 “基本组件”,涵盖真实场景中常见的单步退化类型。输入:高分辨率(HR)图像(如训练集中的 DIV2K HR patch)。输出:带单轮退化的低分辨率(LR)图像。核心组成与作用(对应公式 1:x=D(y)=[(y⊛k)↓r+n]JPEGx=\mathcal{D}(y)=\left[(y \circledast k) \downarrow_{r}+n\right]_{JPEG}x=D(y)=[(yk)r+n]JPEG):

    • 退化类型 具体实现 作用与意义
      模糊(Blur) 采用三种核: 1. 高斯核(各向同性 / 各向异性); 2. 广义高斯核; 3. 平台核 覆盖真实相机模糊(如镜头失焦、运动模糊),避免传统单一高斯核的泛化性不足。
      resize(下采样) 排除近邻插值(易错位),仅用:面积插值、双线性插值、双三次插值 模拟真实图像缩放(如编辑软件缩放、屏幕显示缩放),避免单一插值导致的退化偏差。
      噪声(Noise) 两种类型: 1. 加性高斯噪声(彩色 / 灰度,独立通道采样); 2. 泊松噪声 模拟传感器噪声(泊松,与图像亮度正相关)和传输噪声(高斯),贴近真实图像噪声特性。
      JPEG 压缩 基于 PyTorch 的 DiffJPEG 实现,模拟有损压缩 覆盖网络传输、存储中的压缩伪影(如块效应),是真实图像的核心退化之一。
    • 超参数设置与影响

    • 超参数 取值范围 影响
      模糊核尺寸 {7,9,…,21}(随机选) 核尺寸越大,模糊越显著;随机尺寸提升模型对不同模糊程度的适应能力。
      高斯核标准差 σ [0.2,3] σ 越大,模糊越强;范围覆盖轻度到中度模糊,符合真实场景主流模糊程度。
      噪声 sigma(高斯) [1,30] sigma 越大,噪声越强;范围覆盖低噪(真实拍摄)到高噪(网络传输)场景。
      JPEG 质量因子 q [30,95] q 越低,压缩伪影越重;范围覆盖 “轻度压缩(q=95)” 到 “重度压缩(q=30)”。
高阶退化子模块:模拟多轮真实退化
  • 将经典一阶退化 “重复 n 次”(文档实证 n=2 最优),每轮退化采用不同超参数,模拟真实图像经历的 “多轮处理”(如拍摄→编辑→上传→转发)。输入:HR 图像。输出:带多轮复杂退化的 LR 图像(更贴近真实场景)。核心改进与作用:

    • 替换 “固定下采样” 为 “随机 resize”:真实图像的退化不仅是 “下采样”,还可能有 “先下再上” 的缩放(如编辑时放大裁剪),随机 resize 覆盖该场景。

    • 多轮退化叠加:每轮退化的超参数(如模糊核、噪声强度)随机,模拟 “拍摄时模糊 + 编辑时锐化 + 上传时压缩” 的真实流程,解决传统一阶退化 “与真实脱节” 的问题。

    • 平衡复杂度与效率:选择二阶而非更高阶,是因为二阶已能覆盖 80% 以上真实场景,且避免高阶导致的训练成本激增。

    • 超参数 取值 影响
      退化阶数 2(固定) 一阶无法模拟多轮退化,三阶及以上提升有限但增加计算量,二阶是最优平衡。
      第二轮退化 σ 范围 [0.2,1.5](小于第一轮) 避免第二轮退化过强导致 LR 图像 “不可恢复”,符合真实退化 “逐步累积” 特性。
      跳过第二轮模糊概率 0.2 模拟部分场景 “仅单轮模糊”(如直接压缩无二次模糊),提升退化多样性。
sinc 滤波器子模块:处理振铃与过冲伪影
  • 通过 sinc 滤波器(理想低通滤波器)模拟并消除真实图像中常见的 “振铃伪影”(边缘附近幽灵纹)和 “过冲伪影”(边缘跳变增强)。输入:退化过程中的图像(模糊阶段或合成最后一步)。输出:带真实伪影(用于训练)或消除伪影(用于推理)的图像。核心设计与作用

    • 伪影成因匹配:振铃 / 过冲伪影多来自锐化算法或 JPEG 压缩(信号高频缺失),sinc 滤波器通过 “截断高频” 精准模拟这类伪影,让模型在训练中学习消除能力。双位置应用:模糊阶段:将 sinc 核与其他模糊核混合使用(概率 0.1),模拟 “锐化后模糊” 的伪影;合成最后一步:与 JPEG 压缩随机交换顺序(先 sinc 后 JPEG,或反之),覆盖 “先锐化再压缩”“先压缩再锐化” 两种真实场景。

    • 超参数 取值 影响
      sinc 核尺寸 21(固定) 尺寸过小无法有效模拟伪影,过大导致计算量增加,21 是效果与效率平衡。
      最后一步应用 sinc 概率 0.8 确保多数训练样本包含伪影,让模型重点学习伪影消除,同时保留少量无伪影样本提升泛化。
      截止频率 ωc 随机(如 π/5、π/3) ωc 越小,高频截断越多,伪影越显著;随机 ωc 覆盖不同伪影强度场景。

High-order Degradation Model

  • 当我们采用上述经典退化模型来合成训练对时,训练后的模型确实可以处理一些真实样本。然而,它仍然无法解决现实世界中一些复杂的退化问题,尤其是未知的噪声和复杂的伪影(见图3)。这是因为合成的低分辨率图像与真实的劣化图像仍然存在很大差距。因此,我们将经典退化模型扩展到高阶退化过程,以模拟更实际的退化

    • 在这里插入图片描述

    • 图3:用经典退化模型的合成数据训练的模型可以解析一些真实样本(左)。然而,它们会放大噪声或为复杂的现实世界图像引入振铃伪影(右)。放大以获得最佳视图

  • 经典的退化模型只包括固定数量的基本退化,这可以被视为一阶建模。然而,现实生活中的退化过程是相当多样化的,通常包括一系列程序,包括相机的成像系统、图像编辑、互联网传输等。例如,当我们想恢复从互联网下载的低质量图像时,其潜在的退化涉及不同退化过程的复杂组合。具体来说,原始图像可能是多年前用手机拍摄的,其中不可避免地包含相机模糊、传感器噪声、低分辨率和JPEG压缩等劣化。

  • 然后通过锐化和调整大小操作对图像进行编辑,引入过冲和模糊伪影。之后,它被上传到一些社交媒体应用程序,这引入了进一步的压缩和不可预测的噪音。由于数字传输也会带来伪影,当图像在互联网上传播几次时,这个过程变得更加复杂。

  • 这种复杂的劣化过程无法用经典的一阶模型进行建模。因此,我们提出了一个高阶退化模型。n阶模型涉及n个重复的退化过程(如方程5所示),其中每个退化过程都采用经典退化模型(方程1),其过程相同,但超参数不同。请注意,这里的“高阶”与数学函数中使用的不同。

  • 主要指同一操作的执行时间。[Designing a practical degradation model for deep blind image super-resolution]中的随机混洗策略也可能包括重复的降级过程(例如,双模糊或JPEG)。但我们强调,高阶退化过程是关键,这表明并非所有混洗退化都是必要的。为了将图像分辨率保持在合理的范围内,方程1中的下采样操作被随机调整大小操作所取代。根据经验,我们采用二阶退化过程,因为它可以在保持简单性的同时解决大多数实际情况。图2展示了我们纯合成数据生成流程的整体流程。

    • x=Dn(y)=(Dn◦⋅⋅⋅◦D2◦D1)(y):(5) x = D ^n (y) = (D_n ◦ · · · ◦ D_2 ◦ D_1)(y): (5) x=Dn(y)=(Dn⋅⋅⋅D2D1)(y):(5)

    • 值得注意的是,改进的高阶退化过程并不完美,无法覆盖现实世界中的整个退化空间。相反,它只是通过修改数据合成过程来扩展先前盲SR方法的可解退化边界。图11中可以找到几个典型的限制场景。

    • 在这里插入图片描述

    • 图2:Real ESRGAN中采用的纯合成数据生成概述。它利用二阶退化过程来模拟更实际的退化,其中每个退化过程都采用经典的退化模型。列出了模糊、调整大小、噪声和JPEG压缩的详细选择。我们还使用sinc滤波器来合成常见的振铃和过冲伪影。

Ringing and overshoot artifacts

  • 振铃伪影通常表现为图像中清晰过渡附近的伪边缘。它们在视觉上看起来像边缘附近的带子或“幽灵”。过冲伪影通常与振铃伪影相结合,表现为边缘过渡处跳跃的增加。这些伪影的主要原因是信号在没有高频的情况下是带限的。这些伪影非常常见,通常是由锐化算法、JPEG压缩等产生的。图5(顶部)显示了一些遭受振铃和过冲伪影的真实样本。我们采用sinc滤波器,这是一种理想化的滤波器,可以切断高频,为训练对合成振铃和过冲伪影。sinc滤波器内核可以表示为:

    • k(i;j)=wc2πi2+j2J1(wci2+j2);(6) k(i; j) = \frac{w_c}{2π\sqrt{i^2 + j^2}} J_1(w_c \sqrt{i^2 + j^2}); (6) k(i;j)=2πi2+j2 wcJ1(wci2+j2 );(6)

    • 其中(i;j)是核坐标;wcw_cwc 是截止频率;J1是第一类一阶贝塞尔函数。图5(底部)显示了具有不同截止频率的sinc滤波器及其相应的滤波图像。观察到它可以很好地合成振铃和过冲伪影(特别是由过锐效应引入的伪影)。这些伪影在视觉上与图5(顶部)中前两个真实样本中的伪影相似。

    • 在这里插入图片描述

    • 图5:上图:遭受振铃和过冲伪影的真实样本。底部:sinc核(核大小21)和相应的滤波图像的示例。放大以获得最佳视图

  • 我们在两个地方采用sinc滤波器:模糊过程和合成的最后一步。最后一个sinc滤波器和JPEG压缩的顺序是随机交换的,以覆盖更大的退化空间,因为一些图像可能首先被过度锐化(有过冲伪影),然后进行JPEG压缩;而一些图像可能首先进行JPEG压缩,然后进行锐化操作。

Networks and Training

  • ESRGAN generator。我们采用与 ESRGAN 相同的生成器(SR网络),即具有多个残差密集块(RRDB)的深度网络,如图4所示。我们还扩展了原始的 ×4 ESRGAN架构,以执行比例因子为 ×2 和 ×1 的超分辨率。由于ESRGAN 是一个重型网络,我们首先采用像素非混叠(像素混叠的逆操作)来减小空间大小并扩大通道大小,然后再将输入馈送到主ESRGAN架构中。因此,大部分计算都是在较小的分辨率空间内进行的,这可以减少GPU内存和计算资源的消耗。

    • 在这里插入图片描述

    • 图4:Real ESRGAN采用与ESRGAN相同的发电机网络。对于×2和×1的比例因子,它首先采用像素非混叠操作来减小空间大小,并将信息重新排列到通道维度。

  • 具有频谱归一化(SN)的U-Net鉴别器。由于Real ESRGAN旨在解决比ESRGAN大得多的退化空间,因此ESRGAN中鉴别器的原始设计不再适用。具体来说,Real ESRGAN中的鉴别器对于复杂的训练输出需要更大的鉴别能力。它还需要为局部纹理产生精确的梯度反馈,而不是区分全局样式。受的启发,我们还将ESRGAN中的VGG风格鉴别器改进为具有跳过连接的U-Net设计(图6)。UNet输出每个像素的真实值,并可以向生成器提供详细的每个像素的反馈。

    • 在这里插入图片描述

    • 图6:U-Net鉴别器的光谱归一化架构。

  • 同时,U-Net结构和复杂的降级也增加了训练的不稳定性。我们采用谱归一化正则化来稳定训练动态。此外,我们观察到光谱归一化也有利于减轻GAN训练带来的过度遮蔽和恼人的伪影。通过这些调整,我们能够轻松训练RealESRGAN,并实现局部细节增强和伪影抑制的良好平衡。

  • 训练过程分为两个阶段。首先,我们用L1损失训练一个面向PSNR的模型。所获得的模型由Real ESRNet命名。然后,我们使用训练好的面向PSNR的模型作为生成器的初始化,并使用L1损失、感知损失和GAN损失的组合训练Real ESRGAN。

  • 生成器(Generator):沿用 ESRGAN 的RRDB(残差 - 残差密集块),保证特征提取能力。支持 ×1/×2/×4 超分,对 ×1/×2 先做pixel-unshuffle(降空间尺寸、升通道数),减少 GPU 计算与内存消耗。鉴别器(Discriminator):将 ESRGAN 的 VGG-style 鉴别器改为U-Net 结构,并加入谱归一化(SN)。U-Net 提供逐像素真实度反馈,提升局部纹理恢复精度;SN 解决 U-Net + 复杂退化导致的训练不稳定,减少 GAN 伪影。Real-ESRGAN 在网络结构上对 ESRGAN 做的关键改进

  • 改进点 动机
    鉴别器从 VGG-style 改为 U-Net 结构 ESRGAN 的 VGG 鉴别器仅输出全局真实度分数,无法提供局部纹理的精准反馈;U-Net 通过跳连接输出逐像素真实度,能指导生成器优化细节(如砖块纹理、文字边缘),提升局部恢复精度
    鉴别器加入谱归一化(SN) U-Net 结构 + 复杂退化会导致训练不稳定(梯度爆炸 / 消失),SN 通过限制权重矩阵的谱范数,稳定训练动态,同时减少 GAN 训练常见的 “过度锐化” 和 “虚假伪影”
    生成器支持 ×1/×2 超分(pixel-unshuffle) ESRGAN 仅支持 ×4 超分,Real-ESRGAN 需处理不同尺度的真实图像;pixel-unshuffle 可降低输入空间尺寸、提升通道数,在小分辨率空间做计算,减少 GPU 内存与算力消耗
  • 两阶段训练:第一阶段:训练Real-ESRNet(PSNR 导向),仅用 L1 损失,迭代 1000K 次,学习率 2×10⁻⁴。第二阶段:用 Real-ESRNet 初始化,训练Real-ESRGAN,损失为 L1(权重 1)+ 感知损失(VGG19 的 conv1-conv5,权重 1)+ GAN 损失(权重 0.1),迭代 400K 次,学习率 1×10⁻⁴。

  • 优化技巧:EMA(指数移动平均):稳定训练,提升最终性能。训练对池(Pool Size=180):解决 batch 内退化多样性不足问题,随机选样本组成 batch。锐化 GT:训练时对 Ground Truth 做轻微锐化,得到Real-ESRGAN+,进一步提升视觉锐度(无额外伪影)。

网络结构模块:学习 “从 LR 到 SR 的映射”

  • 网络结构承接退化模块生成的 LR-HR 对,通过生成器学习 “退化逆过程”(LR→SR),通过鉴别器提供 “真实度反馈”,核心是 “在细节恢复与伪影消除间平衡”。

  • 生成器:基于 RRDB 的超分核心,沿用 ESRGAN 的 “残差 - 残差密集块(RRDB)” 结构,扩展至 ×1/×2/×4 多尺度,是超分的 “核心执行单元”。输入:带复杂退化的 LR 图像(尺寸如 64×64,对应 ×4 超分的 256×256 HR)。输出:超分辨率(SR)图像(尺寸与 HR 一致)。

    • 多尺度适配:针对 ×1(去伪影)、×2(2 倍超分)场景,在 RRDB 前加入pixel-unshuffle 操作(逆 pixel-shuffle):将 LR 的空间尺寸缩小(如 ×2 超分时,64×64→32×32),通道数放大(如 3→12),在小分辨率空间做计算,减少 GPU 内存消耗(降低 50% 以上)并提升效率。通过 “残差嵌套 + 密集连接”,增强特征复用能力,避免深层网络梯度消失,确保对细节的精准恢复(如砖块纹理、文字边缘)。

    • 超参数 取值 影响
      HR patch 尺寸 256×256(训练) 尺寸过小无法学习全局纹理,过大导致 batch 变小(训练效率低),256 是主流超分训练尺寸。
      RRDB 数量 23(与 ESRGAN 一致) 数量过少特征提取不足,过多增加计算量,23 是 ESRGAN 验证的最优值。
      pixel-unshuffle 缩放比 ×2(×2 超分)、×4(×1 超分) 匹配不同超分尺度,确保输入 RRDB 的特征维度一致,提升训练稳定性。
  • 鉴别器:基于 U-Net + 谱归一化的反馈单元,改进 ESRGAN 的 VGG-style 鉴别器,采用 U-Net 结构并加入谱归一化(SN),核心是 “提供逐像素的真实度反馈”。输入:SR 图像(生成器输出)与 HR 图像(Ground Truth)。输出:逐像素的 “真实度评分”(1 表示真实 HR,0 表示生成 SR)。

    • 核心改进与作用(解决 ESRGAN 鉴别器的两大缺陷),U-Net 结构替代 VGG-style:传统 VGG 鉴别器仅输出 “全局真实度分数”,无法反馈局部细节(如某块纹理是否真实);U-Net 通过 “编码器下采样 + 解码器上采样 + 跳连接”,输出逐像素评分,精准指导生成器优化局部细节(如修复扭曲的线条、补充缺失的纹理)。谱归一化(SN)加入:U-Net 结构 + 复杂退化会导致训练不稳定(梯度爆炸 / 消失);SN 通过限制权重矩阵的谱范数,强制鉴别器 Lipschitz 连续,稳定训练动态,同时减少 GAN 常见的 “过度锐化伪影”。

    • 超参数 取值 影响
      鉴别器卷积核尺寸 3×3(固定) 小核尺寸(3×3)比大核(5×5)更能捕捉局部细节,匹配逐像素反馈需求。
      谱归一化应用层 所有卷积层 仅部分层应用 SN 会导致局部梯度不稳定,全层应用确保整体训练平稳。

损失函数模块:优化 “SR 与 HR 的一致性”

  • 损失函数是网络训练的 “导航器”,Real-ESRGAN 采用 “多损失组合”,平衡 “像素级精度”“感知质量” 与 “真实度”。输入:SR 图像与 HR 图像的特征 / 像素值。输出: scalar 损失值(用于反向传播优化网络)。

    • 损失类型 具体实现 作用与意义
      L1 损失 计算 SR 与 HR 的像素级 L1 距离($\mathcal{L}_{L1}= SR-HR
      感知损失(Perceptual Loss) 基于预训练 VGG19 的 conv1-conv5 特征(激活前),计算 SR 与 HR 的特征距离,权重 {0.1,0.1,1,1,1} 从 “人类感知” 角度优化 SR,避免 L1 损失导致的 “模糊感”,提升纹理真实度。
      GAN 损失 基于鉴别器的逐像素真实度评分,采用非饱和 GAN 损失(LGAN=−log⁡(D(SR))\mathcal{L}_{GAN}=-\log(D(SR))LGAN=log(D(SR)) 驱动生成器生成 “鉴别器认为真实” 的 SR,提升视觉逼真度(如模拟真实的光影变化)。

Experiments

Datasets and Implementation

  • 训练详情。与ESRGAN类似,我们采用DIV2K、Flickr2K和OutdoorSceneTraining数据集进行训练。训练HR补丁大小设置为256。我们使用四个NVIDIA V100 GPU训练模型,总批量为48。我们采用Adam优化器。Real ESRNet经过ESRGAN的微调,以实现更快的收敛。我们训练Real ESRNet进行1000K迭代,学习率为2×10−4,同时训练Real ESRGAN进行400K迭代,训练率为1×10−4。我们采用指数移动平均线(EMA)进行更稳定的训练和更好的表现。RealESRGAN采用L1损失、感知损失和GAN损失的组合进行训练,权重为 {1;1;0.1}\{1;1;0.1\}{110.1}。我们使用 {conv1;...;conv5}\{conv_1;...;conv_5\}{conv1...;conv5}在预训练的VGG19网络中激活前的特征图(权重为 {0.1;0.1;1;1,1}\{0.1;0.1;1;1,1\}{0.10.111,1})作为感知损失。我们的实现基于BasicSR。
  • 降级详细信息。我们采用二阶退化模型,以实现简单性和有效性的良好平衡。除非另有说明,否则这两个降级过程具有相同的设置。我们采用高斯核、广义高斯核和平台形核,概率为 {0.7;0.15;0.15}\{0.7; 0.15;0.15\}{0.70.15;0.15} 。模糊核大小从{7;9;...,21}\{7;9;...,21\}{79...,21} 中随机选择。模糊标准偏差σ取自[0:2;3](第二次退化过程为[0:2;1:5])。对于广义高斯核和平台形核,形状参数β分别从[0:5;4]和[1;2]中采样。我们还使用概率为0.1的sinc核。我们以0.2的概率跳过第二次模糊退化
  • 我们使用概率为{0.5;0.5}\{0.5 ;0.5\}{0.50.5}的高斯噪声和泊松噪声。噪声西格玛范围和泊松噪声标度分别设置为[1;30]和[0:05;3](对于第二劣化过程为[1;25]和[0.05;2.5])。灰色噪声概率设置为0.4。JPEG压缩质量因子设置为[30;95]。最终的sinc滤波器以0.8的概率应用。更多细节可以在发布的代码中找到。
  • Training pair pool。为了提高训练效率,所有退化过程都在PyTorch中以CUDA加速实现,这样我们就可以动态合成训练对。然而,批处理限制了一批中合成降解的多样性。例如,批次中的样本不能有不同的调整大小比例因子。因此,我们采用训练对池来增加批处理中的退化多样性。在每次迭代中,从训练对中随机选择训练样本,形成一个训练批。我们在实现中将池大小设置为180。
  • 在训练过程中锐化 GT 图像。我们进一步展示了一种训练技巧,可以在视觉上提高锐度,同时不会引入可见的伪影。锐化图像的一种典型方法是采用后处理算法,如反锐化掩模(USM)。然而,这种算法往往会引入过冲伪影。我们实证发现,在训练过程中锐化 GT 图像可以实现锐度和过冲伪影抑制的更好平衡。我们将用锐化的 GT 图像训练的模型表示为Real ESRGAN+(比较如图7所示)。
    • 在这里插入图片描述

    • 图7:几个具有代表性的真实世界样本的定性比较,上采样比例因子为4。我们的Real ESRGAN在去除伪影和恢复纹理细节方面都优于以前的方法。真正的ESRGAN+(经过锐化地面真实训练)可以进一步提高视觉锐度。其他方法可能无法消除过冲(第一个样本)和复杂的伪影(第二个样本),或者无法为各种场景恢复逼真和自然的纹理(第三、第四、第五个样本)。(放大以获得最佳视图)

Comparisons with Prior Works

  • 我们将我们的Real ESRGAN与几种最先进的方法进行了比较,包括ESRGAN、DAN、CDC、RealSR和BSRGAN。我们使用真实世界的图像在几个不同的测试数据集上进行测试,包括RealSR、DRealSR、OST300、DPED、ADE20K验证和来自互联网的图像。由于现有的感知质量指标不能很好地反映人类在细粒度上的实际感知偏好,我们在图7中展示了几个具有代表性的视觉样本。定量结果也包含在附录B中。供参考。

  • 从图7可以看出,我们的Real ESRGAN在去除伪影和恢复纹理细节方面都优于以前的方法。真正的ESRGAN+(经过锐化地面真实训练)可以进一步提高视觉锐度。具体来说,第一个样本包含过冲伪影(字母周围的白色边缘)。直接上采样将不可避免地放大这些伪影(例如,DAN和BSRGAN)。真正的ESRGAN考虑了这些常见的伪影,并用sinc滤波器对其进行了模拟,从而有效地消除了振铃和过冲伪影。第二个样本包含未知和复杂的降解。大多数算法不能有效地消除它们,而用二阶退化过程训练的Real ESRGAN可以。Real ESRGAN还能够为真实世界的样本恢复更逼真的纹理(例如砖、山和树纹理),而其他方法要么无法消除退化,要么添加不自然的纹理(如RealSR和BSRGAN)。

Ablation Studies

  • 二阶退化模型。我们在Real ESRNet上对降解进行消融研究,因为它更可控,可以更好地反映降解的影响。我们用经典的退化模型代替Real ESRNet中的二阶过程来生成训练对。如图8(上图)所示,用经典的一阶退化模型训练的模型不能有效地去除麦田墙壁上的噪声或模糊,而Real ESRNet可以处理这些情况。

    • 在这里插入图片描述

    • 图8:顶部:真实ESRNet结果,不含二级降解过程。底部:真实的ESRNet结果,不含sinc过滤器。放大以获得最佳视图

  • sinc滤波器。如果在训练过程中不使用sinc滤波器,恢复的结果将放大输入图像中存在的振铃和过冲伪影,如图8(底部)所示,特别是在文本和行周围。相比之下,用sinc滤波器训练的模型可以消除这些伪影

  • 具有SN正则化的U-Net鉴别器。我们首先采用ESRGAN设置,包括VGG风格鉴别器及其损失权重。然而,我们可以从图9中观察到,该模型无法恢复详细的纹理(砖块和灌木),甚至会在灌木树枝上产生令人不快的伪影。使用U-Net设计可以改善局部细节。然而,它引入了不自然的纹理,也增加了训练的不稳定性。SN正则化可以在稳定训练动态的同时改善恢复的纹理

    • 在这里插入图片描述

    • 图9:鉴别器设计上的消融。放大以获得最佳视图

  • 更复杂的模糊核。我们在模糊合成中去除了广义高斯核和平台形核。如图10所示,在一些真实样本上,该模型无法像RealESRGAN那样去除模糊并恢复锐边。然而,在大多数样本上,它们的差异是微不足道的,这表明广泛使用的具有高阶退化过程的高斯核已经可以覆盖大的真实模糊空间。由于我们仍然可以观察到更好的性能,我们在Real ESRGAN中采用了那些更复杂的模糊核。

    • 在这里插入图片描述

    • 图10:使用更多模糊核(广义模糊和平台形核)的消融。放大以获得最佳视图

  • 消融项 结论
    二阶退化模型 vs 一阶 一阶模型无法去除墙壁噪声、麦田模糊;二阶模型能有效处理这些复杂退化
    sinc 滤波器(有 vs 无) 无 sinc 时,会放大输入中的振铃伪影;有 sinc 时,可完全消除这类伪影
    U-Net 鉴别器 + SN 仅 VGG 鉴别器:无法恢复砖块 / 灌木纹理;仅 U-Net:纹理不自然 + 训练不稳定;加 SN 后:纹理真实 + 训练稳定
    扩展模糊核(高斯 vs 多核) 仅高斯核:部分样本无法去模糊;加广义高斯 / 平台核:锐度提升,细节更清晰

Limitations

  • 尽管Real ESRGAN能够恢复大多数现实世界的图像,但它仍然存在一些局限性。如图11所示,1)由于混叠问题,一些恢复的图像(特别是建筑和室内场景)具有扭曲的线条。2)GAN训练在某些样本上引入了不愉快的伪影。3)它无法消除现实世界中分布不均的复杂退化。更糟糕的是,它可能会放大这些伪影。这些缺点对Real ESRGAN的实际应用产生了很大影响,迫切需要在未来的工作中加以解决。
    • 在这里插入图片描述

    • 图11:限制:1)扭曲的线条;2)GAN训练造成的不愉快伪影;3)未知和分布不均的降解。放大以获得最佳视图

Conclusion

  • 本文中,我们使用纯合成训练对训练实用的Real ESRGAN,以实现真实世界的盲超分辨率。为了合成更实用的退化,我们提出了一种高阶退化过程,并使用sinc滤波器来模拟常见的振铃和过冲伪影。我们还利用具有谱归一化正则化的U-Net鉴别器来提高鉴别器的能力并稳定训练动态。使用合成数据训练的真实ESRGAN能够增强细节,同时消除大多数真实世界图像中恼人的伪影。

Appendix

A. Details of Classical Degradation Model

  • 在本节中,我们将提供经典退化模型中使用的每种退化类型的更多细节(特别是示例)
A.1. Blur
  • 各向同性和各向异性高斯滤波器是模糊核的常见选择。我们在图12中显示了几个高斯核及其相应的模糊图像。
    • 在这里插入图片描述

    • 图12:高斯核(核大小21)及其对应的模糊图像的示例。放大以获得最佳视图

  • 为了包含更多不同的核形状,我们进一步采用了广义高斯模糊核和平台形分布。图13显示了形状参数β如何控制内核形状。根据经验,我们发现包含这些模糊核可以为几个真实样本产生更清晰的输出
    • 在这里插入图片描述

    • 图13:在一般高斯分布和平台形分布中具有不同形状参数的模糊核。放大以获得最佳视图

A.2. Noise
  • 图14描述了加性高斯噪声和泊松噪声。泊松噪声的强度与图像强度成正比,不同像素处的噪声彼此独立。如图14所示,泊松噪声在暗区具有较低的噪声强度。
    • 在这里插入图片描述

    • 图14:高斯噪声和泊松噪声的视觉比较。泊松噪声在暗区具有低噪声强度。放大以获得最佳视图

A.3. Resize
  • 有几种调整大小的算法。我们比较了以下调整大小的操作:最近邻插值、面积调整、双线性插值和双三次插值。我们研究了这些调整大小操作的不同效果。我们首先以4的比例因子对图像进行降采样,然后将其升采样到原始大小。执行不同的下采样和上采样算法,不同组合的结果如图15所示。据观察,不同的调整大小操作会产生非常不同的效果——有些会产生模糊的结果,而有些可能会输出带有过冲伪影的过于清晰的图像
    • 在这里插入图片描述

    • 图15:下采样和上采样算法不同组合的影响。这些图像首先以4的比例因子进行下采样,然后上采样到其原始大小。放大以获得最佳视图

A.4. JPEG compression
  • 我们使用PyTorch实现-DiffJPEG。我们观察到,DiffJPEG压缩的图像与cv2包压缩的图像略有不同。图16显示了典型的JPEG压缩伪影以及使用不同包造成的差异。这种差异可能会在合成样本和真实样本之间带来额外的差距。在这项工作中,为了简单起见,我们只采用DiffJPEG,稍后将讨论这种差异。
    • 在这里插入图片描述

    • 图16:cv2和DiffJPEG压缩的JPEG图像,质量因子q=50。它们产生的结果略有不同。放大以获得最佳视图

B. Quantitative Comparisons

  • 我们提供非参考图像质量评估-NIQE供参考。请注意,现有的感知质量指标不能很好地反映人类在细粒度尺度上的实际感知偏好。
  • 我们将我们的Real ESRGAN与几种最先进的方法进行了比较,包括ESRGAN、DAN、CDC、RealSR和BSRGAN。我们使用真实世界的图像在几个不同的测试数据集上进行测试,包括RealSR、DRealSR、OST300、DPED、ImageNet验证和ADE20K验证。结果如表1所示。尽管我们的Real ESRGAN+没有针对NIQE分数进行优化,但它在大多数测试数据集上仍然会产生较低的NIQE评分
    • 在这里插入图片描述

    • 表1:NIQE在几个不同的测试数据集和真实世界图像上的得分。越低越好。

C. More Qualitative Comparisons

  • 我们与之前的作品进行了更多的定性比较。如图17所示,我们的Real ESRGAN在去除伪影和恢复纹理细节方面都优于以前的方法。真正的ESRGAN+(经过锐化 GT 训练)可以进一步提高视觉锐度。其他方法通常无法去除复杂的伪影(第一个样本)和过冲伪影(第二个、第三个样本),或者无法为各种场景恢复逼真和自然的纹理(第四个、第五个样本)。

    • 在这里插入图片描述

    • 图17:几个具有代表性的真实世界样本的定性比较,上采样比例因子为4。我们的Real ESRGAN在去除伪影和恢复纹理细节方面都优于以前的方法。真正的ESRGAN+(经过锐化 GT 训练)可以进一步提高视觉锐度。其他方法通常无法去除复杂的伪影(第一个样本)和过冲伪影(第二个、第三个样本),或者无法为各种场景恢复逼真和自然的纹理(第四个、第五个样本)。(放大以获得最佳视图)

  • 传统 SR 的不足:多数方法(如 ESRGAN、SRCNN)假设理想的双三次下采样核,与真实场景中由相机成像、图像编辑、网络传输等导致的复杂退化(模糊、噪声、压缩伪影等)存在 “退化不匹配”,实用性差。显式建模方法:依赖预定义退化类型(如模糊 + 噪声),无法覆盖真实复杂退化,估计不准易产生伪影。隐式建模方法:依赖训练数据分布,对分布外图像泛化性差。扩展 ESRGAN,通过纯合成数据训练,实现对真实场景通用盲超分,兼顾细节恢复与伪影去除。

  • Real-ESRGAN 提出的 “高阶退化模型” 与传统 “一阶退化模型” 核心差异在于退化过程的 “次数” 与 “灵活性”:传统一阶退化模型:仅包含1 次固定流程的退化(模糊→下采样→噪声→JPEG),无法覆盖真实场景中 “多次退化叠加” 的情况(如相机拍摄→编辑锐化→社交平台压缩→二次转发再压缩);高阶退化模型:采用n 次重复的经典退化过程(论文中实证二阶最优),每次过程的超参(如模糊核类型、噪声强度、JPEG 质量)随机,且将 “下采样” 替换为 “随机 resize”,更贴近真实场景中图像经历的多轮处理;这种设计能显著缩小合成退化与真实退化的差距,使模型学到更通用的退化适应能力,从而在真实图像上表现更优。

  • Real-ESRGAN 的核心模块可分为退化模型模块网络结构模块(生成器 + 鉴别器)、损失函数模块三大类,各模块分工明确且深度协同,共同解决 “真实场景复杂退化下的超分辨率” 问题。退化模型是 Real-ESRGAN 的核心创新之一,其核心目标是用纯合成数据模拟真实场景的复杂退化过程,解决传统超分(如 ESRGAN)“退化假设与真实脱节” 的问题。该模块细分为 “经典一阶退化”“高阶退化”“sinc 滤波器伪影处理” 三个子模块。

  • Real-ESRGAN 的模块并非独立存在,而是以 “数据生成→网络学习→反馈优化” 为核心流程,形成闭环协同,具体逻辑如下:

    • 流程闭环(输入→输出),数据生成阶段:退化模型模块以 “HR 训练图像” 为输入,通过 “二阶退化 + sinc 滤波” 生成 “带真实复杂退化的 LR 图像”,组成 “LR-HR 训练对”,存入训练对池(提升多样性);网络学习阶段:生成器以 “LR 图像” 为输入,输出 “SR 图像”;鉴别器以 “SR 图像” 和 “HR 图像” 为输入,输出 “逐像素真实度评分”;反馈优化阶段:损失函数模块根据 “SR 与 HR 的像素 / 特征差异” 和 “鉴别器评分”,计算总损失;通过反向传播优化生成器和鉴别器的参数,迭代至收敛。

    • 协同核心:退化模型与网络的 “匹配性”,退化模型生成的 LR 图像 “模拟真实退化”,确保网络学习的 “逆过程” 与真实场景需求一致(避免 “训练时学的是双三次退化,推理时面对的是相机模糊 + 压缩” 的 mismatch);U-Net 鉴别器的 “逐像素反馈”,与退化模型的 “局部伪影(如振铃)” 精准匹配,确保网络能针对性消除局部退化,而非仅优化全局模糊。

    • 数据组织与处理流程,Real-ESRGAN 的 “纯合成数据” 并非简单随机生成,而是经过 “数据集筛选→退化变换→训练对管理” 三步严谨处理,确保数据的 “真实性” 与 “多样性”。

      • 步骤 1:训练数据集筛选(HR 源数据),输入:公开超分训练数据集(DIV2K、Flickr2K、OutdoorSceneTraining);筛选标准:选择 “高分辨率(≥1024×1024)、纹理丰富(如自然场景、建筑、文字)” 的图像,避免低质量或单一纹理数据导致模型泛化性差;数据增强:对 HR 图像进行随机裁剪(得到 256×256 patch)、水平翻转,提升训练数据多样性(避免过拟合)。输出:标准化的 HR 训练 patch 集合(数量约百万级)。

      • 步骤 2:退化变换(HR→LR),这是数据处理的核心步骤,通过 “二阶退化模型” 实现从 HR 到 LR 的 “真实化” 变换,具体流程(对应公式 :x=D2(y)=D2(D1(y))x={\mathcal {D}}^{2}(y)=\mathcal{D}_2(\mathcal{D}_1(y))x=D2(y)=D2(D1(y))),空间维度:HR(高分辨率,如 256×256)→ LR(低分辨率,如 64×64),尺寸缩小 r 倍(r=1/2/4,超分尺度);退化维度:HR(无退化,清晰)→ LR(叠加模糊、噪声、压缩、伪影,贴近真实);目标:让 LR 的 “退化分布” 与真实场景 LR 图像一致,确保模型学到的 “逆变换” 可迁移。

      • 步骤 处理操作 输入 输出
        第一轮退化(D1\mathcal{D}_1D1 1. 随机选择模糊核(高斯 / 广义高斯 / 平台核,概率 0.7/0.15/0.15); 2. 随机 resize(面积 / 双线性 / 双三次); 3. 随机加噪声(高斯 / 泊松,概率 0.5/0.5); 4. 随机应用 sinc 滤波(概率 0.1); 5. JPEG 压缩(q∈[30,95]) HR patch(256×256) 单轮退化图像(如 64×64,×4 超分)
        第二轮退化(D2\mathcal{D}_2D2 1. 随机选择模糊核(σ∈[0.2,1.5],小于第一轮); 2. 随机 resize(与第一轮不同参数); 3. 随机加噪声(sigma∈[1,25],小于第一轮); 4. JPEG 压缩(q∈[30,95]); 5. 随机应用 sinc 滤波(概率 0.8,与 JPEG 顺序随机) 单轮退化图像 最终 LR patch(与单轮退化尺寸一致)
      • 步骤 3:训练对管理(LR-HR 池),批量处理时,同一 batch 内的 LR 图像可能采用相同 resize 参数(如均为双三次插值),导致退化多样性不足;构建 “训练对池”,池大小设为 180,每次迭代随机从池中选择 48 个 LR-HR 对组成 batch(匹配 batch size=48);动态更新的、高多样性的训练 batch,用于网络训练。

  • 退化数据合成(feed_data 方法),通过两阶段随机退化模拟真实世界图像的复杂退化(模糊、噪声、压缩等),避免传统合成数据与真实场景分布偏差。

    • def feed_data(self, data):
          if self.is_train and self.opt.get('high_order_degradation', True):
              self.gt = data['gt'].to(self.device)  # 高清原图(GT)
              self.gt_usm = self.usm_sharpener(self.gt)  # 对GT进行USM锐化,增强细节损失
      
              # 退化核(论文中提到的模糊核采样)
              self.kernel1 = data['kernel1'].to(self.device)  # 第一阶段模糊核
              self.kernel2 = data['kernel2'].to(self.device)  # 第二阶段模糊核
              self.sinc_kernel = data['sinc_kernel'].to(self.device)  # 最终 sinc 滤波核
      
              ori_h, ori_w = self.gt.size()[2:4]  # GT原始尺寸
      
              # ----------------------- 第一阶段退化 -----------------------
              out = filter2D(self.gt_usm, self.kernel1)  # 1. 模糊(论文中的随机模糊核)
              # 2. 随机缩放(模拟分辨率变化)
              updown_type = random.choices(['up', 'down', 'keep'], self.opt['resize_prob'])[0]
              scale = np.random.uniform(...)  # 根据类型选择缩放比例
              out = F.interpolate(out, scale_factor=scale, mode=random.choice(['area', 'bilinear', 'bicubic']))
              # 3. 加噪声(高斯或泊松噪声,模拟传感器噪声)
              if np.random.uniform() < self.opt['gaussian_noise_prob']:
                  out = random_add_gaussian_noise_pt(...)
              else:
                  out = random_add_poisson_noise_pt(...)
              # 4. JPEG压缩(模拟压缩伪影)
              jpeg_p = out.new_zeros(out.size(0)).uniform_(*self.opt['jpeg_range'])  # 随机JPEG质量
              out = self.jpeger(out, quality=jpeg_p)
      
              # ----------------------- 第二阶段退化 -----------------------
              if np.random.uniform() < self.opt['second_blur_prob']:  # 随机二次模糊
                  out = filter2D(out, self.kernel2)
              # 再次随机缩放(增加退化多样性)
              updown_type = random.choices(['up', 'down', 'keep'], self.opt['resize_prob2'])[0]
              out = F.interpolate(out, size=(...), mode=...)
              # 再次加噪声(与第一阶段参数不同,增强多样性)
              ...  # 同第一阶段噪声逻辑,但参数为 noise_range2 等
              # 最终处理:JPEG压缩 + sinc滤波(模拟成像系统低通特性)
              if np.random.uniform() < 0.5:
                  # 先缩放回目标尺寸再滤波+压缩
                  out = F.interpolate(out, size=(ori_h//self.opt['scale'], ori_w//self.opt['scale']), mode=...)
                  out = filter2D(out, self.sinc_kernel)
                  out = self.jpeger(out, quality=jpeg_p)
              else:
                  # 先压缩再缩放+滤波(两种顺序增加多样性)
                  ...
      
              self.lq = torch.clamp((out * 255.0).round(), 0, 255) / 255.  # 归一化到[0,1]
              # 随机裁剪(保证GT和LQ尺寸匹配,论文中训练patch策略)
              (self.gt, self.gt_usm), self.lq = paired_random_crop(...)
              self._dequeue_and_enqueue()  # 加入训练对池
      
    • 强调 “高阶退化” 更接近真实(真实图像可能经历多次模糊 / 压缩),代码中通过两次独立的模糊、缩放、加噪、压缩实现。所有退化参数(如缩放比例、噪声强度、JPEG 质量)均从区间随机采样,避免退化模式单一(如 jpeg_range 通常设为 [30, 95],模拟不同压缩程度)。GT 尺寸为 (ori_h, ori_w),最终 LQ 尺寸为 (ori_h//scale, ori_w//scale)scale 为超分倍数,通常 4),确保网络学习从低清到高清的映射。

  • 训练对池(_dequeue_and_enqueue 方法),由于批量处理中退化参数可能趋同(如同一批次缩放比例相同),通过队列存储历史训练对,增加批次内退化多样性。

    • def _dequeue_and_enqueue(self):
          b, c, h, w = self.lq.size()
          if not hasattr(self, 'queue_lr'):
              # 初始化队列,大小为 queue_size(需被批次大小 b 整除)
              self.queue_lr = torch.zeros(self.queue_size, c, h, w).cuda()
              self.queue_gt = torch.zeros(self.queue_size, c, h, w).cuda()
              self.queue_ptr = 0
          if self.queue_ptr == self.queue_size:  # 队列满时,随机出队并加入新数据
              idx = torch.randperm(self.queue_size)  # 打乱队列
              self.queue_lr = self.queue_lr[idx]
              self.queue_gt = self.queue_gt[idx]
              # 取出前 b 个数据作为当前批次
              lq_dequeue = self.queue_lr[0:b, :, :, :].clone()
              gt_dequeue = self.queue_gt[0:b, :, :, :].clone()
              # 新数据入队
              self.queue_lr[0:b, :, :, :] = self.lq.clone()
              self.queue_gt[0:b, :, :, :] = self.gt.clone()
              # 更新当前批次为出队数据
              self.lq = lq_dequeue
              self.gt = gt_dequeue
          else:  # 队列未满时,仅入队
              self.queue_lr[self.queue_ptr:self.queue_ptr + b] = self.lq.clone()
              self.queue_gt[self.queue_ptr:self.queue_ptr + b] = self.gt.clone()
              self.queue_ptr += b
      
    • 队列大小 queue_size 通常设为 180(论文推荐),平衡多样性和内存消耗。若训练集中图像风格单一,可增大队列提升鲁棒性。

  • 模型优化与损失函数(optimize_parameters 方法),结合像素损失(L1)、感知损失(Perceptual)、GAN 损失,其中感知损失基于预训练 VGG 特征,GAN 损失用相对论判别器。

    • def optimize_parameters(self, current_iter):
          # 选择损失计算的目标(USM锐化后的GT或原始GT,论文中提到增强细节监督)
          l1_gt = self.gt_usm if self.opt['l1_gt_usm'] else self.gt
          percep_gt = self.gt_usm if self.opt['percep_gt_usm'] else self.gt
          gan_gt = self.gt_usm if self.opt['gan_gt_usm'] else self.gt
      
          # 优化生成器(每 net_d_iters 次迭代优化一次)
          for p in self.net_d.parameters():
              p.requires_grad = False  # 冻结判别器
          self.optimizer_g.zero_grad()
          self.output = self.net_g(self.lq)  # 生成超分结果
      
          l_g_total = 0
          # 1. 像素损失(L1损失,保证基本清晰度)
          if self.cri_pix:
              l_g_pix = self.cri_pix(self.output, l1_gt)
              l_g_total += l_g_pix * self.opt['pix_weight']  # 权重通常为1e-2
          # 2. 感知损失+风格损失(提升视觉质量,基于VGG特征)
          if self.cri_perceptual:
              l_g_percep, l_g_style = self.cri_perceptual(self.output, percep_gt)
              l_g_total += l_g_percep * self.opt['perceptual_weight']  # 通常为1
          # 3. GAN损失(对抗损失,提升真实感)
          fake_g_pred = self.net_d(self.output)
          l_g_gan = self.cri_gan(fake_g_pred, True, is_disc=False)
          l_g_total += l_g_gan * self.opt['gan_weight']  # 通常为5e-3
      
          l_g_total.backward()
          self.optimizer_g.step()
      
          # 优化判别器(每次迭代都优化)
          for p in self.net_d.parameters():
              p.requires_grad = True  # 解冻判别器
          self.optimizer_d.zero_grad()
          # 真实图像判别损失
          real_d_pred = self.net_d(gan_gt)
          l_d_real = self.cri_gan(real_d_pred, True, is_disc=True)
          # 生成图像判别损失
          fake_d_pred = self.net_d(self.output.detach())  #  detach 避免生成器梯度传播
          l_d_fake = self.cri_gan(fake_d_pred, False, is_disc=True)
          (l_d_real + l_d_fake).backward()
          self.optimizer_d.step()
      
    • pix_weight:像素损失权重(小权重避免过度平滑,通常 0.01)。perceptual_weight:感知损失权重(主导视觉质量,通常 1.0)。gan_weight:GAN 损失权重(控制真实感,过大会导致伪影,通常 0.005)。net_d_iters:判别器迭代次数(通常 1,即生成器每更新 1 次,判别器更新 1 次)。

数据管理与退化开发流程

  • 输入:高清图像(GT),无需预先准备 LQ 图像(代码动态生成)。支持常见图像格式(PNG/JPG),推荐分辨率 ≥ 1024x1024(保证退化后仍有足够细节)。可根据目标场景调整(如监控图像可增大噪声范围,压缩图像可减小 JPEG 质量下限)。退化参数配置(在 options/train_realesrgan_x4plus.yml 中):

    • # 第一阶段退化参数
      resize_range: [0.125, 1.5]  # 缩放范围
      gaussian_noise_prob: 0.5  # 高斯噪声概率
      noise_range: [1, 30]  # 噪声强度范围
      jpeg_range: [30, 95]  # JPEG质量范围
      # 第二阶段退化参数
      second_blur_prob: 0.8  # 二次模糊概率
      resize_range2: [0.125, 1.5]
      
  • 训练时,feed_data 实时从 GT 生成 LQ,避免存储海量 LQ 图像(节省磁盘空间)。验证时,nondist_validation 关闭合成退化,直接使用输入的 LQ 图像(保证验证真实性)。

  • 先训练 ESRNet(无 GAN 损失):train_realesrnet_x4plus.yml,稳定像素级重建。再用 ESRNet 权重初始化 ESRGAN:train_realesrgan_x4plus.yml,加入 GAN 损失提升真实感。队列大小 queue_size:增大可提升多样性,但需更多 GPU 内存(建议 180 起步)。退化强度:若模型在真实数据上过平滑,可增大噪声 / 压缩强度(如 noise_range 调至 [5, 50])。学习率:生成器 1e-4,判别器 1e-4,用余弦退火衰减(cosine 学习率策略)。

  • # 1. 安装依赖
    pip install basicsr facexlib gfpgan
    # 2. 准备GT数据集(放在 datasets/GT 目录)
    # 3. 训练ESRNet
    python realesrgan/train.py -opt options/train_realesrnet_x4plus.yml
    # 4. 用ESRNet权重训练ESRGAN
    python realesrgan/train.py -opt options/train_realesrgan_x4plus.yml
    

训练技巧(Tricks)与实现细节

  • Real-ESRGAN 的训练效果不仅依赖模块设计,还得益于多个针对性技巧,解决 “训练不稳定”“泛化性差”“视觉效果不足” 等问题。第一阶段:训练Real-ESRNet(仅 L1 损失,PSNR 导向),迭代 1000K 次,学习率 2×10⁻⁴,从 ESRGAN 预训练模型微调;第二阶段:以 Real-ESRNet 为生成器初始参数,训练Real-ESRGAN(L1 + 感知 + GAN 损失),迭代 400K 次,学习率 1×10⁻⁴。第一阶段:通过 L1 损失让模型先掌握 “像素级精准恢复” 能力,避免直接用 GAN 训练导致的 “模型发散”(如颜色严重失真);第二阶段:在精准度基础上,通过感知 + GAN 损失提升视觉真实度,实现 “精准 + 逼真” 的平衡。

  • 指数移动平均(EMA):稳定训练与提升性能,训练过程中,对生成器参数维护一个 “移动平均副本”(EMA 参数),更新公式为:EMA_param=α×EMA_param+(1−α)×current_paramEMA\_param = \alpha \times EMA\_param + (1-\alpha) \times current\_paramEMA_param=α×EMA_param+(1α)×current_param,α 设为 0.999;抑制参数震荡:避免训练后期参数因噪声波动导致的性能不稳定;提升最终效果:EMA 参数是 “多步参数的平滑版本”,推理时使用 EMA 参数,SR 图像的纹理更连贯(如避免局部纹理断裂)。

  • 锐化 Ground Truth(Real-ESRGAN+):提升视觉锐度,训练时对 HR 图像(Ground Truth)进行轻微锐化(非 USM 算法,避免过冲伪影),用锐化后的 HR 训练模型,得到 Real-ESRGAN + 变体;解决传统超分 “锐度不足” 问题:人类视觉对锐度敏感,轻微锐化 HR 可引导生成器输出更锐利的 SR(如文字边缘更清晰);无额外伪影:区别于后期 USM 锐化(易引入过冲),训练时锐化 HR 让模型 “自然学习锐化”,避免伪影。

  • CUDA 加速退化:提升训练效率,将退化模型的所有操作(模糊、噪声、JPEG 压缩)用 PyTorch+CUDA 实现,而非 CPU,实现 “实时合成训练对”;避免数据预处理瓶颈:传统方法需提前生成并存储 LR-HR 对(占用 TB 级存储),实时合成节省存储;提升训练速度:CUDA 加速让退化过程耗时可忽略,确保训练流程不被数据生成拖累。

  • 论文提出了一套模拟真实世界退化的合成策略,通过对高清图像施加多样化退化(如随机模糊核、噪声、JPEG 压缩等),生成与真实低清图像分布接近的训练数据。代码中,realesrgan/data/ 目录包含数据处理相关模块。训练脚本 realesrgan/train.py 结合 BasicSR 工具库(论文中提到的基础框架),支持在训练时动态生成退化数据,无需预先存储海量低清 - 高清配对数据。

  • 生成器:保留 ESRGAN 的 Residual-in-Residual Dense Block(RRDB)结构,但调整了激活函数和归一化方式,提升特征表达能力。代码中 realesrgan/archs/ 目录存放网络结构定义,对应论文中生成器的实现。判别器:采用多尺度判别器,增强对图像细节的区分能力,确保生成图像的真实性。测试代码 tests/test_discriminator_arch.py 验证了判别器的正确性

  • 感知损失:结合感知损失(Perceptual Loss)和 GAN 损失,平衡图像清晰度与自然度。代码中训练配置(如 options/finetune_realesrgan_x4plus.yml)包含损失函数的参数设置。推理支持inference_realesrgan.py 支持图像超分,支持分块处理(tile)、alpha 通道、灰度图等特殊场景,解决大图像显存不足问题,提升实用性。docs/Training.md 详细说明训练流程,支持在自定义数据集上微调(如 options/ 目录的配置文件),方便用户针对特定场景优化。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐