AI数字人:让图片变高清的图像超分辨率模型 Real-ESRGAN

1 Real-ESRGAN介绍

1.1 Real-ESRGAN是什么?

Real-ESRGAN全名为Enhanced Super-Resolution GAN:增强的超分辨率的对抗生成网络,是由腾讯ARC实验室发布的一个盲图像超分辨率模型,它的目标是开发出实用的图像/视频修复算法,Real-ESRGAN 是在 ESRGAN 的基础上使用纯合成数据来进行训练的,基本上就是通过模拟高分辨率图像变低分辩率过程中的各种退化,然后再通过低清图倒推出它的高清图,简单说你也可以把它理解为一个图像/视频修复、放大工具。

github地址:Real-ESRGAN
论文地址:Real-ESRGAN: Training Real-World Blind Super-Resolution with Pure Synthetic Data

Real-ESRGAN 目前提供了五种模型,分别是 realesrgan-x4plus(默认)、reaesrnet-x4plus、realesrgan-x4plus-anime(针对动漫插画图像优化,有更小的体积)、realesr-animevideov3(针对动漫视频)和 realesrgan-x4plus-anime-6B,你可以根据你要处理的图片或视频选择合适的模型进行使用。

0c292edd3a404246bbba5ef3bc40a86a.png

 1.2 Real-ESRGAN原理

(1)生成器:

采用与ESRGAN[50]相同的生成器(SR网络),即一个具有多个残差-残差密集块(RRDB)的深网络,如图4所示。我们还扩展了原来×4ESRGAN架构,以执行以×2和×1为比例因子的超分辨率。由于ESRGAN是一个重型网络,我们首先使用像素unshuffle (pixel-shuffle[42]的逆操作)来减少空间大小,并在将输入输入到主ESRGAN架构之前扩大通道大小。因此,大多数计算都是在较小的分辨率空间中进行的,这可以减少GPU内存和计算资源的消耗。
e18f9c10bea54881b6169e2371cfcb6d.png

Real-ESRGAN采用与ESRGAN相同的生成器网络。对于比例因子of×2和×1,它首先使用像素unshuffle操作来减小空间大小,并将信息重新排列到信道维度

(2)鉴别器:带光谱归一化(SN) 的U-Net鉴别器

由于Real-ESRGAN的目标是解决比ESRGAN更大的退化空间,原有的鉴别器设计在ESRGAN中不再适用。具体来说,Real-ESRGAN中的鉴别器对复杂的训练输出要求有更大的鉴别能力。除了区分全局样式,它还需要为局部纹理产生精确的梯度反馈。受[41,452]的启发,我们还将ESRGAN中的vgg风格鉴别器改进为带有跳跃连接的U-Net设计(图6)。UNet输出每个像素的真实值,并可以向生成器提供详细的per-pixel反馈。
同时,U-Net结构和复杂的退化也增加了训练的不稳定性。我们采用光谱归一化正则化[37]来动态稳定训练。此外,我们观察到光谱归一化也有利于缓解GAN训练引入的过分尖锐和恼人的伪影。通过这些调整,我们能够轻松地训练RealESRGAN,并实现局部细节增强和伪迹抑制的良好平衡。
 

3e343b4f10ca4e459f4751db6a75d846.png

(3)训练过程
分为两个阶段。首先,我们用L1损耗训练了一个psnr导向的模型。得到的模型被real-esrnet命名。然后,我们使用训练的面向psnr的模型作为生成器的初始化,并结合L1损失、感知损失[20]和GAN损失来训练real-esrgan[14,26,4]。

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

a66d925e467f452cb8377230696bb8ee.png

  • Top:Real-ESRNet结果w/和w/o二级降解过程。
  • Bottom:Real-ESRNet结果w/和w/ sinfilter。放大以获得最佳视角

sinc filters。如果在训练过程中不使用sinc filters,恢复的结果将放大存在于输入图像中的振响和超调伪影,如图8(下)所示,特别是在文本和行周围。相反,使用自适应滤波器训练的模型可以去除这些伪影。

