第二十八周学习周报

打印 上一主题 下一主题

主题 822|帖子 822|积分 2468

摘要

本周紧张的学习内容是GFPGAN模子。GFPGAN是一种基于天生对抗网络(GAN)的模子,其使用封装在预训练的人脸GAN中的丰富多样的先验举行人脸图像的修复。这种天生面部先验(GFP)通过空间特征变换层被整合到面部恢复过程中,使得GFPGAN可以或许实现真实性和保真度的精良平衡。 得益于强盛的天生面部先验和精致的计划,GFPGAN只需一次前向传递即可共同还原面部细节并增强色彩。GFPGAN 的出现,办理了传统模子因输入质量低而无法提供准确的几何先验信息的标题。本周,作者将从总体布局、实验研究以及代码分析三部分对GFPGAN举行学习。
Abstract

The main content of this week’s study is the GFPGAN model. GFPGAN is a model based on Generative Adversarial Network (GAN)that leverages rich and diverse priors encapsu-lated in a pretrained face GAN for blind face restoration.This Generative Facial Prior (GFP) is incorporated intothe face restoration process via spatial feature transformlayers, which allow our method to achieve a good balanceof realness and fidelity. Thanks to the powerful genera-tive facial prior and delicate designs,GFP-GAN couldjointly restore facial details and enhance colors with just asingle forward pass. The emergence of GFPGAN has solved the problem of traditional models being degraded due to low input quality. This week, the author will study GFPGAN from three parts: overall structure, experimental research, and code analysis.
1 GFPGAN

GFPGAN是一种基于天生对抗网络(GAN)的模子,由腾讯应用研究中心开发的一种面向实际应用的人脸修复算法,使用预训练的人脸天生对抗网络中封装的丰富多样的先验知识举行瞽者脸修复。近年来,GFPGAN在图像天生与修复领域备受瞩目。它凭借其强盛的天生能力和高度逼真的修复结果,成为了浩繁研究者、开发者乃至普通用户关注的核心。本次的学习基于一篇名为Towards Real-World Blind Face Restoration with Generative Facial Prior的论文。

在论文中作者提出了一种名为GFPGAN的模子,与最先进的面部修复方法在实际的低质量图像上的相比力,其中包括:HiFaceGAN 、DFDNet 、Wan和 PULSE 。以前的方法难以恢复正确的面部细节或保留面部特征,但论文提出的GFPGAN在真实性和保真度之间取得了精良的平衡,伪影要少得多。此外,强盛的天生面部先验使其可以或许联合举行修复和色彩增强。
1.1 总体布局

GFPGAN作为GAN的一种变体模子,其布局紧张也是天生器和判别器两部分。天生器负责将低分辨率图像转换为高分辨率图像,而判别器则用于判断天生的图像是否真实。天生器接纳了残差块(Residual Block)作为底子模块,通过堆叠多个残差块来实现深度网络的构建。此外,为了进一步提高模子的性能,GFPGAN还引入了注意力机制,如通道注意力(Channel Attention)和空间注意力(Spatial Attention)。

天生器
天生器的布局如下图所示,其由包括一个降解去除模块(U-Net)和一个预先训练的面部GAN作为面部先验两部分组成。两部分由Flatent和Fspatial毗连,MLP实际上就是由多个linear层所组成,而Fspatial则是包含U-Net中decoder部分的多个尺度的特征图。它们之间通过潜伏的代码映射和多少通道分割空间特征变换举行毗连(CS-SFT)层。

降级去除模块旨在显式地去除降级,并提取Flatent和Fspatial的“干净”特征,从而减轻后续模块的负担。而使用U-Net作为退化移除网络紧张是为了增加大暗昧消除的感受野以及天生多分辨率特征。
模子中会在U-Net的每个decoder层计算一个Restoration Loss,以此得到Flatent和Fspatial中的“干净”特征。Restoration Loss的定义如下所示:

在天生器中,输入图片起首经U-Net层得到瓶颈处的Flatent,Flatent在经MLP处置惩罚后得到中心潜伏编码W,及16个512的latent code,w再经styleGAN处置惩罚得到FGAN,即中心卷积的特征。styleGAN每层天生的特征图(FGAN)的后半部分举行一个空间上的仿射变换,即平移和缩放利用。该利用是通过两个卷积层得到的。

由于每一层的FGAN和Fspatial的巨细和维度是相对应的,以是他们可以直接举行相乘大概相加的利用,
判别器
判别器布局如下图所示,它会对人脸的团体、局部(眼睛和嘴巴)以及身份保留信息三部分举行判别然后得到三个LOSS。

