- 人工智能
- 深度学习
- 计算机视觉
- 图像处理
【免费下载链接】ESRGAN
ECCV18 Workshops - Enhanced SRGAN. Champion PIRM Challenge on Perceptual Super-Resolution. The training codes are in BasicSR.
本文以仓库 README.md 为主线,完整梳理 ESRGAN(Enhanced Super-Resolution Generative Adversarial Networks)的核心设计、推理测试、网络插值策略与训练经验,并结合仓库内的 RRDBNet_arch.py、test.py、net_interp.py 等源码逐行印证其底层实现。读完本文,你将能够独立完成 ESRGAN 的模型推理、在 PSNR 与感知质量之间平滑权衡的网络插值操作,并理解 RRDB 网络结构、残差缩放等关键技术细节,为迁移到 Real-ESRGAN 等更实用的真实图像复原方案打下基础。
一、项目背景:从 SRGAN 到 ESRGAN 的演进
ESRGAN 由 Xintao Wang 等人提出,论文《ESRGAN: Enhanced super-resolution generative adversarial networks》发表于 ECCV 2018 Workshops(ECCVW),并在 PIRM2018-SR 感知超分竞赛的 region 3 中夺得第一名、获得最佳感知指数(perceptual index)。作为 SRGAN 的增强版本,ESRGAN 在生成对抗网络框架下同时追求感知质量与结构保真。
需要说明的是,本仓库(ESRGAN)定位明确:训练代码位于 BasicSR 工具箱中,本仓库只提供简单的测试(推理)代码、预训练模型与网络插值演示。README 同时指出,由于部分仓库依赖本仓库代码,作者将保持本仓库(尤其是代码部分)稳定不变。此外,作者已将 ESRGAN 进一步扩展为Real-ESRGAN——一个面向真实世界图像复原的实用算法,可以去除恼人的 JPEG 压缩伪影;Real-ESRGAN 提供了更便捷的推理脚本(支持 tile 推理、alpha 通道、灰度图、16-bit 图像)以及无需安装环境的 Windows 可执行文件RealESRGAN-ncnn-vulkan(内含原始 ESRGAN 模型),原始 ESRGAN 模型与重训练模型均可在其中继续使用。若你以真实图像修复为目标,README 推荐直接尝试 Real-ESRGAN。
引用本仓库工作时的 BibTeX 如下:
@InProceedings{wang2018esrgan, author = {Wang, Xintao and Yu, Ke and Wu, Shixiang and Gu, Jinjin and Liu, Yihao and Dong, Chao and Qiao, Yu and Loy, Chen Change}, title = {ESRGAN: Enhanced super-resolution generative adversarial networks}, booktitle = {The European Conference on Computer Vision Workshops (ECCVW)}, month = {September}, year = {2018} }二、三大核心改进:RRDB、相对平均 GAN 与激活前特征感知损失
README 明确列出 ESRGAN 相对 SRGAN 的三个改进方向,这是理解整个模型的关键:
- 采用不含批归一化(BN)层的更深网络:使用 Residual-in-Residual Dense Block(RRDB)作为基本模块,移除 BN 层;
- 使用 Relativistic average GAN 替代 vanilla GAN,让判别器判断"真实图像比生成图像更真实的概率",而非简单地判断图像真伪;
- 改进感知损失:使用激活之前的特征(features before activation)来计算感知损失,保留更多有判别力的信息。
其中第一点与 SRGAN 的结论形成鲜明对比:SRGAN 论文声称"更深的模型越来越难训练",而 ESRGAN 采用无 BN 的 RRDB 结构后,更深模型不仅易训练,而且性能更优。
2.1 RRDB 网络结构的源码印证
仓库中的 RRDBNet_arch.py 就是推理所依赖的完整网络定义,包含三个层次:
ResidualDenseBlock_5C(5 层稠密连接残差块)(RRDBNet_arch.py):nf=64为特征通道数,gc=32为 growth channel(中间增长通道数)。前向过程把每一层输出逐级拼接到后续输入(torch.cat),最终输出为x5 * 0.2 + x,其中0.2 即残差缩放系数(residual scaling),用于稳定深层网络训练。
def forward(self, x): x1 = self.lrelu(self.conv1(x)) x2 = self.lrelu(self.conv2(torch.cat((x, x1), 1))) x3 = self.lrelu(self.conv3(torch.cat((x, x1, x2), 1))) x4 = self.lrelu(self.conv4(torch.cat((x, x1, x2, x3), 1))) x5 = self.conv5(torch.cat((x, x1, x2, x3, x4), 1)) return x5 * 0.2 + xRRDB(Residual in Residual Dense Block)(RRDBNet_arch.py):由 3 个 RDB 级联而成,输出同样乘以 0.2 再与输入相加,形成"残差中的残差"结构。
RRDBNet(完整生成器)(RRDBNet_arch.py):构造函数签名RRDBNet(in_nc, out_nc, nf, nb, gc=32),其中nb=23表示 RRDB trunk 中堆叠 23 个 RRDB 块。上采样部分采用两次F.interpolate(..., scale_factor=2, mode='nearest')配合upconv1/upconv2,实现 4 倍(x4)超分;激活函数统一使用LeakyReLU(negative_slope=0.2)。所有卷积均为 3×3、padding=1、含 bias,整个生成器没有任何 BN 层,这一点与 README 的核心改进完全一致。
下图展示了 ESRGAN 的整体生成器架构与 RRDB 模块细节(来自 figures/architecture.jpg 与 figures/RRDB.png):
2.2 深层网络训练的实用技巧
README 特别总结了训练极深网络的两条经验(详见论文附录):
- 残差缩放(residual scaling):每个残差分支乘以小于 1 的系数(本仓库实现中为 0.2),避免深层梯度爆炸;
- 更小的初始化(smaller initialization):以较小尺度初始化卷积权重,保证训练初期数值稳定。
对比图见 figures/train_deeper_neta.png 与 figures/train_deeper_netb.png。
2.3 训练 patch size 的影响
README 还给出一个经验性观察:更深网络从更大的训练 patch 中获益更多。在 Set5 数据集(RGB 通道)上评估,深层模型随 patch 增大提升约 0.12dB,而浅层模型仅提升约 0.04dB——更大的模型容量能充分利用更大的训练 patch(对比图见 figures/patch_a.png 与 figures/patch_b.png)。
三、快速上手:环境依赖与推理测试
3.1 依赖与环境
README 列出的依赖非常精简:
- Python 3
- PyTorch >= 1.0(若通过 CUDA 安装,要求 CUDA 版本 >= 7.5)
- Python 包:
pip install numpy opencv-python
3.2 推理四步走
- 克隆仓库并进入目录:
git clone https://gitcode.com/gh_mirrors/es/ESRGAN cd ESRGAN- 将你自己的低分辨率图像放入
./LR文件夹(仓库已提供baboon与comic两张示例图,位于 LR/)。 - 下载预训练模型(README 提供 Google Drive 与百度网盘两种途径),放入
./models目录。仓库提供两个模型:高感知质量模型与高 PSNR模型,详见 models/README.md。 - 运行推理:
python test.py- 结果输出到
./results文件夹。
3.3 test.py 源码逐行解读
test.py 是本仓库唯一的推理入口,其关键逻辑如下:
model_path = 'models/RRDB_ESRGAN_x4.pth' # models/RRDB_ESRGAN_x4.pth OR models/RRDB_PSNR_x4.pth device = torch.device('cuda') # if you want to run on CPU, change 'cuda' -> cpu- 模型路径(第 8 行):通过修改
model_path变量在RRDB_ESRGAN_x4.pth与RRDB_PSNR_x4.pth之间切换;README 原始工作流中也支持直接以命令行参数形式指定模型路径(如python test.py models/interp_08.pth),若你的版本不接受该参数,直接改model_path即可。 - 运行设备(第 9-10 行):默认
cuda,CPU 环境将'cuda'改为'cpu'。 - 网络实例化(第 14 行):
arch.RRDBNet(3, 3, 64, 23, gc=32)对应"输入 3 通道、输出 3 通道、特征通道 64、23 个 RRDB、增长通道 32"。 - 图像预处理(第 27-31 行):
cv2.imread以 BGR 顺序读图,除以 255 归一化到 [0,1],再通过img[:, :, [2, 1, 0]]将 BGR 转 RGB 并调整维度为(C, H, W),最后unsqueeze(0)增加 batch 维度。 - 前向推理(第 33-35 行):在
torch.no_grad()下完成前向,输出经clamp_(0, 1)截断到合法像素范围。 - 结果保存(第 35-37 行):再次做 RGB→BGR 通道还原、乘以 255 取整,写入
results/{文件名}_rlt.png。
3.4 预训练模型说明
models/README.md 给出了两个预训练模型的关键信息:
RRDB_ESRGAN_x4.pth:论文中使用的最终 ESRGAN 模型,侧重感知质量;RRDB_PSNR_x4.pth:PSNR 导向模型,具有高 PSNR 表现。
⚠️重要前提:两个模型均在MATLAB bicubic 下采样核下训练。如果实际低分辨率图像的降采样核与此不一致,结果可能出现伪影——这是使用预训练模型时最常见的坑,需根据图像来源判断是否适用。
此外,仓库中的 transer_RRDB_models.py 提供了一个模型权重转换脚本:若下载到的旧格式 checkpoint 带有module.前缀或使用model.0、model.1.sub等旧命名,该脚本会将其键名映射到RRDBNet的state_dict格式(如conv_first.weight、RRDB_trunk.*、upconv1/upconv2、HRconv、conv_last),便于直接用 test.py 加载。
四、网络插值(Network Interpolation):在感知质量与 PSNR 之间自由权衡
网络插值是 ESRGAN 论文提出的重要策略:通过对RRDB_ESRGAN(感知质量模型)与RRDB_PSNR(PSNR 导向模型)的权重进行线性插值,获得介于两者之间的模型,从而平滑地控制输出在"视觉美观"与"数值保真"之间的位置。
4.1 使用步骤(README 原文流程)
- 运行
python net_interp.py 0.8,其中0.8是插值参数alpha,可取[0, 1]内任意值; - 运行
python test.py models/interp_08.pth,其中models/interp_08.pth为生成的插值模型路径。
4.2 net_interp.py 源码解析
net_interp.py 的实现非常简洁、可读性极高:
alpha = float(sys.argv[1]) net_PSNR_path = './models/RRDB_PSNR_x4.pth' net_ESRGAN_path = './models/RRDB_ESRGAN_x4.pth' net_interp_path = './models/interp_{:02d}.pth'.format(int(alpha*10)) net_PSNR = torch.load(net_PSNR_path) net_ESRGAN = torch.load(net_ESRGAN_path) net_interp = OrderedDict() for k, v_PSNR in net_PSNR.items(): v_ESRGAN = net_ESRGAN[k] net_interp[k] = (1 - alpha) * v_PSNR + alpha * v_ESRGAN torch.save(net_interp, net_interp_path)要点:
alpha=0时插值结果完全等于 PSNR 模型,alpha=1时完全等于 ESRGAN 模型;- 权重插值**逐键(per-tensor)**进行,两模型结构必须完全一致(均为
RRDBNet(3,3,64,23,gc=32)); - 输出文件按
int(alpha*10)命名,例如alpha=0.8生成models/interp_08.pth、alpha=0.5生成interp_05.pth。
4.3 插值效果
下图展示了随插值参数从 0 变化到 1 时输出图像在"清晰度/结构"与"感知纹理"之间的连续过渡(来自 figures/net_interp.jpg):
README 特别指出一个有趣现象:网络插值策略能够对 RRDB_PSNR 模型与微调后的 ESRGAN 模型提供平滑、连续的控制。仓库还提供了两张插值过程的平滑动画示例(figures/81.gif 与 figures/102061.gif),直观展示了从 PSNR 导向逐步过渡到感知导向的动态效果。
五、量化表现:PSNR 对比与感知驱动结果
5.1 RRDB 在标准基准上的 PSNR 表现
README 强调,使用DF2K 数据集(由 DIV2K 与 Flickr2K 合并而成,后者由 EDSR 工作提出)训练的RRDB_PSNRPSNR 导向模型同样具备极高的 PSNR 性能。原表数值如下(单元格格式为 PSNR / SSIM 两项指标):
| Method | Training dataset | Set5 | Set14 | BSD100 | Urban100 | Manga109 |
|---|---|---|---|---|---|---|
| SRCNN | 291 | 30.48/0.8628 | 27.50/0.7513 | 26.90/0.7101 | 24.52/0.7221 | 27.58/0.8555 |
| EDSR | DIV2K | 32.46/0.8968 | 28.80/0.7876 | 27.71/0.7420 | 26.64/0.8033 | 31.02/0.9148 |
| RCAN | DIV2K | 32.63/0.9002 | 28.87/0.7889 | 27.77/0.7436 | 26.82/0.8087 | 31.22/0.9173 |
| RRDB (ours) | DF2K | 32.73/0.9011 | 28.99/0.7917 | 27.85/0.7455 | 27.03/0.8153 | 31.66/0.9196 |
可见 RRDB 在全部五个基准上均取得最高数值。示例结果图可参考 figures/baboon.jpg,推理输出示例见 results/baboon_ESRGAN.png。
5.2 感知驱动(perceptual-driven)结果
README 还提供了一张覆盖多数据集的感知驱动结果清单(结果可从项目公布的网盘获取,HR 图像可从 BasicSR 数据集页面下载)。数据集覆盖Set5、Set14、BSDS100、PIRM(val, test)、OST300、urban100、DIV2K(val, test),对比方法包括 ESRGAN、SRGAN、EnhanceNet 与 CX:
| Datasets | LR | ESRGAN | SRGAN | EnhanceNet | CX |
|---|---|---|---|---|---|
| Set5 | ✅ | ✅ | ✅ | ✅ | 🕐 |
| Set14 | ✅ | ✅ | ✅ | ✅ | 🕐 |
| BSDS100 | ✅ | ✅ | ✅ | ✅ | 🕐 |
| PIRM(val, test) | ✅ | ✅ | ✅ | ❌ | ✅ |
| OST300 | ✅ | ✅ | ✅ | ❌ | 🕐 |
| urban100 | ✅ | ✅ | ✅ | ❌ | 🕐 |
| DIV2K(val, test) | ✅ | ✅ | ✅ | ❌ | 🕐 |
(✅ 表示已提供,❌ 表示未包含,🕐 表示 TODO。)
六、消融实验与 BN 伪影
6.1 消融实验
figures/abalation_study.png 展示了 ESRGAN 各组件的消融对比:每一列代表一种配置组合(表头标注配置),红色标记表示相对前一模型的主要提升点。通过逐列对比可以清晰看出 RRDB 结构、相对平均 GAN 与激活前特征感知损失各自对最终视觉质量的贡献。
6.2 BN 伪影(BN artifacts)
README 报告了一个重要经验性发现:BN 层倾向于带来伪影。这些被称为 "BN artifacts" 的伪影会偶尔出现在不同迭代与不同设置下,违背了训练稳定性需求。实验表明以下因素会影响 BN 伪影的出现:
- 网络深度(depth)
- BN 层的位置(position)
- 训练数据集
- 训练损失
这正是 ESRGAN 全面移除 BN 层的关键动机之一,具体现象见 figures/BN_artifacts.jpg。
七、常见问题(FAQ):复现 PIRM18-SR 竞赛结果
QA.md 回答了社区最关心的两个问题,对理解"论文模型 vs 发布模型"的差异极有帮助:
Q1:如何复现 PIRM18-SR 挑战赛的低感知指数结果?
- 发布在仓库中的
RRDB_ESRGAN_x4.pth不同于竞赛提交模型。作者发现更低的感知指数并不总是对应更好的视觉效果——竞赛目标是压低感知指数,而 ESRGAN 工作的目标是更好的视觉质量。 - 竞赛场景下作者使用了若干技巧(见论文 Sec 4.5),并配合 MATLAB 后处理
main_reverse_filter.m来进一步优化感知指数。复现流程为:下载竞赛模型与代码 → 将 LR 图像放入LR文件夹 →python test.py→ 在 MATLAB 中运行main_reverse_filter.m后处理。作者机器上的复现结果为:Perceptual index: 1.9777,RMSE: 15.304(对应组别 SuperSR)。
Q2:论文中的感知指数如何获得?
- 论文 Fig. 2(PIRM 自验证集)使用竞赛提交模型并施加与竞赛相同的后处理,目的是展示感知-失真平面(perception-distortion plane);
- 论文 Fig. 7使用仓库发布的
RRDB_ESRGAN_x4.pth测试,且不做任何后处理,以呈现发布模型的真实感知质量。
这一 FAQ 提醒读者:感知指数(PI)在大尺度上与人工评分相关性良好,但在更细粒度上并非始终吻合,这也凸显了更优质感知质量指标的必要性。
八、总结与延伸
ESRGAN 在三个方面对 SRGAN 做了系统性升级:无 BN 的 RRDB 深度网络(配合残差缩放与更小初始化)、相对平均 GAN与激活前特征感知损失,并凭借网络插值策略在数值保真与感知质量之间提供可控的权衡。本仓库虽只提供推理与插值演示(训练代码位于 BasicSR),但代码量小、结构清晰,是学习感知超分原理的理想起点。
若你的目标是真实世界图像的复原(如去除 JPEG 压缩伪影、处理任意退化核),README 明确推荐升级到 Real-ESRGAN——它保留了对本仓库RRDB_ESRGAN_x4.pth及重训练模型的兼容使用,并提供了 tile 推理、alpha 通道、灰度图、16-bit 图像支持及开箱即用的 Windows 可执行版本。从本仓库的推理脚本出发,再迁移到 Real-ESRGAN 的推理脚本,是平滑且值得推荐的进阶路径。
进一步阅读仓库资源:README.md(项目总览)、QA.md(竞赛复现 FAQ)、RRDBNet_arch.py(网络定义)、test.py(推理脚本)、net_interp.py(网络插值脚本)、transer_RRDB_models.py(旧权重转换)、models/README.md(模型说明)。
- 人工智能
- 深度学习
- 计算机视觉
- 图像处理
【免费下载链接】ESRGAN
ECCV18 Workshops - Enhanced SRGAN. Champion PIRM Challenge on Perceptual Super-Resolution. The training codes are in BasicSR.
相关推荐
MMagic 中的 RealBasicVSR 实战:真实世界视频超分辨率的网络原理、两阶段训练与推理指南
MMagic 中的 RealBasicVSR 实战:真实世界视频超分辨率的网络原理、两阶段训练与推理指南 本指南以 OpenMMLab MMagic 仓库中的
媒体生成计算机视觉深度学习人工智能大模型ESRGAN超分辨率实战指南:从原理到应用的完整教程
ESRGAN超分辨率实战指南:从原理到应用的完整教程 ESRGAN(Enhanced Super Resolution Generative Adversari
人工智能深度学习计算机视觉图像处理GluonCV SRGAN 实战指南:基于 DIV2K 数据集的 4 倍超分辨率网络训练、监控与推理
GluonCV SRGAN 实战指南:基于 DIV2K 数据集的 4 倍超分辨率网络训练、监控与推理 本篇技术指南围绕 GluonCV 仓库中的 SRGAN 官
计算机视觉深度学习预训练
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考