Press "Enter" to skip to content

深度图像修复的回顾和改进:使用生成对抗网络基于Patch的图像修复

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

本文已参加【新人创作礼】活动,一起开启掘金创作之路。

 

导读

 

相比于之前,在图像修复网络结构中增加了残差块,并对每个局部区域都进行了真假的判别。

 

今天,我想给我们到目前为止讨论过的深度图像修复做一个回顾。另外,我想再复习一篇图像修复的论文,巩固深度图像修复的知识。

 

回顾

 

在这里,让我们首先简要回顾一下我们从以前的帖子中学到了什幺。

 

Context Encoder (CE) 是 第一个基于GAN的修复算法 。它强调了在修复任务中理解整个图像的上下文的重要性,并使用(channel-wise)全连接层来实现这一功能。文章链接: 用生成模型来做图像恢复的介绍和回顾:上下文编码器

 

Multi-scale Neural Patch Synthesis (MNPS)可以看作是CE的改进版本。它由两个网络组成,即内容网络和纹理网络。内容网络是CE,纹理网络是预先训练好的用于分类任务的VGG-19。使用纹理网络的想法来自于最近成功的神经风格迁移。简单地说,对于高级视觉任务(如对象分类),预训练网络的神经响应包含有关图像模式的信息。通过鼓励在缺失区域内外产生相似的神经响应,我们可以进一步增强生成像素的纹理细节,因此完成的图像将更真实。文章链接: 使用多尺度patch合成来做高分辨率的图像复原

 

Globally and Locally Consistent Image Completion (GLCIC)是深度图像修复任务中的一个里程碑。作者采用完全卷积网络(FCN)与扩张卷积(DilatedConv)作为他们提出的模型的框架。FCN允许不同的输入大小和带膨胀的conv来替换通道全连接层,用于理解整个图像上下文。在此基础上,采用两种鉴别器对两种尺度下的完整图像和真实图像进行区分。一个全局判别器着眼于整个图像,而一个局部判别器着眼于局部填充后的图像patch。文章链接: 图像修复中的一个里程碑:全局和局部一致性的图像补全

 

今天,我们将回顾这篇论文, Patch-Based Image Inpainting with Generative Adversarial Networks 。这可以看作是GLCIC的一种变体,因此我们可以对这种典型的网络结构做了一些修改。

 

动机

 

本文作者希望利用残差链接和PatchGAN鉴别器的优势,进一步提高其修复效果。图像识别的深度残差学习(Deep Residual Learning for Image Recognition, ResNet)在深度学习方面取得了显着的成就。

 

通过使用残差块(残差连接),我们能够训练非常深的网络,许多论文表明残差学习对于获得更好的结果是有用的。

 

PatchGAN在图像对图像的转换方面也取得了巨大的成功。与典型GAN中的鉴别器相比,PatchGAN鉴别器(参见下面的图1)输出的是一个矩阵(2d-array),而不是单个值。简单来说,典型GAN鉴别器的输出是0 ~ 1的单个值。这意味着鉴别器会看整个图像,判断这幅图像是真的还是假的。如果图像是真实的,它应该等于1。如果图像是假的(即生成的图像),它应该给出0。该式子关注的是整个图像,因此可能忽略图像的局部纹理细节。另一方面,PatchGAN判别器的输出是一个矩阵,这个矩阵中的每个元素都在0到1之间。注意,每个元素代表输入图像中的一个局部区域,如图1所示。因此,这一次,判别器需要查看多个局部图像patch,并判断每个patch的真伪。通过这样做,生成的图像的局部纹理细节可以得到增强。这就是为什幺PatchGAN被广泛应用于图像生成任务。

 

 

图1,PatchGAN 判别器,输出是一个矩阵,矩阵中的每个元素表示输入图像的一个局部区域,如果局部区域是真实的,我们会得到1,否则是0

 

介绍

 

图像修复可以看作是一种图像生成任务。我们希望填充图像中缺失的区域(即生成缺失的像素),这样图像就完整了,看起来更真实。

 

为了生成逼真的图像,GAN通常用于不同的图像生成任务,包括图像修复。典型的GAN鉴别器只通过一个单一的值[0,1]来判断输入是否为实数。本文将这种GAN鉴别器称为全局GAN (G-GAN)。

 

另一方面,如前一节所述,PatchGAN会在输入中查看多个局部区域,并独立决定每个局部区域的真实性。研究人员已经表明,使用PatchGAN可以通过关注更多的局部纹理细节,进一步提高生成图像的视觉质量。

 

方案

 

生成器采用了具有膨胀卷积的残差块( 膨胀残差块 )。(作者希望通过使用残差学习来提高修复效果)

 