(1) Adversarial Loss:

(2) Facial Component Loss:

(3) Identity Preserving Loss:

1.2 实验研究

1.数据集
训练数据集:作者在FFHQ数据集上训练GFP-GAN,该数据集由70,000张高质量图像组成。在训练期间,作者将所有图像的巨细调整为 512。 GFP-GAN 是在合成数据上训练的,这些合成数据近似于真实的低质量图像,并在推理过程中泛化到真实的图像。
测试数据集:
(1) CelebA-Test:CelebA-Test 是一个合成数据集,其中包含来自其测试分区的 3,000 张 CelebA-HQ 图像。天生方式与训练期间的天生方式相同。
(2)LFW: LFW 包含低质量旷野图像。作者将验证分区中每个标识的所有第一个映像分组,形成 1711 个测试映像。
(3)CelebChild-Test:CelebChild-Test包含从互联网上网络的180张名流的童脸。它们质量低下,其中许多是黑白老照片。
(4)WebPhoto:这是作者在实际生存的互联网中抓取了 188 张低质量照片,提取 407 张人脸来构建 WebPhoto 测试数据集。这些照片具有多种多样且复杂的退化。 其中一些是老照片,在细节和颜色上都有非常严重的退化。
2. 实验评估
(1)广泛使用的非参考感知指标:FID 和NIQE。
(2)接纳像素度量(PSNR和SSIM)和感知度量(LPIPS )举行CelebA-Test withGround-Truth (GT)。
(3)在ArcFace特征嵌入中用天使丈量身份距离,其中较小的值表示与GT的同一性更近。
3.实验流程:
(1)作者接纳预训练的StyleGAN2和512个输出作为天生面部的先验。StyleGAN2的通道倍增器设置为一,以缩小模子巨细。用于降解去除的UNet由7个下采样和7个上采样组成,每个采样都有一个残差块。对于每个cS-SFT层,作者使用两个卷积层分别天生α和β的仿射参数。
(2)训练小批量巨细设置为12。通过水平翻转和颜色抖动来增强训练数据。作者思量三个组成部分:左眼、右眼、嘴巴对面部成分的损失,因为它们在感知上很紧张。每个组件都按ROI裁剪对齐与面部对齐。
(3)使用Adam 优化器训练模子,总共举行了800k次迭代。学习率设置为2 ×10,然后在第
700k、750k次迭代中衰减了2倍。作者使用PyTorch框架实现模子,并使用四个NVIDIA Tesla P40 GPU对其举行训练。
(4)实验结果
论文中通过与其他先进的人类修复方法比力呈现GFP-GAN的实验结果。其中包括: HiFaceGAN、DFDNet、PSFRGAN、Super-FAN和Wan。用于面部恢复的GAN反转方法ULSE 和mGANprior也用于比力。除此还将GFP-GAN与图像恢复方法举行了比力:RCAN、ESRGAN和DeblurGANv2,并在面部训练集上对它们举行了微调,以便举行公平的比力。
合成CelebA测试
测试是在两种设置下举行的:

  • 瞽者脸恢复,其输入和输出具有相同的分辨率,定量结果如下图所示。

  • 4倍人脸超分辨率。请注意,我们的方法可以接受上采样的图像作为人脸超分辨率的输入,定量结果如下图所示。

在这两种设置下,GFP-GAN都实现了最低的LPIPS,这表明GFPGAN的结果在感知上接近真实值。GFP-GAN还得到了最低的FID和NIQE,表明输出分别与真实人脸分布和自然图像分布具有近距离。除了感知性能外,GFP-GAN还保留了更好的身份,由面部特征嵌入的最小水平表示。
但需注意以下两点:
1)GFP-GAN的FID和NIQE低于GT并不意味着其性能优于GT,因为这些“感知”指标在粗尺度上与人类意见分数密切相关,但在更精致的尺度上并不总是密切相关;
2)像素指标PSNR和SSIM与人类观察者的主观评价[2,41]相关性不佳,GFP-GAN在这两个指标上并不擅长。


结果如上图所示,紧张的发现有以下几点:
1)得益于强盛的天生式面部先验,GFPGAN可以恢复眼睛(瞳孔和睫毛)、牙齿等的老实细节。
2)GFPGAN在修复中将面部视为团体,也可以天生逼真的头发,而以前依赖组件字典(DFDNet)或解析映射(PSFRGAN)的方法无法产生老实的头发纹理。
3)GFP-GAN可以或许保持保真度,例如,它产生自然的闭口没有像PSFRGAN那样强制添加齿。除此,GFP-GAN还可以恢复公道的眼睛注视方向。
LFW、CelebChild和WedPhoto测试
为了测试模子的泛化能力,作者在三个不同的真实数据集上评估了GFP-GAN。定量结果如下图所示。