(4)SN正则化的U-Net鉴别器

我们首先使用esrgan setting 包括vgg -style 鉴别器和它的损失权重。但是从图9可以看出,该模型不能还原详细的纹理(砖块和灌木),甚至会在灌木树枝上带来令人不快的伪影。使用U-Net设计可以改善局部细节。但是,它会引入不自然的纹理,也会增加训练的不稳定性。SN正则化可以在稳定训练动力学的同时改善复原纹理。

4f327a144a5d4148bf1f16230a59b603.png

 

(5)更复杂的模糊核

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

1.3 创新点

  • 提出了新的构建数据集的方法,用高阶处理,增强降阶图像的复杂度。
  • 构造数据集时引入sinc filter,解决了图像中的振铃和过冲现象。
  • 替换原始ESRGAN中的VGG-discriminator,使用U-Net discriminator,以增强图像的对细节上的对抗学习。
  • 引入spectral normalization以稳定由于复杂数据集和U-Net discriminator带来的训练不稳定情况。

5b142684364b420e96b2ce4e4077fb23.png

 

2 Real-ESRGAN部署运行

2.1 conda安装

annoconda安装和使用详见:annoconda环境构建

2.2 运行环境构建

git clone https://github.com/xinntao/Real-ESRGAN.git
cd Real-ESRGAN

conda create -n realesgan python=3.9
conda activate realesgan

pip install basicsr==1.4.2
pip install facexlib==0.3.0
pip install gfpgan==1.3.8

pip install -r requirements.txt

python setup.py develop

2.3 模型下载

通用模型地址:RealESRGAN_x4plus.pth

动漫模型地址:RealESRGAN_x4plus_anime_6B.pth

下载完成后,移动到weights目录下,完成通过命令查看显示如下:

[root@localhost Real-ESRGAN]# ll weights/
总用量 82996
-rw-r--r-- 1 root root       54 7月   6 19:46 README.md
-rw-r--r-- 1 root root 17938799 7月  19 11:15 RealESRGAN_x4plus_anime_6B.pth
-rw-r--r-- 1 root root 67040989 7月   7 15:26 RealESRGAN_x4plus.pth

创建gfpgan模型存储目录:

mkdir -p gfpgan/weights

下载gfpgan模型文件并存储到上面创建目录gfpgan/weights中:

    detection_Resnet50_Final.pth

    parsing_parsenet.pth

    GFPGANv1.3.pth

完成后通过命令查看显示如下:

 [root@localhost Real-ESRGAN]# ll gfpgan/weights/
总用量 530728
-rw-r--r-- 1 root root 109497761 7月   7 15:33 detection_Resnet50_Final.pth
-rw-r--r-- 1 root root 348632874 7月   7 15:33 GFPGANv1.3.pth
-rw-r--r-- 1 root root  85331193 7月   7 15:33 parsing_parsenet.pth

2.4 修改代码(避免从网络下载,从网络下载非常慢且经常失败)

vi Real-ESRGAN/inference_realesrgan.py 
if args.face_enhance:  # Use GFPGAN for face enhancement
        from gfpgan import GFPGANer
        face_enhancer = GFPGANer(
            model_path='https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.3.pth',
            upscale=args.outscale,
            arch='clean',
            channel_multiplier=2,
            bg_upsampler=upsampler)
 
修改为:
 
if args.face_enhance:  # Use GFPGAN for face enhancement
        from gfpgan import GFPGANer
        face_enhancer = GFPGANer(
            model_path='./gfpgan/weights/GFPGANv1.3.pth',
            upscale=args.outscale,
            arch='clean',
            channel_multiplier=2,
            bg_upsampler=upsampler)

3 Real-ESRGAN效果展示

经过处理后的图片存储在results目录下