Mixture of PatchGAN and G-GAN discriminators (PGGAN)被提出,以鼓励输出完成的图像应该具有全局和局部真实的外观。(与GLCIC的意图相同,GLCIC使用两个鉴别器,一个全局和一个局部)

 

贡献

 

PatchGAN和G-GAN discriminator (PGGAN)的组合其中早期的卷积层是共享的。实验结果表明,该方法可以进一步增强生成像素的局部纹理细节。

 

生成网络中使用了 膨胀和插值卷积 。通过使用 膨胀残差块 ,改善了修补效果。

 

方法

 

 

图2,提出的ResNet结构的生成网络和PGGAN判别器

 

 

图3,提出的GLCIC的结构

 

图2和3分别给出本文和GLCIC所提出的网络结构。很明显,他们是相似的。两个主要区别是 i) 在生成器中使用了膨胀残差块,ii) 修改了GLCIC中的全局和局部判别器。

 

在GLCIC中,全局判别器以整个图像作为输入,而局部识别器以填充区域周围的一个子图像作为输入。将两个判别器的输出连接起来,然后返回一个值来显示输入是真还是假( 一个对抗损失 )。从这个角度来看,局部判别器会聚焦在局部填充的图像patch上,从而增强填充的图像patch的局部纹理细节。一个主要缺点是 局部判别器的输入依赖于缺失区域 ,作者在训练期间假设一个单一的矩形缺失区域。

 

对于PGGAN判别器,我们几乎没有 早期共享卷积层 ,如图2所示。然后,我们有 两个分支 ,一个给出一个输出值(G-GAN),一个给出一个输出矩阵(PatchGAN)。请注意1×256是16×16矩阵的reshape形式。如上所述,这也是一种让判别器在区分完整图像和真实图像时同时关注全局(整幅图像)和局部(局部图像patch)信息的方法。请注意,在这种情况下,我们有两个对抗损失,因为我们有两个分支。

 

膨胀残差块

 

在之前的文章中,我已经介绍过CNN的膨胀卷积。简单回忆一下, 膨胀卷积通过跳过连续的空间位置增加感受野,而不添加额外的参数 。

 

 

图4,残差块类型,从上到下依次为:标准残差块、扩张卷积在前的残差块、扩张卷积在后的剩余块\

 

简单地说,残差块可以写成Y = X + F(X),其中Y是输出,X是输入,F是几个层次的序列。在图4的基本残差块中,F为conv – norm – relu – conv。这意味着我们将X输入一个卷积层,然后是一个归一化层,一个ReLU激活层,最后是另一个卷积层得到F(X)。一个要点是,输入X是直接添加到输出Y上的,这就是我们称之为跳跃连接的原因。由于在这条路径上没有任何可训练的参数,我们可以确保在反向传播过程中必须有足够的梯度传递到早期的层。因此,我们可以训练一个非常深度的网络而不会遇到梯度消失的问题。

 

为什幺要用残差块?

 

你可能想知道使用残差块的好处。你们中的一些人可能已经知道答案了。以下是我的看法。让我们比较一下Y = X + F(X)和Y = F(X),对于Y = X + F(X),我们学习的实际上是F(X) = Y – X, Y和X的差值。这就是所谓的残差学习,X可以作为残差学习的参考。另一方面,对于Y = F(X),我们直接学习在没有参考的情况下将输入X映射到输出Y。所以,人们认为残差学习是比较容易的。更重要的是,很多论文已经证明了残差学习可以带来更好的效果!

 

由于膨胀卷积有助于增加感受野,这对修复任务很重要,作者用膨胀卷积层替换了两个标准卷积层中的一个,如图4所示。膨胀残差块有两种类型,i) 以膨胀卷积在前,ii) 膨胀卷积在后。在本文中,根据膨胀残差块的数量,膨胀率从1开始每次增加2倍,例如,如果有4膨胀残差块,膨胀率为1,2,4,8。

 

插值卷积

 

为了解决标准反卷积(即转置卷积)造成的伪影,作者在这项工作中采用了插值卷积。对于插值卷积,首先使用典型的插值方法,如双线性和双三次插值,将输入调整到所需的大小。然后,应用标准卷积。下面的图5显示了转置卷积和插值卷积的区别。

 

 

图5,使用转置卷积核插值卷积的可视化比较

 

在我看来,这两种类型的卷积具有相似的性能。有时转置卷积更好,有时插值插卷积更好。

 

判别网络

 

我们讨论了本文使用的PGGAN鉴别器。回想一下,这里的鉴别器有两个分支,一个分支给出一个值,就像global-GAN (G-GAN)一样,另一个分支给出256个值,其中每个值表示输入中局部区域的真实性。

 

关注输入图像中多个局部区域的真实性,有助于改进完成图像的局部纹理细节。

 