GFP-GAN在这三个数据集上都取得了优越的性能,表现出其明显的泛化能力。只管PULSE也能得到较高的感知质量(较低的FID分数),但它无法保留面部身份。如下图所示,GFP-GAN可以或许联合举行人脸恢复和色彩增强,使用强盛的天生先验来处置惩罚真实生存中的照片。作者的方法可以或许在复杂的实际世界退化条件下天生公道且逼真的面部,而其他方法则无法恢复老实的面部细节或会产生伪影(特殊是在图5中的WebPhoto-Test)。

除了眼睛和牙齿等常见面部组件外,GFP-GAN在头发和耳朵方面也表现得更好,因为GFP先验思量的是整个面部,而不是单独的部分。通过SC-SFT层,GFP-GAN可以或许实现高保真度。大多数先前的方法无法恢复闭着的眼睛,而GFP-GAN可以或许成功地恢复它们,并且产生的伪影更少。
1.3 代码分析

GFPGAN的项目代码是开源的,代码地址为:https://github.com/TencentARC/GFPGAN
接下来我将以我自身学习的实际情况对项目标一部分代码举行简朴分析。
(1)Input处置惩罚
Dataset的代码如下:
  1. def __getitem__(self, index):
  2.         ......
  3.         #直接看return内容
  4.         if self.crop_components:
  5.             return_dict = {
  6.                 'lq': img_lq,
  7.                 'gt': img_gt,
  8.                 'gt_path': gt_path,
  9.                 'loc_left_eye': loc_left_eye,
  10.                 'loc_right_eye': loc_right_eye,
  11.                 'loc_mouth': loc_mouth
  12.             }
  13.             return return_dict
  14.         else:
  15.             return {'lq': img_lq, 'gt': img_gt, 'gt_path': gt_path}
