向AI转型的程序员都关注公众号 机器学习AI算法工程
图像超分是一种图像处理技术,旨在提高图像的分辨率,使其具有更高的清晰度和细节。这一技术通常用于图像重建、图像恢复、图像增强等领域,可以帮助我们更好地理解和利用图像信息。图像超分技术可以通过多种方法实现,包括插值算法、深度学习等。其中,深度学习的方法在近年来得到了广泛的关注和应用。基于深度学习的图像超分技术,可以利用深度神经网络学习图像的高频部分,从而提高了图像的分辨率和清晰度。
目前应用较多的应用场景是图像及视频分辨率提高,比如可以提高以往影视作品或图像的分辨率,提高视觉感官效果;或是解决视频经有损压缩后导致视频效果退化问题。今天给大家介绍一下腾讯ARC实验室发布的一个图像超分辨率模型Real-ESRGAN
https://arxiv.org/abs/2107.10833
模型简介
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 压缩对图像画质的影响:
高阶退化模型
在采用上述经典退化模型来合成训练对时,训练后的模型确实可以处理一些真实样本。然而,它仍然不能解决现实世界中的一些复杂的退化,特别是未知的噪声和复杂的伪影。左侧的真实世界图片在经典退化模型的合成数据训练修正后可以解决,然后右侧更为复杂的真实世界图像的噪声却被放大了:
这是因为合成的低分辨率图像仍然与真实退化图像有很大的差距。因此,我们将经典的退化模型扩展到高阶退化过程,以模拟更实际的退化。经典的退化模型只包含一个固定的基本退化的数量,可以看作是一阶建模。然而,现实生活中的退化过程是相当多样化的,通常包括一系列程序,包括相机的成像系统、图像编辑、互联网传输等。
例如,当我们想要从互联网上恢复低质量的图像下载时,其潜在的退化涉及不同退化过程的复杂组合。具体来说,原始图像可能多年前用手机拍摄,这不可避免地包含相机模糊、传感器噪声、低分辨率和 JPEG 压缩等退化。然后使用锐化和调整大小操作对图像进行编辑,带来超调和模糊伪影。之后,它被上传到一些社交媒体应用程序,这引入了进一步的压缩和不可预测的噪音。随着数字传输也将带来伪影,当图像在互联网上传播多次时,这个过程变得更加复杂。
这种复杂的恶化过程不能用经典的一阶模型建模。因此,我们提出了一个高阶退化模型。n 阶模型涉及 n 个重复退化过程,其中每个退化过程采用具有相同过程但超参数不同的经典退化模型。请注意,这里的“高阶”与数学函数中使用的“高阶”不同。它主要是指同一操作的实现时间。但是我们强调高阶退化过程是关键,这表明并非所有打乱的退化都是必要的。为了使图像分辨率保持在合理的范围内,将式(1)中的下采样操作替换为随机调整大小操作。
根据经验,我们采用了二阶退化过程,因为它可以在保持简单性的同时解决大多数实际情况。下图描述了我们的纯合成数据生成管道的整体管道:
这一系列的 D 就模拟了生活中一张颠沛流体的图片的传递过程。值得注意的是,改进的高阶退化过程并不完美,不能覆盖现实世界中的整个退化空间。相反,它仅通过修改数据合成过程来扩展先前盲 SR 方法的可解退化边界。
环形和超调伪影
环形伪影经常出现在图像中急剧过渡附近的虚假边缘。他们在视觉上看起来像边缘附近的波段或"幽灵"。超调伪影通常与振铃伪影相结合,表现为边缘过渡处的跳跃增加。这些伪影的主要原因是信号在没有高频的情况下是带限的。这些现象非常常见,通常由锐化算法、JPEG压缩等产生。下图显示了一些遭受振铃和超调伪影的真实样本:
上图为存在振铃和超调伪影的真实样本。下图为 sinc 内核的示例 [kernel= 21] 和相应的过滤图像,可以看到图像经过 sinc 内核滤波会出现真实世界类似的振铃和超调伪影的状态。sinc 滤波器,这是一种理想化的滤波器,可以切断高频,以合成训练对的振铃和超调伪影。sinc 滤波器内核可以表示为:
模型在两个地方采用了sinc滤波器:模糊过程和合成的最后一步。last sinc 滤波器和 JPEG 压缩的顺序被随机交换以覆盖更大的退化空间,因为一些图像可能首先被过度锐化(具有过冲伪影),然后具有JPEG压缩;而一些图像可以首先进行JPEG压缩,然后进行锐化操作。
网络结构
◆ 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。
项目效果展示
快速体验
◆ 图像修复
体验地址: https://arc.tencent.com/en/ai-demos/imgRestore
视频修复
体验地址: https://replicate.com/lucataco/real-esrgan-video
【Real-ESRGAN 提升图像、视频清晰度 - 最高可达 4 K】完整项目代码获取地址:
关注微信公众号 datayx 然后回复 清晰度 即可获取。
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 参数,强制模型精度。
2 Python代码使用教程
2.1 依赖库安装
2.1.1 项目安装
2.2 模型介绍
模型下载链接,里面有7个,有些我不知道是干啥用的,所以就没说。
realesrgan-x4plus(默认)
reaesrnet-x4plus
realesrgan-x4plus-anime(针对动漫插画图像优化,有更小的体积)
realesr-animevideov3 (针对动漫视频)
2.3 代码使用
将下载好的模型,放在项目文件中的weights文件夹中,然后打开inference_realesrgan.py和inference_realesrgan_video.py这两个文件就运行就行了,一个是图片超分,一个是视频超分。我这里将代码已经全部注释了,自己可以看看很好理解。
默认模型是realesrgan-x4plus,需要超分的图片/视频放在项目文件夹的inputs中,输出在results中。
inference_realesrgan.py
代码如下
4 总结
这个开源项目总体来说精度是不错的,图像的分辨率确实有明显的提升,可以将模糊的图片还原出更多的细节。
不断更新资源
深度学习、机器学习、数据分析、python
搜索公众号添加: datayx