[root@localhost Real-ESRGAN]# ll results/
总用量 7908
-rw-r--r-- 1 root root 3029489 7月  19 11:20 00003_out.png
-rw-r--r-- 1 root root  133649 7月  19 11:17 0014_out.jpg
-rw-r--r-- 1 root root 4928934 7月  19 11:22 children-alpha_out.png

3.1 通用图像增强

python inference_realesrgan.py -n RealESRGAN_x4plus -i inputs/0014.jpg --face_enhance

原始图片:

13e881e540d745238f0fb58c72c9da6b.png

 增强后的图片:

274af255eec9466e964b28d37dfd5991.png

 

 

 3.2 动漫图像增强

python inference_realesrgan.py -n RealESRGAN_x4plus_anime_6B -i inputs/0014.jpg

原始图片:

7c252e36a94a4da69b275b0aa874c80c.png

 增强后的效果: 

fbf5d260015344de9cbc6dee585ad708.png

 

 

 

4 总结

Real-ESRGAN是一种基于深度学习的图像超分辨率增强方法,通过生成对抗网络实现高质量的图像重建。它在保留细节和增强图像逼真度方面表现出色,可以广泛应用于图像处理和增强领域。在AI数字人打造过程中,Real-ESRGAN主要用于语音驱动人脸后的图像增强,基于此增强技术构建高清数字人视频。

 

Real ESRGAN是一种用于图像超分辨率增强的方法,它可以通过训练自己的数据集来实现个性化的图像增强效果。下面是训练Real ESRGAN的步骤: 1. 准备数据集:首先,您需要准备一个包含低分辨率图像和对应高分辨率图像的数据集。这些图像对应的分辨率应该是相同的,并且应该有足够的多样性和代表性。 2. 数据预处理:在训练之前,您需要对数据进行预处理。这包括将图像调整为相同的大小,并将它们转换为模型可以处理的格式,例如JPEG或PNG。 3. 构建模型:接下来,您需要构建Real ESRGAN模型。这可以通过使用深度学习框架(如TensorFlow或PyTorch)来实现。您可以使用预训练的ESRGAN模型作为起点,并根据您的数据集进行微调,或者从头开始构建一个新的模型。 4. 定义损失函数:在训练过程中,您需要定义一个损失函数来衡量生成图像与真实高分辨率图像之间的差异。常用的损失函数包括均方误差(MSE)和感知损失(Perceptual Loss)。 5. 训练模型:使用准备好的数据集和定义好的损失函数,您可以开始训练Real ESRGAN模型。训练过程可能需要一段时间,具体时间取决于数据集的大小和计算资源的可用性。 6. 评估和调优:在训练完成后,您可以使用一些评估指标(如PSNR和SSIM)来评估模型的性能。如果需要进一步改进模型的效果,您可以尝试调整超参数或增加训练数据。 7. 应用模型:一旦您的Real ESRGAN模型训练完成并且性能满足您的要求,您可以将其应用于新的图像数据,以实现高质量的图像超分辨率增强效果。 下面是一个示例代码,展示了如何使用Real ESRGAN训练自己的数据集: ```python # 导入所需的库 import tensorflow as tf from tensorflow.keras.models import Model from tensorflow.keras.layers import Input, Conv2D, LeakyReLU, Add from tensorflow.keras.optimizers import Adam # 构建Real ESRGAN模型 def build_real_esrgan_model(): # 定义模型的输入 input_image = Input(shape=(None, None, 3)) # 添加ESRGAN模型的各个层 # ... # 定义模型的输出 output_image = # ... # 构建模型 model = Model(inputs=input_image, outputs=output_image) return model # 定义损失函数 def perceptual_loss(y_true, y_pred): # ... pass # 准备数据集 # ... # 构建并编译Real ESRGAN模型 model = build_real_esrgan_model() model.compile(optimizer=Adam(), loss=perceptual_loss) # 训练模型 model.fit(dataset, epochs=10, batch_size=16) # 评估模型 # ... # 应用模型 # ... ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智慧医疗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值