【图像恢复算法】使用Real-ESRGAN进行超分辨率
注:本文部分原配图已遗失,相关步骤以文字说明为准,不影响操作。
什么是ESRGAN,以及什么是Real-ESRGAN
1.ESRGAN
ESRGAN 由 Xintao Wang 等人于 2018 年提出,旨在通过对抗生成网络(GAN)进一步提升图像超分辨率重建的视觉效果。它是在 SRGAN(Super‑Resolution GAN)的基础上改进而来,重点解决了高频细节表现不足和生成结果偏“平滑”的问题。
优点:生成的细节更丰富、纹理更自然;在多项基准测试(如 DIV2K)上视觉效果显著提升。 局限:主要针对“理想降采样”场景(bicubic 降采样);对真实世界的噪声、模糊等退化情况适应性较差。
2.Real-ESRGAN
真实场景中的低分图像通常包含各种不可预知的退化:相机噪声、压缩伪影、镜头模糊等。Real‑ESRGAN 在 ESRGAN 的基础上,引入更贴近真实退化的训练策略,使模型对多种劣化情况具备鲁棒性。
对各种真实低质图像(监控、老照片、网络截图等)具有更好恢复能力。 在公开的“RealSR”数据集上,相比 ESRGAN、SRGAN 等传统方法,主观和客观指标均有显著提升。
所需要的环境配置
首先,你得有NVIDIA独立显卡,这点我认为是很重要的
这边来讲讲原因:
因为,首先依赖的环境就是Python和Pytorch了,你要是没有NVIDIA显卡吧,也不是不能装Pytorch吧,毕竟Pytorch不仅有CUDA版本,也确实是有CPU版本的,但是拿来跑模型,那肯定是速度感人的,你也不想别人几分钟出结果的事情,自己需要跑上几个小时甚至十几二十个小时吧,CPU累不累我不知道,但你肯定累了
下面我就来讲讲我的环境配置吧
首先因为笔者的电脑条件是这样的,配上了最新的RTX5060,但是由于Pytorch官方那边对50系显卡的支持不是很充足,加上消息比较闭塞,笔者为了配上这个适配的Pytorch也是走了很多很多的弯路,花费了不少时间。
以下是笔者整理出来反映了部分主流GPU架构与计算能力(Compute Capability)版本的关键对应关系
| 计算能力版本 | 对应架构 | 代表性产品或系列 |
|---|---|---|
| sm_50 | Maxwell(GM20x) | GeForce GTX 900 系列(如 GTX 980、GTX 970)、GTX 750 Ti |
| sm_60 | Pascal(GP100) | GeForce GTX 1000系列 (如GTX 1080), Tesla P100 |
| sm_70 | Volta(GV100) | Tesla V100, Titan V |
| sm_75 | Turing(TU10x) | GeForce RTX 2000系列 (如RTX 2080 Ti), Quadro RTX 系列 |
| sm_80 | Ampere(GA100) | NVIDIA A100、A800、Tesla A100 |
| sm_86 | Ampere(GA10x) | GeForce RTX 3000系列 |
| sm_89 | Ada Lovelace(AD10x) | GeForce RTX 4000系列(如RTX4060、RTX4090) |
| sm_90 | Hopper(GH100) | NVIDIA H100、H800 |
| sm_120(sm_90a) | Blackwell(GB10x) | GeForce RTX 5000系列(如RTX5060) |
其次我们需要了解不同版本的CUDA Toolkit的支持
一般而言,高版本的是可以向低配置兼容的,比如RTX 3000 系列(sm_86)完全可以安装高版本 CUDA Toolkit(比如 CUDA 12.1/12.2/12.4),这正是 CUDA 版本 “向下兼容” 的体现:
- 高版本 CUDA(如 12.x)的设计目标之一就是支持更低计算能力的 GPU(只要该 GPU 的计算能力在高版本 CUDA 的支持范围内);
- sm_86 在 CUDA 11.1 及以上版本都被支持,而 CUDA 12.x 的支持范围是 sm_52 ~ sm_90a,完全包含 sm_86,因此 RTX 3000 系列装 CUDA 12.x 是完全兼容的,不会出现 “装不上” 或 “识别不到 GPU” 的问题。
但是
高版本 CUDA 对低配置的向下兼容 —— 是,但有边界
CUDA 的 “向下兼容” 不是无限制的,而是 “高版本 CUDA 支持低计算能力的 GPU,但低版本 CUDA 不支持高计算能力的 GPU”:
| 场景 | 兼容性 | 举例 |
|---|---|---|
| 高版本 CUDA → 低计算能力 GPU | ✅ 兼容 | CUDA 12.4(支持 sm_52~90a)可以运行 sm_86(RTX 3000)、sm_75(RTX 2000) |
| 低版本 CUDA → 高计算能力 GPU | ❌ 不兼容 | CUDA 10.2(最高支持 sm_75)无法运行 sm_86(RTX 3000) |
装了高版本 CUDA,PyTorch 是否需要装低配版?—— 不需要!
这是核心误区:PyTorch 版本的选择取决于 “PyTorch 是否支持你安装的 CUDA 版本”,而非直接取决于 GPU 计算能力。
对 RTX 3000(sm_86)来说:
- 如果你装了 CUDA 12.4(高版本),完全可以安装支持 CUDA 12.4 的最新 PyTorch 版本(比如 2.4.1、2.5.0),而非 “必须装低配 PyTorch”;
- 这些高版本 PyTorch 会通过 CUDA 12.4 适配你的 sm_86 GPU,既能用上 PyTorch 的新功能(比如 2.x 的编译优化、AI 加速),又能正常调用 RTX 3000 的算力;
那么问题来了,笔者是怎么陷入困境的呢。。。
其实是笔者在一开始并不知道Pytorch官方还没推出能支持RTX5000系列Blackwell架构的稳定版本,加上笔者之前装的CUDA Toolkit是最新版的13.1.x系列,这些都是不受到Pytorch官方稳定支持或者不支持的。
加上信息比较闭塞,在一开始并不是很了解这个迭代时间,毕竟13.1.x和RTX5000系显卡也有快一年时间了,网上提起的配置方案也大多是24年9月到10月份的,距离我配置也有3至4个月的时间了,总该有点变化了吧。。。但是结果确实是挺令我发懵的哈哈哈
因为我看其他师傅们的文章上讲的也基本是是说,目前pytorch官方还没推出能支持sm_120的稳定版,所以也只能是跟着他们一起用Preview(Nightly)的版本了,这个版本属于是一个尝鲜版,是官方预发布的开发版本。但是能用来过度还是拿来先过渡会比较好,总比用不上得好。
以下是Pytorch官网链接,自行按需选择:Get Started
CUDAToolkit下载链接:CUDA Toolkit Archive
cuDNN下载链接:cuDNN 9.18.1 Downloads | NVIDIA Developer
以下是我个人的配置,按需求来装
Python --3.11
Pytorch --Preview(Nightly) --CUDA13.0
CUDA Toolkit --13.0.2
cuDNN --9.18.1
安装教程可以自行去了解,这里就不多讲了吧
接下来就是将Real-ESRGAN下载到本地,由于官方的文件是在GitHub上开源的,再加出于对原作者的尊重,我这边是不提供网盘链接的,所以可以选择自己去github上下载
防止有小笨蛋找不到模型所在地,这边也把模型下载地址给一下:Real-ESRGAN/docs/model_zoo.md at master · xinntao/Real-ESRGAN
当然,也可以直接克隆到本地
git clone https://github.com/xinntao/Real-ESRGAN.git
cd Real-ESRGAN
然后就是安装各种依赖
# 安装 basicsr - https://github.com/xinntao/BasicSR
# 使用BasicSR来训练以及推断
pip install basicsr
# facexlib和gfpgan是用来增强人脸的
pip install facexlib
pip install gfpgan
pip install -r requirements.txt
python setup.py develop
这边为了防止有人不知道各个模型的区别,讲讲吧
realesr-animevideov3:动漫视频 4× 超分辨率 realesrgan-x4plus:真实照片 4× 超分辨率 realesrgan-x4plus-anime:动漫/插画 4× 超分辨率
大致是这样的
这里值得一提的是,RealESRGAN_x4plus.pth 和 RealESRGAN_x4plus_anime_6B 的区别在于,后者anime针对模型尺寸小得多的动漫图像进行了优化。
接下来就是实战环节
先看看你自己拿到的项目里面有啥
- inference_realesrgan.py:推理图片
- inference_realesrgan_video.py:推理视频
- input:输入图片路径或者文件夹路径,若是文件夹路径,则批量将文件夹下所有图片进行转化
- results:输出结果文件夹,转化后的文件都会放到这个文件夹里面去
- weights:权重文件夹,你需要把你要用到的模型都放到这个文件夹里面去
首先进入终端,Real-ESRGAN是可以直接在命令窗口执行的,
注意:要先进入Real-ESRGAN项目所在目录
也就是先cd至Real-ESRGAN项目所在目录
然后进入你对应的Python环境
推荐使用专门准备的Python虚拟环境,以免跟本地其他环境冲突
D:\python_text\.venv\Scripts\activate.bat
大致就是这样,然后回车进入虚拟环境
接着就是一些对应的执行命令
注意别忘了把你需要执行的文件放在inputs这个目录下面
接下来我们就讲一下,
使用RealESRGAN_x4plus_anime_6B对动漫图片进行超分辨率的演示
python inference_realesrgan.py -n RealESRGAN_x4plus_anime_6B -i inputs -o results --suffix outx4_anime --fp32 --gpu-id 0
这条命令就是通过inference_realesrgan.py,调用RealESRGAN_x4plus_anmie_6B模型,将inputs目录下的可执行文件进行4倍超分辨率,然后将结果输出到results目录下
–fp32 指定精度
–gpu-id 0 指定使用第一个GPU,防止出现识别不到GPU或者识别不到你想要执行的GPU
当然,像我这种小显存的显卡,一次性对整张图片(1080P)进行4倍超分至4K,这种情况下显存是远远不够用的
一旦出现显存不够的情况,轻则是速度慢吞吞,但好歹给你吐出来了,重则呢?就是执行过程中因为共享GPU内存也吃满了还是不够用,导致的执行中断,白跑一趟
主要原因还是消费级的内存频率太低了,即便是DDR5这种高频的内存,其带宽相对于GDDR6X、GDDR7,HBM这种高带宽内存来说,还是极低的。
这个时候我们可以通过在命令的后面指定分块大小
–tile 400
python inference_realesrgan.py -n RealESRGAN_x4plus_anime_6B -i inputs -o results --outx4_anime --fp32 --gpu-id 0 --tile 400
通过指定分块大小,让显卡在自身所带的显存超高速率优势下跑满,RTX5060Laptop在tile为400的条件下完成对一张1080p图片的四倍超分,往往只需要短短几秒钟,但是在显存溢出,内存调度不过来的时候,这个时间可以达到几分钟
当然,你也可以选择调到tile500,8GB显存下应该也差不多
然后来详细拆解一下这个执行的命令
| 部分 | 含义 | 说明 |
|---|---|---|
| python | Python 解释器 | 调用 Python 运行脚本 |
| inference_realesrgan.py | 主推理脚本 | Real-ESRGAN 官方提供的推理脚本,用于执行图像超分辨率 |
| -n RealESRGAN_x4plus_anime_6B | 模型名称 | 指定使用的预训练模型:• RealESRGAN - 模型架构• x4plus - 4倍放大,增强版• anime - 针对动漫/插画优化• 6B - 6块残差块,模型更轻量(相比 x4plus 的 23块) |
| -i inputs | 输入路径 | -i = –input 指定输入图像所在的文件夹路径为 inputs/ |
| -o results | 输出路径 | -o = –output 指定输出结果保存到 results/ 文件夹 |
| –outx4_anime | 输出文件名后缀 | 输出文件名添加后缀,例如: image_outx4_anime.png 用于区分不同模型的输出结果 |
| –fp32 | 单精度浮点 | 强制使用 FP32(32位浮点数)计算• 默认可能使用 FP16(半精度,更快但可能精度稍低)• FP32 更稳定,兼容性更好,但显存占用更大 |
| –gpu-id 0 | GPU 设备ID | 指定使用第 0 号 GPU(多卡环境下可选 0,1,2…)单卡机器通常为 0 |
| –tile 400 | 分块处理大小 | 将大图切分为 400×400 像素的块分别处理:• 解决显存不足问题• 值越小显存占用越少,但处理速度越慢• 值越大速度越快,但需要更多显存 |
当然,对图片进行超分辨率,经常有一个绕不过的点,就是人脸了,无论是真实图片,还是动漫图片,当涉及到人物形象这一块儿的时候,就很难不面对人脸
因此Real-ESRGAN专门对人脸部分的超分辨率方面进行了优化
但随之而来得也就是,需要引进一些额外的部分
也就是前置依赖安装
使用人脸修复前必须安装 GFPGAN(默认):
# 安装 GFPGAN
pip install gfpgan
# 或者使用 CodeFormer(可选)
pip install codeformer
而启用人脸修复的步骤就是
在命令中添加 –face_enhance
基本命令格式
1. 图片处理(inference_realesrgan.py)
python inference_realesrgan.py -n RealESRGAN_x4plus -i inputs -o results --face_enhance
2. 视频处理(inference_realesrgan_video.py)
python inference_realesrgan_video.py -n RealESRGAN_x4plus -i inputs/video.mp4 -o results --face_enhance
关键参数说明
| 参数 | 说明 |
|---|---|
--face_enhance | 核心参数,启用人脸修复功能 |
--face_upsample | 对人脸区域进行额外上采样(部分版本支持) |
-s / --outscale | 输出缩放比例(如 4 表示4倍放大) |
--bg_upsampler | 背景放大器(默认 realesrgan,通常无需修改) |
高级用法示例
选择不同的人脸修复后端
# 使用 GFPGAN(默认,修复效果较好,偏真实)
python inference_realesrgan.py -i input.jpg --face_enhance --face_upsampler gfpgan
# 使用 CodeFormer(保真度更高,更自然)
python inference_realesrgan.py -i input.jpg --face_enhance --face_upsampler codeformer
调整人脸修复强度(CodeFormer)
python inference_realesrgan.py -i input.jpg --face_enhance --face_upsampler codeformer --w 0.7 # 权重0-1,越低越接近原图,越高修复越强(默认0.5)
然后还有以下一些问题需要额外注意一下
- 显存需求:启用人脸修复会显著增加显存占用(约需额外 2-4GB)
- 自动下载模型:首次使用时会自动下载 GFPGAN/CodeFormer 模型到
~/.cache/或当前目录的weights/文件夹,如果下载失败可手动下载放置。 - 仅检测人脸:如果图片中没有人脸,程序会跳过修复步骤,仅执行常规超分。
- 批量处理:对文件夹处理时,人脸修复会逐个检测并处理每张图片中的人脸,速度会比普通超分慢。
- 版本要求:确保 Real-ESRGAN 版本 >= 0.3.0,旧版本可能不支持
--face_enhance参数。
一个我常用的完整的示例如下
python inference_realesrgan.py -n RealESRGAN_x4plus -i inputs -o output -s 4 --face_enhance --tile 512 --fp32
接下来就来到对视频的超分辨率了
其实我本人对这个,是最懵的,因为在这一块儿属于是走了许许多多的弯路的,当时怎么看AI给的说法,也是很让人疑惑的。。。属于是deepseek一嘴,kimi一嘴,豆包还有一个想法emmmmm最后还用不了
最后我也是给到realesr-animevideov3
假如你现在去AI,它们可能会给到这些命令
python inference_realesrgan_video.py -n RealESRGAN_x4plus -i input_video.mp4 -o output -s 4
python inference_realesrgan_video.py -n RealESRGAN_x4plus -i input_video.mp4 -o output -s 4 --num_process_per_gpu 2
其中–num_process_per_gpu是每块GPU的进程数(提速),可以设置同时处理分块的数量
首先,我想提醒的就是,不要贪这个速度,当然你要是能解决我将要提到的以下问题,那你随便用~当然,要是能顺便教我一下那就更好了,嘿嘿嘿
首先你要明白,这个命令虽然能给GPU的处理打开双通道,让图片的渲染速度更快,但是可能就会发生一个问题,比如咱们一般会用到分块tile吧?
假如一张图片被分成12块,我们设通道1开始处理tile1,而通道2也是同步处理了tile2,但是两个通道渲染的速度是并不同步的,会不会出现说将渲染生成的tile打乱的情况?
以下是我的踩坑经历
阿巴阿巴阿巴,当时我一看到这,人都傻了,你的意思是,我那跑了几个小时的电脑,渲染了那么久,就整出来了这些乱拼的拼图吗?风中凌乱了属于是
然后就是,不知道有没有小伙伴看到,官方文件明明说了有专门针对视频优化的模型啊?为什么还要用图片渲染的模型呢?这是在干啥?
没错,这也是AI给到的一个问题,可能是数据库没更新到位还是咋的,我发现其实它们并不是不知道realesr-animevideov3这个官方推出的针对视频优化的模型的,但是在当你询问它们所需的命令时,大概率还是不会跟你提这个,而是把执行代码换成video.py版,但是模型还是原来的
那我们作为过来人自然是不能继续吃这个亏了吧,
以下就是我处理视频时会用到的命令
python inference_realesrgan_video.py -i input.mp4 -o results -n realesr-animevideov3 -s 4 --tile 512
对于动漫视频超分,请优先使用 realesr-animevideov3,它在上传视频处理(如B站番剧修复)和本地收藏修复中都是当前最优选择
在处理视频的时候,使用处理图片用的模型去处理视频,用应该也不是不能用,只是不好用,时间长,速度慢,而且会面临时域不具有一致性,帧间闪烁和色块等等的问题
而使用 realesr-animevideov3,更清晰锐利,时域一致性更好,帧间闪烁少, x2, x3, x4 可调
相对的,参数也更小,处理起来的速度更快,像一个60fps、120S、1080p的视频,那对应的视频总帧数不就是7200帧吗?假如用你那超分图片的模型进行4K超分,显存拉满不说,一帧就算3、4秒,整个视频下来也得至少6个小时啊
接下来就是对于真实世界拍摄的视频,对于这一类视频的超分辨率讲解
首先,这个确实就得RealESRGAN_x4plus没跑了
然后我就会讲到以下的工作流程
视频文件(MP4/MKV)
↓ FFmpeg 解封装/解码
连续帧序列 (PNG)
↓ Real-ESRGAN 逐帧超分
高清帧序列 (4K PNG)
↓ FFmpeg 编码/封装
高清视频文件 (4K MP4)
Real-ESRGAN 本质是图像超分模型,它只能处理 PNG/JPG 图片。而视频是时间序列的压缩数据流(帧+音频+元数据)
标准三步法
第一步:提取帧(解码)
将视频拆分为无损图片序列,保留原始质量:
ffmpeg -i input.mp4 -vf "fps=30,scale=iw:ih:flags=lanczos,format=rgb24" -q:v 1 -frames:v 0 frames/%08d.png
关键参数:
-vf "fps=30":指定帧率(与源视频一致,避免时间戳错乱)-q:v 1:最高质量(PNG 忽略此参数,但兼容 JPG)%08d.png:8位数字命名(00000001.png),保证排序正确- 在
-vf中明确format=rgb24,确保输出为 RGB - 添加
-frames:v 0可防止因时间戳问题导致的帧数错误(可选,但建议保留)
第二步:Real-ESRGAN 超分
对提取的帧序列进行批量处理:
# 使用 Real-ESRGAN 处理文件夹
python inference_realesrgan.py -n RealESRGAN_x4plus -i frames -o frames_4x --tile 512
优化技巧:使用 --tile 避免爆显存;如果帧数太多,可用 parallel 工具并行处理子文件夹。
需先创建 frames_4x 文件夹,并确保输出路径正确。
第三步:合成视频(编码)
将超分后的帧重新编码为视频,并合并原音频:
# 保留原音频(推荐)
ffmpeg -i input.mp4 -i frames_4x/%08d.png \
-map 1:v:0 -map 0:a:0 \
-vf "fps=30,format=yuv420p" \
-c:v libx264 -crf 18 -preset slow \
-c:a copy \
-pix_fmt yuv420p \
-movflags +faststart \
output_4x.mp4
编码参数解析:
-c:v libx264或libx265:H.264/HEVC编码(H.265体积更小但编码慢)-crf 18:质量模式(18-23为视觉无损,越低质量越好,默认23)-preset slow:压缩效率(slow/veryslow 质量更好,文件更小)-movflags +faststart:网络播放优化(MP4元数据前置)
OK啊,本人就作出如上总结了,要是有实力的小伙伴能找到一些更好的方法,欢迎交流~~~