目标函数

 

实际上,本文中使用的损失函数(即目标函数)与我们之前讨论过的论文或多或少是相同的。

 

重构损失:这种损失是为了保证逐像素的重构精度。我们通常使用L1或L2(欧几里得)距离来计算这个损失。本文采用 L1损失 作为它们的重构损耗。

 

 

N 为训练批中的图像数量。 WHC 分别是训练图像的宽度、高度和通道。 xy 分别为ground truth和模型给出的完整图像。

 

对抗损失:我想你们大多数人现在都熟悉这种典型的对抗损失。

 

 

x 是ground truth,所以我们希望 D ( x )返回1,否则返回0。注意, D 只是鉴别器的函数形式。

 

联合损失:

 

 

式3为其联合损失函数。Lambda 1, 2, 3用来平衡每个损失的重要性。 g_adv 表示全局分支给出的输出,而 p_adv 表示PatchGAN分支给出的输出。需要注意的是,在他们的实验中,λ 1,2,3分别设置为0.995,0.0025和0.0025。

 

实验结果

 

在他们的实验中使用了三个数据集。 i) Paris StreetView 包含14900张训练图像和100张测试图像。 ii) 谷歌StreetView 拥有62058张高分辨率图像,分为10个部分。第一部分和第10部分用于测试,第9部分用于验证,其余部分用于训练。总共有46200张训练图像。 iii) Places 包含超过800万的训练图像。该数据集仅用于测试,以显示其通用性。

 

为了比较典型残差块和膨胀残差块的性能,训练了 PGGAN-Res 和 PGGAN-DRes 两个模型。对于PGGAN-Res,使用基本残差块和3个子采样块。这意味着输入被向下采样了2倍3次。对于PGGAN-DRes,使用膨胀残余块和2个子采样块。这意味着输入被下采样2倍。

 

 

图6,用不同的判别器训练同一生成器网络的结果。

 

图6显示了用不同判别器训练同一生成器网络的修复结果。从图6的最后一列来看,如果只使用G-GAN鉴别器,则会观察到窗口的局部纹理细节很差。与G-GAN相比,PatchGAN提供了更好的窗口局部纹理细节,但窗口的角落看起来与全局结构不一致。总之,PGGAN可以提供最好的视觉效果。

 

 

表1,巴黎街景256×256图像的定量比较

 

 

表2,来自巴黎街景数据集中512×512图像的定量比较

 

表1和2给出了在256×256和512×512两种分辨率下,不同方法在Paris StreetView数据集上的定量比较。需要注意的是,CE是Context Encoder, NPS是Multi-scale Neural Patch Synthesis (MNPS) , GLGAN是global and local Consistent Image Completion (GLCIC)。我们已经在前面的文章中讨论了所有这些方法。

 

从表1和表2可以明显看出,PGGAN对所有这些措施都有改进。但是,请记住,视觉质量比这些客观的评价指标更重要。

 

 

图7,用不同的方法对完整图像进行感知比较。

 

作者对这些方法进行了感知评估,如图7所示。12名投票者被要求对原始图像的自然程度和各种方法的修复结果进行评分。每个选民从巴黎街景数据集中随机分配了500张图像。注意CE是在128×128图像上训练的,因此它在256×256测试图像上的性能很差。其他方法在这种感知评价上也有类似的表现。

 

 

图8,256×256巴黎街景数据集的量化比较

 

 

图9,512×512巴黎街景数据集的量化比较

 

图8和图9分别显示了大小为256×256和512×512的图像的修复结果。我建议读者放大以更好地查看结果。在我看来,PGGAN-DRes和PGGAN-Res通常会给出更好的局部纹理细节,例如,图8中的第4行和图9中的第3行。

 

总结

 

首先,将残差学习的概念以膨胀残差块的形式嵌入生成网络。从他们的实验结果来看,残差学习有助于提高修复性能。

 

其次,将PatchGAN判别的概念与传统的GAN判别器 (G-GAN)相结合,以鼓励更好的局部纹理细节和全局结构一致性。

 

要点

 

和以前一样,我想在这一节中列出一些有用的要点。如果你看过我之前的文章,你会发现这篇文章相对简单。

 

实际上,本文的大部分内容与GLCIC相似。在网络结构中嵌入了两个新的概念,即残差块和PatchGAN判别器,进一步增强了修复结果。

 

希望你能认识到这种典型的图像修复网络架构。后来的图像修复的论文中提出的网络或多或少都是一样的。

 

你还应该注意到重建损失和对抗损失是图像修复任务的两个基本损失。本文提出的修复论文的方法必须包括L1损失和对抗性损失。

 

英文原文: towardsdatascience.com/revision-fo…

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注