Python - Real-ESRGAN 提升图像、视频清晰度 - 最高可达 4 K
目录
一.引言
前面我们介绍了 GFP-GAN,其通过检测目标脸部轮廓提升图片中人物的画面质量。今天介绍的 Real-ESRGAN [Training Real-World Blind Super-Resolution with Pure Synthetic Data] 即使用纯合成数据进行真实世界盲超分辨率训练,其用于提高图像、视频的质量。同时 Real-ESRGAN 也引入了 GFP-GAN,如果还需要额外对图像中的人物进行细粒度修复,两者可以结合。
二.Real-ESRGAN 理论
1.模型简介
Real-ESRGAN 使用纯合成训练对训练真实世界的盲超分辨率模型。为了合成更实用的退化,模型提出了一种高阶退化过程,并使用 sinc 滤波器来模拟常见的振铃和超调伪影。这里还使用具有谱归一化正则化的 U-Net 鉴别器来增加鉴别器能力并稳定训练动态。实验证明使用合成数据训练的 Real-ESRGAN 能够增强细节,同时删除大多数真实图像的恼人伪影。
上图分别为 双三次上采样、ESRGAN、RealSR 和 Real-ESRGAN 的效果。
2.经典退化模型
◆ 退化过程全览
盲 SR 旨在从具有未知和复杂退化的低分辨率图像中恢复高分辨率图像。通常采用经典退化模型来合成低分辨率输入。通常,首先将真实图像 y 与模糊核 k 进行卷积。然后,执行具有比例因子的下采样操作。低分辨率 x 是通过添加噪声 n 获得的。最后,JPEG压缩也被采用,因为它在真实世界的图像中被广泛使用。
其中 D 表示退化过程,退化实现了将清晰图像 y 模糊为 x 的过程。
Real-ESRGAN 中采用的纯合成数据生成。它利用二阶退化过程来模拟更实际的退化,其中每个退化过程采用经典的退化模型。其中列出了模糊、调整大小、噪声和 JPEG 压缩的详细选择。除此之外模型还使用 sinc 滤波器来合成常见的振铃和超调伪影。
◆ K - 高斯滤波
通常将模糊退化建模为具有线性模糊滤波器(内核)的卷积。各向同性和各向异性高斯滤波器是常见的选择。对于内核大小为 2t + 1 的高斯模糊核 k,其 (i, j) ∈ [−t, t] 元素从高斯分布中采样,形式如下:
其中 Σ 是协方差矩阵; C 是空间坐标; N 是归一化常数。协方差矩阵可以进一步表示如下:
其中 σ1 和 σ2 是沿两个主轴的标准差(即协方差矩阵的特征值); θ 是旋转度。当σ1 = σ2时,k 为各向同性高斯模糊核; 否则 k 为各向异性核。
这一步相当于对图像进行了高斯滤波模糊。下图为不同参数下图像的模糊效果:
◆ N - 噪声
N 即 Noisy,我们考虑两种常用的噪声类型:1) 加性高斯噪声和 2)泊松噪声。加性高斯噪声的概率密度函数等于高斯分布的概率密度函数。噪声强度由高斯分布的标准差 σ 控制。当 RGB 图像的每个通道都有独立的采样噪声时,合成噪声是颜色噪声。我们还通过将相同的采样噪声应用于所有三个通道来合成灰色噪声。泊松噪声遵循泊松分布。它通常用于近似模拟统计量子波动引起的传感器噪声,即在给定曝光水平下感知到的光子数的变化。泊松噪声的强度与图像强度成正比,不同像素的噪声是独立的。
这一步在高斯滤波的基础上为图像增加噪声。下图为不同噪声添加后的效果:
◆ ↓r - Resize
这一步其实代表 Downsampling 即下采样。下采样是合成 SR 中低分辨率图像的基本操作。更一般地说,我们考虑下采样和上采样,即调整大小操作。有几种调整算法——最近邻插值、区域大小调整、双线性插值和双三次插值。不同的调整大小操作会带来不同的效果——有些会产生模糊的结果,而有些可能会产生过锐化的图像,带有超调伪影。为了包含更多样化和复杂的调整大小效果,我们考虑了上述选择的随机调整大小操作。由于最近邻插值引入了错位问题,我们排除了它,只考虑区域、双线性和双三次运算。
↓r
这一步是在高斯滤波后对图像进行下采样。下图为下采样算法和上采样算法的不同组合的影响。图像首先被四倍的比例因子下采样,然后上采样到其原始大小:
◆ jpeg - 压缩
JPEG 压缩是一种常用的数字图像有损压缩技术。它首先将图像转换为 YCbCr 颜色空间,并对色度通道进行下采样。然后将图像分成 8 × 8 个块,每个块用二维离散余弦变换 DCT 进行变换,然后对 DCT 系数进行量化。JPEG 压缩通常会引入不愉快的块伪影。压缩图像的质量由质量因子 q ∈ [0, 100] 决定,其中较低的 q 表示更高的压缩比和更差的质量。
上述操作代表对下采样且添加噪声的图像进行 jpeg 压缩。下图为 jpeg 压缩对图像画质的影响:
3.高阶退化模型
在采用上述经典退化模型来合成训练对时,训练后的模型确实可以处理一些真实样本。然而,它仍然不能解决现实世界中的一些复杂的退化,特别是未知的噪声和复杂的伪影。左侧的真实世界图片在经典退化模型的合成数据训练修正后可以解决,然后右侧更为复杂的真实世界图像的噪声却被放大了:
这是因为合成的低分辨率图像仍然与真实退化图像有很大的差距。因此,我们将经典的退化模型扩展到高阶退化过程,以模拟更实际的退化。经典的退化模型只包含一个固定的基本退化的数量,可以看作是一阶建模。然而,现实生活中的退化过程是相当多样化的,通常包括一系列程序,包括相机的成像系统、图像编辑、互联网传输等。
例如,当我们想要从互联网上恢复低质量的图像下载时,其潜在的退化涉及不同退化过程的复杂组合。具体来说,原始图像可能多年前用手机拍摄,这不可避免地包含相机模糊、传感器噪声、低分辨率和 JPEG 压缩等退化。然后使用锐化和调整大小操作对图像进行编辑,带来超调和模糊伪影。之后,它被上传到一些社交媒体应用程序,这引入了进一步的压缩和不可预测的噪音。随着数字传输也将带来伪影,当图像在互联网上传播多次时,这个过程变得更加复杂。
这种复杂的恶化过程不能用经典的一阶模型建模。因此,我们提出了一个高阶退化模型。n 阶模型涉及 n 个重复退化过程,其中每个退化过程采用具有相同过程但超参数不同的经典退化模型。请注意,这里的“高阶”与数学函数中使用的“高阶”不同。它主要是指同一操作的实现时间。但是我们强调高阶退化过程是关键,这表明并非所有打乱的退化都是必要的。为了使图像分辨率保持在合理的范围内,将式(1)中的下采样操作替换为随机调整大小操作。
根据经验,我们采用了二阶退化过程,因为它可以在保持简单性的同时解决大多数实际情况。下图描述了我们的纯合成数据生成管道的整体管道:
这一系列的 D 就模拟了生活中一张颠沛流体的图片的传递过程。值得注意的是,改进的高阶退化过程并不完美,不能覆盖现实世界中的整个退化空间。相反,它仅通过修改数据合成过程来扩展先前盲 SR 方法的可解退化边界。
4.环形和超调伪影
环形伪影经常出现在图像中急剧过渡附近的虚假边缘。他们在视觉上看起来像边缘附近的波段或"幽灵"。超调伪影通常与振铃伪影相结合,表现为边缘过渡处的跳跃增加。这些伪影的主要原因是信号在没有高频的情况下是带限的。这些现象非常常见,通常由锐化算法、JPEG压缩等产生。下图显示了一些遭受振铃和超调伪影的真实样本:
上图为存在振铃和超调伪影的真实样本。下图为 sinc 内核的示例 [kernel= 21] 和相应的过滤图像,可以看到图像经过 sinc 内核滤波会出现真实世界类似的振铃和超调伪影的状态。sinc 滤波器,这是一种理想化的滤波器,可以切断高频,以合成训练对的振铃和超调伪影。sinc 滤波器内核可以表示为:
模型在两个地方采用了sinc滤波器:模糊过程和合成的最后一步。last sinc 滤波器和 JPEG 压缩的顺序被随机交换以覆盖更大的退化空间,因为一些图像可能首先被过度锐化(具有过冲伪影),然后具有JPEG压缩;而一些图像可以首先进行JPEG压缩,然后进行锐化操作。
5.网络结构
◆ ESRGAN 生成器
模型采用与 ESRGAN 相同的生成器即 SR 网络,即具有多个残差密集块 RRDB 的深度网络:
除此之外还扩展了原始的 ×4 ESRGAN 架构,以 ×2 和 ×1 的比例因子执行超分辨率。由于ESRGAN 是一个繁重的网络,我们首先使用像素 unshuffle 来减少空间大小,并在将输入输入到主ESRGAN 架构之前扩大信道大小。因此,大多数计算都是在较小的分辨率空间中进行的,可以减少 GPU 内存和计算资源消耗。
◆ U-Net 鉴别器
具有光谱归一化 SN 的 U-Net 鉴别器。由于 Real-ESRGAN 旨在解决比 ESRGAN 更大的退化空间,ESRGAN 中鉴别器的原始设计不再合适。具体来说,Real-ESRGAN 中的鉴别器需要复杂的训练输出具有更强的辨别力。它不需要区分全局样式,而是需要对局部纹理产生准确的梯度反馈。模型还将 ESRGAN 中的 VGG 样式鉴别器改进为具有跳跃连接的 U-Net 设计。UNet 输出每个像素的真实值,可以为生成器提供详细的逐像素反馈。
同时,U-Net 结构和复杂的退化也增加了训练的不稳定性。模型采用谱归一化正则化来稳定训练动力学。此外,观察到光谱归一化也有利于缓解 GAN 训练引入的过度尖锐和恼人的伪影。通过这些调整,可以能够轻松训练 Real-ESRGAN 并实现局部细节增强和伪影抑制的良好平衡。训练过程分为两个阶段。首先,我们训练了一个具有 L1 损失的面向 PSNR 的模型。获得的模型由 Real-ESRNet 命名。然后我们使用经过训练的面向 PSNR 的模型作为生成器的初始化,并使用 L1 损失、感知损失和 GAN 损失的组合训练 Real-ESRGAN。
三.Real-ESRGAN 实战
1.快速体验
◆ 图像修复
体验地址: https://arc.tencent.com/en/ai-demos/imgRestore
选择对应的图像处理任务,上传图片等待即可。
◆ 视频修复
体验地址: https://replicate.com/lucataco/real-esrgan-video
拖拽对应的图片视频到 video_path 部分,执行 run 即可等待。
2.环境搭建
GitHub 仓库地址: GitHub - xinntao/Real-ESRGAN: Real-ESRGAN
◆ Package 安装
这里要求 Python >= 3.7 && Pytorch >= 1.7,我们直接创建 python 3.7 的环境并激活:
conda create -n Real-ESRGAN python=3.7
conda activate Real-ESRGAN
激活后在对应环境执行下述指令并运行 setup.py 即可:
# Install basicsr - https://github.com/xinntao/BasicSR
# We use BasicSR for both training and inference
pip install basicsr
# facexlib and gfpgan are for face enhancement
pip install facexlib
pip install gfpgan
pip install -r requirements.txt
python setup.py develop
◆ 预训练模型下载
当前最新模型为 RealESRGAN_x4plus,需要下载好放入 weights 目录下,网络情况不好的情况下最好提前 wget 或者本地下载对应地址的模型再上传:
https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.0/RealESRGAN_x4plus.pth
◆ GFP-GAN 模型下载
https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.3.pth
图像质量增强的过程中,如果想要单独对人脸部分进行增强需要引入 GFP-GAN 模块,这里需要提前下载 GFP-GAN 对应的模型:
3. 图像修复
◆ 运行脚本
#!/bin/bash
model=RealESRGAN_x4plus
input=inputs/lb.png
python inference_realesrgan.py -n $model -i $input --face_enhance --fp32
模型选择上面下载的 RealESRGAN_x4plus,将我们要修复的图像上传至 input 目录下即可,根据是否需要对人像修复选择 --face_enhance 参数。
- 整体
36828 -> 5246069 光看图像的大小就可以看到图像质量得到了提升:
- 细节
脸部细节,衣服细节都得到了细化,GFP-GAN 甚至帮皇叔睁开了眼睛:
◆ 显存不足
添加 --face_enhance 参数外,需要额外加载 GFP-GAN 模型,如果显存不足会报错:
如果有空闲显卡,可以使用 -g 指定,这里不添加 -g 参数代表使用 multi-gpu,还报错说明我们确实显存不足,如果单纯测试,可以修改 realesrgan/utils.py,将 device 写死为 cpu:
◆ Half Error
使用 cpu 后无法执行 half 操作,会报错 not implemented for 'Half':
所以我们添加了 --fp32 参数,强制模型精度。
4.视频修复
◆ 运行脚本
#!/bin/bash
model=RealESRGAN_x4plus
input=inputs/video/onepiece_demo.mp4
python inference_realesrgan_video.py -n $model -i $input --fp32
在 inputs/video 目录传入对应的视频运行上述脚本即可,在 results 目录查看输出结果:
◆ 修复思考
如果修复带字幕的视频时,最好将字幕和视频进行分离处理,否则会出现字幕的叠影。其次,不论是图像修复还是视频修复,还是推荐使用 GPU,因为 CPU 实在是太慢辣,一帧 70s +:
四.总结
Real-ESRGAN + GFP-GAN 的组合可以实现真实世界的图像、视频修复的功能,效果也非常的奈斯,除了上面提到的 RealESRGAN_x4plus 模型,代码仓库中也给出了更适合动漫视频修复的 RealESRGAN_x4plus_anime_6B 专属动漫模型,有需要的同学也可以尝试。最后就是我们本文前后的呼应,大家加载本博文的文首配图有没有卡顿~ 这是因为文首的配图就是通过 Real-ESRGAN 实现图像增强的图片,其从原始的 1.5 MB 修复后大小达到 55 MB。
更多推荐
所有评论(0)