复制代码
这里返回的紧张有三项:img_lq,img_gt, gt_path,分别是LR输入、真值,和gt的路径。loc_left_eye、loc_right_eye、loc_mouth是使用眼睛和嘴巴位置信息时,作为可选输出。
其中img_lq是由img_gt变换得到的LR图像,img_gt是高分辨图像
再来看一下img_lq的天生过程
  1. def __getitem__(self, index):
  2.         ...#数据读入部分
  3.                 # ------------------------ generate lq image ------------------------ #
  4.         # blur
  5.         kernel = degradations.random_mixed_kernels(...)
  6.         img_lq = cv2.filter2D(img_gt, -1, kernel)
  7.         # downsample
  8.         scale = np.random.uniform(self.downsample_range[0], self.downsample_range[1])
  9.         img_lq = cv2.resize(img_lq, (int(w // scale), int(h // scale)), interpolation=cv2.INTER_LINEAR)
  10.         # noise
  11.         if self.noise_range is not None:
  12.             img_lq = degradations.random_add_gaussian_noise(img_lq, self.noise_range)
  13.         # jpeg compression
  14.         if self.jpeg_range is not None:
  15.             img_lq = degradations.random_add_jpg_compression(img_lq, self.jpeg_range)
  16.         # resize to original size
  17.         img_lq = cv2.resize(img_lq, (w, h), interpolation=cv2.INTER_LINEAR)
  18.         # random color jitter (only for lq)
  19.         if self.color_jitter_prob is not None and (np.random.uniform() < self.color_jitter_prob):
  20.             img_lq = self.color_jitter(img_lq, self.color_jitter_shift)
  21.         # random to gray (only for lq)
  22.         if self.gray_prob and np.random.uniform() < self.gray_prob:
  23.             img_lq = cv2.cvtColor(img_lq, cv2.COLOR_BGR2GRAY)
  24.             img_lq = np.tile(img_lq[:, :, None], [1, 1, 3])
  25.             if self.opt.get('gt_gray'):  # whether convert GT to gray images
  26.                 img_gt = cv2.cvtColor(img_gt, cv2.COLOR_BGR2GRAY)
  27.                 img_gt = np.tile(img_gt[:, :, None], [1, 1, 3])  # repeat the color channels
  28.         # BGR to RGB, HWC to CHW, numpy to tensor
  29.         img_gt, img_lq = img2tensor([img_gt, img_lq], bgr2rgb=True, float32=True)
  30.         # random color jitter (pytorch version) (only for lq)
  31.         if self.color_jitter_pt_prob is not None and (np.random.uniform() < self.color_jitter_pt_prob):
  32.             brightness = self.opt.get('brightness', (0.5, 1.5))
  33.             contrast = self.opt.get('contrast', (0.5, 1.5))
  34.             saturation = self.opt.get('saturation', (0, 1.5))
  35.             hue = self.opt.get('hue', (-0.1, 0.1))
  36.             img_lq = self.color_jitter_pt(img_lq, brightness, contrast, saturation, hue)
  37.        ...#像素值范围映射unit8,正则化
  38.        ...#return
复制代码
紧张就是暗昧、加噪、随机像素值抖动、随机灰度化、随机色彩变化等过程天生LR图像
(2)GFPGANv1
这块算是整个布局中内容最多的一部分了,该部分是对输入图像的通道举行降维,产生latent code,通过MLP送到天生器中。起首经过一个3通道到512通道的变换,然后再做通道和空间都举行下采样的6个相同利用,这部分是BasicSR内里的ResBlock函数完成的,可以自行查一下相关实现,最终输出latent code和必要举行空间特征约束的condition。
其中一部分作用是将img_lr 变成 latent code
  1.           def __init__(self, ...)
  2.                 first_out_size = 2**(int(math.log(out_size, 2)))
  3.                 #ConvLayer
  4.         self.conv_body_first = ConvLayer(3, channels[f'{first_out_size}'], 1, bias=True, activate=True)
  5.         # downsample
  6.         in_channels = channels[f'{first_out_size}']
  7.         self.conv_body_down = nn.ModuleList()
  8.         for i in range(self.log_size, 2, -1):
  9.             out_channels = channels[f'{2**(i - 1)}']
  10.             self.conv_body_down.append(ResBlock(in_channels, out_channels, resample_kernel))
  11.             in_channels = out_channels
  12.                 self.final_linear = EqualLinear(channels['4'] * 4 * 4, linear_out_channel, bias=True, bias_init_val=0, lr_mul=1, activation=None)
  13.         ...
  14.            def forward(self, ...)
  15.                    # encoder
  16.         feat = self.conv_body_first(x)
  17.         for i in range(self.log_size - 2):
  18.             feat = self.conv_body_down[i](feat)
  19.             unet_skips.insert(0, feat)
  20.         feat = self.final_conv(feat)
  21.         style_code = self.final_linear(feat.view(feat.size(0), -1))
  22.         ...       
复制代码
别的一部分产生Fspatial再通过卷积利用得到两个系数作为condition约束,送到下面的代码中处置惩罚
  1.         def __init__():
  2.                  # for SFT modulations (scale and shift)
  3.         self.condition_scale = nn.ModuleList()
  4.         self.condition_shift = nn.ModuleList()
  5.         for i in range(3, self.log_size + 1):
  6.             out_channels = channels[f'{2**i}']
  7.             if sft_half:
  8.                 sft_out_channels = out_channels
  9.             else:
  10.                 sft_out_channels = out_channels * 2
  11.             self.condition_scale.append(
  12.                 nn.Sequential(
  13.                     EqualConv2d(out_channels, out_channels, 3, stride=1, padding=1, bias=True, bias_init_val=0),
  14.                     ScaledLeakyReLU(0.2),
  15.                     EqualConv2d(out_channels, sft_out_channels, 3, stride=1, padding=1, bias=True, bias_init_val=1)))
  16.             self.condition_shift.append(
  17.                 nn.Sequential(
  18.                     EqualConv2d(out_channels, out_channels, 3, stride=1, padding=1, bias=True, bias_init_val=0),
  19.                     ScaledLeakyReLU(0.2),
  20.                     EqualConv2d(out_channels, sft_out_channels, 3, stride=1, padding=1, bias=True, bias_init_val=0)))
复制代码
然后将上面的两部分送到StyleGAN2Generator中处置惩罚,在逐层举行卷积运算时,将前面产生的conditions约束也参加运算。
总结

在实际应用中,GFPGAN模子已经成为人脸修复和增强的紧张工具之一,为增强实际、AI主播制作等领域带来了更加自然、逼真和智能的交互体验。随着技术的不停发展和完善,GFPGAN模子将会在未来发挥更加紧张的作用。通过本周的学习,我对wav2lip有了初步的认识和相识,只管GFPGAN相较于已往的技术有明显提拔,但其也是存在不足。作者提出,当真实图像退化严重时,GFPGAN还原的面部细节会因伪影而扭曲。这是因为合成降级和训练数据分布与实际不同造成的。办理方法是从真实数据中学习这些分布,而不是仅仅使用合成数据,这将是未来研究的一个突破口。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

南七星之家

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表