ronghuaiyang · 2021年03月23日

图像修复中的一个里程碑:全局和局部一致性的图像补全

首发:AI公园公众号
作者:Chu-Tak Li
编译:ronghuaiyang

导读

全局一致让图像补全的内容契合上下文,局部一致性让纹理更加真实。

欢迎大家回来,希望之前的文章能激起你们对图像修复深层生成模型的好奇。如果你没有读过之前的文章,我强烈建议你浏览一下:

1、用生成模型来做图像恢复的介绍和回顾:上下文编码器

2、使用多尺度patch合成来做高分辨率的图像复原

今天我们将深入到深图像修复的另一个里程碑!

回顾

这里只是对我们之前所学内容的一个简单回顾。

  • 对于图像修复,填充像素的纹理细节是很重要的。有效的像素和填充的像素应该是一致的,填充的图像应该看起来真实。
  • 粗略的说,研究者采用逐像素的重建损失(即L2损失)来确保我们可以用“正确”的结构来填补缺失的部分。另一方面,GAN损失(即对抗损失)和/或[纹理损失]应用于获得具有更清晰的生成像素纹理细节的填充图像。

动机

image.png

图1,一个例子来说明为图像修复任务生成新的片段的需求。

对于基于patch的方法,一个很大的假设是我们相信我们可以在缺失区域之外找到相似的patch,这些相似的补丁将有助于填充缺失区域。这个假设对于自然场景可能是正确的,因为天空和草坪在一个图像中可能有许多相似的patch。如果缺失区域之外没有任何类似的patch,就像图1中所示的人脸图像修复的情况。在这种情况下,我们找不到眼睛的patch来填补相应的缺失部分。因此,鲁棒的修复算法应该能够生成新的片段

现有的基于GAN的修复方法利用一个鉴别器(对抗损失)来增强填充区域的锐度,将填充区域输入到鉴别器(即欺骗鉴别器)。有些人可能会在预训练的网络中比较缺失区域内部和外部的局部神经响应,以确保缺失区域内部和外部的局部小块的纹理细节相似。如果我们同时考虑图像的局部和全局信息来加强局部和全局一致性呢?我们会得到更好的完整图像吗?让我们看看。

image.png

图2,上下文编码器的神经网络结构

如何处理高分辨率图像?我们之前已经讨论过第一种基于GAN的修复方法,上下文编码器。他们假设测试图像总是128×128和一个64×64中心缺失的洞。然后,我们还在上一篇文章中介绍了上下文编码器的改进版本,称为Multi-Scale Neural Patch Synthesis。他们提出了一种多尺度的方法来处理测试图像,最大的分辨率为512×512,中心缺失的孔为256×256。简而言之,他们采用了三种不同尺度的图像网络,即128×128、256×256和512×512。因此,速度是他们提出的方法的瓶颈。使用Titan X GPU填充512×512的图像大约需要1分钟。这是个有趣的问题!我们如何处理高分辨率图像,只需一个单一的的网络?给你几秒钟的思考时间,你可能会从图2所示的架构中发现一些提示(注意中间层)。一个快速的解决方案是去掉中间的全连接层,并采用全卷积网络!你很快就会知道怎么做,为什么要这样做!

介绍

现有的方法大多假设可以找到相似的图像patch来填补同一幅图像中缺失的部分。这种情况并不总是适用于图像修复,见图1。更准确地说,我们应该看整个图像,了解它的上下文,然后根据它的上下文来填补缺失的部分。

如果使用全连接层,输入图像的大小必须是固定的。因此,网络不能处理不同分辨率的测试图像。回想一下,完全连接的层完全连接了两层之间的所有神经元,因此它对前一层输出大小的变化很敏感,测试图像的大小必须固定。另一方面,对于卷积层,神经元之间没有全连接。更小的输入特征映射将导致更小的输出特征映射。所以,如果一个网络只由卷积层组成,它就可以处理不同大小的输入图像。我们称这种网络为全卷积网络(FCNs)

方案

采用膨胀卷积代替全连接层,这样我们仍然可以理解图像的上下文,构建一个全卷积网络(Fully Convolutional Network, FCN)来处理不同大小的图像。

使用两个鉴别器来保证完成(填充)图像的局部和全局一致性。一个鉴别器在全局意义上看整个图像,而一个在局部意义上看被填充区域周围的子图像。

使用简单的后处理。有时很明显可以看出生成的像素和有效像素之间的区别。为了进一步提高图像的视觉质量,本文采用了两种传统的方法,即Fast Marching method和Poisson image blend。这两种技术超出了本文的范围。之后,在一定程度上将后处理步骤以细化网络的形式嵌入到网络中。我们将在后面的文章中讨论它。

贡献

  • 提出一种全卷积的网络扩展卷积图像修复。它允许我们在不使用全连接的层的情况下理解图像的上下文,因此训练过的网络可以用于不同大小的图像。这个架构实际上是后来基于深度学习的图像修复方法的基础。这就是为什么我认为这篇文章是图像修复的一个里程碑。
  • 建议使用两个判别器(一个局部的和一个全局的)。多尺度鉴别器似乎可以在不同尺度上提供较好的完整图像纹理细节。
  • 强调图像修复任务中产生新片段的重要性。实际上,训练数据是非常重要的。简单地说,你不能生成你以前没见过的东西。

方法

image.png

图3,提出方法的结构

图3显示了提出的方法的网络架构。它由三个网络组成,分别是Completion网络(即生成器,既用于训练又用于测试)、局部鉴别器和全局鉴别器(用于刚训练时作为辅助网络用于学习)。快速回顾一下这个GAN框架。Generator负责补全图像以欺骗discriminator,而discriminator负责将完整图像与真实图像区分开来。

CNNs中的膨胀卷积

膨胀卷积的概念对于读者理解本文的网络设计是很重要的。所以,我想尽力为那些不熟悉膨胀卷积的读者解释一下。对于非常了解它的读者,也请快速回顾一下。
image.png

图4,标准卷积和膨胀卷积的图解

在论文中,作者用了半页的篇幅来描述cnn、标准卷积和扩张卷积。并给出了相应的卷积方程供参考。我需要澄清一点,膨胀卷积并不是本文作者提出的,他们是将其用于图像修复。

这里,我想用一个简单的图来说明标准卷积和膨胀卷积的区别。

图4(a)是带有3×3 kernel, stride=1, padding=1,膨胀率=1的标准卷积层。这种情况的设置中,8×8输入给出8×8的输出,每个相邻的9个位置在输出中贡献一个元素。

图4(b)也是一个标准的卷积层。这次我们使用5×5 kernel,stride=1, padding=2(为了保持相同的输入和输出大小)和膨胀率=1。在这种情况下,每个相邻的25个位置对输出的每个元素都有贡献。这意味着对于输出的每个值,我们必须更多地考虑(查看)输入。我们通常指更大的感受野。对于一个大的感受野,更多的来自遥远空间位置的特征将被考虑进去,在输出时给出每个值。

然而,对于图4(b)中的情况,我们使用一个更大的kernel (5×5)来获得更大的感受野。这意味着需要学习更多的参数(3×3=9,而5×5=25)。有没有办法在不增加更多参数的情况下增加感受野?答案是膨胀卷积。

图4(c)是一个膨胀卷积层,使用3×3 kernel, stride=1, padding=2,膨胀率=2。当比较图4(b)和(c)中的kernel的覆盖时,我们可以看到它们都覆盖了输入处的5×5局部空间区域。3×3的kernel可以通过跳过连续的空间位置来获得5×5 kernel的感受野。跳跃的step是由膨胀率决定的。例如,一个3×3内核的膨胀率=2给出5×5感受野,一个3×3核的膨胀率=3给出一个7×7的感受野,以此类推。显然,膨胀卷积通过跳过连续的空间位置来增加感受野,而不需要添加额外的参数。这样做的优点是,我们有更大的感受野,同时有相同数量的参数。缺点是我们会跳过一些位置(我们可能会因此丢失一些信息)。

为什么要用膨胀卷积?

在回顾了膨胀卷积的概念之后,我将讨论为什么作者在他们的模型中使用膨胀卷积。你们中的一些人可能已经猜到原因了。

如前所述,了解整个图像的上下文对于图像修复的任务是重要的。以前的方法使用全连接层作为中间层,以便理解上下文。记住,标准卷积层在局部区域执行卷积,而全连接层则完全连接所有的神经元(即每个输出值取决于所有的输入值)。然而,全连接层限制了输入图像的大小,并引入了更多的可学习参数。

为了解决这些限制,我们使用膨胀卷积来构建一个全卷积的网络,允许不同大小的输入。另一方面,通过调整标准kernel(通常是3×3)的膨胀率,我们可以在不同的层次上拥有更大的感受野,以帮助理解整个图像的上下文。

image.png

图5,不同大小的感受野的影响。

图5是一个展示膨胀卷积的有用性的例子。你可能认为(a)是带有3×3核(较小的感受野)的标准卷积,(b)是带有3×3核且扩张率≥2(较大的感受野)的膨胀卷积。位置p1和p2在孔内区域,p1靠近边界,p2大致在中心点。对于(a),可以看到p1位置的感受野(影响区域)可以覆盖有效区域。这意味着可以使用有效像素来填充位置p1的像素。另一方面,p2位置的感受野不能覆盖有效区域,因此不能使用有效区域的信息进行生成。

对于(b),我们使用膨胀卷积来增加感受野。这一次,两个位置的感受野都可以覆盖有效区域。读者现在可以认识到扩张卷积的有效性了。

Completion网络

让我们回到Completion 网络的结构,如图3所示。

image.png
表1,Completion网络结构。,每个卷积层后面都是ReLU,除了最后一个后面是Sigmoid

Completion 网络是一个全卷积的网络,接受不同大小的输入图像。该网络对输入进行2次2倍的下采样。这意味着,如果输入是256×256,中间层的输入大小是64×64。为了充分利用有效像素,保证像素精度,我们用有效像素替换孔区域以外的像素。

上下文判别器

让我们来谈谈局部和全局判别器。没有什么特别的,就像单个判别器的情况一样。唯一的不同是这次我们有两个。

image.png
表2,局部和全局鉴别器的结构,FC代表全连接层,连接层(c)的最终FC后面是Sigmoid

局部和全局判别器的架构基本相同。全局判别器的输入图像大小为256×256(整个图像,用于全局一致性),而局部判别器的输入为128×128,围绕缺失区域的中心,用于局部一致性。

需要注意的一点是,在训练过程中,总有一个区域是缺失的。在测试过程中,图像中可能存在多个缺失区域。除此之外,对于local discriminator,由于真实图像没有填充区域,所以对真实图像采用128×128 patch的随机选择。

训练策略和损失函数

与之前一样,使用两个损失函数来训练网络,即L2损失和对抗损失(GAN损失)。
image.png

_C_(_x_, _M\_c_)将completion网络表示为函数。_x_是输入图像,_M\_c_是表示缺失区域的二进制掩码。缺失区域为1,外部区域为0。你可以看到L2损失是在缺失区域内计算的。注意,补全的图像的外部区域的像素直接被有效像素替换。
image.png
_D_(_x_, _M\_d_)将两个鉴别器表示为一个函数。_M\_d_是一个随机掩码,用于为局部判别器随机选择一个图像patch。这是一个标准的GAN损失。我们希望该判别器不能区分完整的图像和真实的图像,从而得到具有真实纹理细节的完整图像。

image.png

这是训练网络的联合损失函数。alpha是一个加权超参数,以平衡L2损失和GAN损失。

image.png

作者将他们的训练分为三个阶段。i) 训练仅带L2损失的completion网络,迭代次数为_T\_C_。ii) 修正completion网络,使用GAN损失训练判别器进行_T\_D_迭代。iii) 交替训练completion网络和判别器,直到训练结束。

对于稳定训练,除completion网络的最后一层和判别器外,所有卷积层都采用批处理归一化(BN)。

为了生成训练数据,他们随机地将图像的最小边缘大小调整到[256,384]像素范围。然后,他们随机截取256×256图像补丁作为输入图像。对于掩模图像,随机生成一个区域,每个边的范围为[96,128]。

简单的后处理:如前所述,作者还采用了传统的Fast Marching方法,随后采用泊松图像混合,进一步提高完成图像的视觉质量。

实验

作者使用Places2数据集中的8097967张训练图像训练他们的网络。联合损失函数中的alpha加权超参数设置为0.0004,batch大小为96。

本文中,completion网络训练为_T\_C_ = 90000次迭代,训练判别器_T\_D_ = 10,000次迭代,最后联合训练所有网络400,000次迭代。他们声称,整个训练过程在一台4个k80 GPU的电脑上大约需要2个月的时间。

image.png

表3,所提出方法的用时

他们使用Intel Core i7-5960X 3.00 GHz 8核CPU和NVIDIA GeForce TITAN X GPU对CPU和GPU进行评估。实际上,速度相当快,只需半秒多一点就可以完成1024×1024的一张图片。

640.png

图6,和已有方法的对比

图6显示了与一些现有方法的比较。总的来说,基于patch的方法可以用局部一致的图像patch来完成,但可能不会是全局一致的。最近的基于GAN的方法,上下文编码器(第5行),倾向于给出模糊的完整图像。该方法提供了局部和全局一致的完整图像。

image.png

图7,和上下文编码器的对比,在同样的数据集上训练填补中心缺失孔洞

为了与最先进的基于GAN的修复方法进行比较,作者进行了中心区域补全,结果如图7所示。可以看出,CE对于中心区域补全的性能优于任意区域补全(图6)。在我看来,CE与本文方法在图7中具有相似的性能。读者可以放大看其中的差异。

image.png

图8,不同判别器的效果

作者对这两种判别器进行了消融研究。从图8(b)和(c)可以看出,当不使用局部判别器时,补全的区域看起来更加模糊。另一方面,对于(d),如果只使用局部判别器,我们可以得到良好的局部一致纹理细节,但不能保证全局一致性。对于(e)中的full方法,我们获得了局部和全局一致的结果。

image.png

图9,简单后处理的结果

图9显示了简单后处理的效果。对于图9(b),我们可以很容易地观察到边界。

image.png

图10,使用不同的数据集的修复结果

图10显示了在不同数据集上训练的模型的修复结果。注意,Places2包含了大约800万张不同场景的训练图像,而ImageNet包含了100万张用于目标分类的训练图像。我们可以看到,在Places2上训练模型的结果比在ImageNet上训练的结果稍好一些。
image.png

图11,用提出的方法来做目标移除的例子

图像修复的一个潜在应用是物体移除。图11显示了使用所提方法删除目标的一些例子。

image.png
图12,更多特定数据集的结果

本文的作者还考虑了域特定的图像修复。他们在CelebA数据集和CMP Facade数据集上微调了他们的预训练模型,这两个数据集分别由202599和606张图像组成。他们使用了Places2数据集上的预训练模型。对于新的数据集,他们从无到有训练判别器,然后进行completion网络和判别器交替训练。

图12显示了本文方法对特定领域图像的修复结果。对于面部修复,该方法能够生成眼睛和嘴等新的片段。对于立面的修复,本文提出的方法还能够生成与整个图像局部和全局一致的窗口等片段。

作者还对完整的面部图像进行了用户研究。结果表明,在10个用户中,使用该方法得到的77.0%的完整人脸被视为真实人脸。另一方面,96.5%的真实面孔可以被这10个用户正确识别。

限制和讨论

以下是作者对其局限性和未来发展方向的几点看法。

640 (1).png

图13,失败的例子 i) mask在图像的边缘 ii) 复杂的场景

对于图13左侧的情况,我们可以看到缺失的部分位于上方图像的边框。作者声称,在这种情况下,可以从邻近位置借用的信息更少,因此基于GAN的方法(第3行和第4行)比传统的基于patch的方法(第2行)表现更差。另一个原因是这个例子是自然场景,所以基于patch的方法可以很好地工作。

对于图13右侧的例子,场景要复杂得多。根据这个mask,我们想要移除一个人,我们需要填充一些建筑的细节来完成这个复杂的场景。在这种情况下,所有的方法都不能正常工作。因此,在复杂的场景中填补缺失的部分仍然是的挑战。
640 (2).png

图14,举例说明生成新片段的重要性,我们只能生成之前在训练中看到的内容。

作者提供了额外的例子来强调另外两点。i) 产生诸如眼睛、鼻子、嘴巴等新颖片段的重要性。ii)训练数据集的重要性。

对于无法找到相似的图像patch来填补缺失部分的情况,基于patch的方法(第2行和第3行)无法正常工作,如图14所示。因此,一个鲁棒的修复算法必须能够生成新的片段

为了进一步显示训练数据集选择的重要性,作者比较了在Places2 (General dataset, (d))和CelebA (Face dataset, (e))上训练的两个模型。显然,(d)无法用合理的面部细节来填补缺失的部分,因为它是在没有任何对齐的面部图像的Places2上训练的。另一方面,(e)工作得很好,因为它是在CelebA上训练的,一个有许多对齐的人脸图像的数据集。因此,我们只能生成我们在训练中看到的东西。全面的修复还有很长的路要走。

总结

所提议的结构是后来大多数修复论文的基础。膨胀卷积的全卷积网络允许我们在不使用全连接的层的情况下理解图像的上下文,因此网络可以获取不同大小的输入图像。

多尺度的鉴别器(在这里我们有两个鉴别器,实际上有些可能有三个!) 对于在不同尺度上增强完整图像的纹理细节是很有用的。

当场景很复杂的时候,补上缺失的部分仍然很有挑战性。另一方面,自然场景是比较容易修复的。

要点

在这里,我想列出一些对以后的文章有用的观点。

  • 请记住,膨胀卷积的全卷积网络是一种典型的图像修复网络结构。它允许不同大小的输入,并提供类似于全连接层的功能(即帮助理解图像的上下文)。

    事实上,人脸图像的修复相对来说比一般的图像修复简单。这是因为我们总是在人脸数据集上训练一个模型来进行人脸图像修复,而该数据集由许多对齐的人脸图像组成。对于一般的图像修复,我们可以训练一个更多样化的数据集,如Places2,它包含来自不同类别(如城市、建筑和许多其他类别)的数百万张图像。对于一个模型来说,学习生成所有具有良好视觉质量的东西要困难得多。不管怎样,还有很长的路要走。

—END—

英文原文:https://towardsdatascience.co...

推荐阅读

关注图像处理,自然语言处理,机器学习等人工智能领域,请点击关注AI公园专栏
欢迎关注微信公众号
AI公园 公众号二维码.jfif
推荐阅读
关注数
8257
内容数
210
关注图像处理,NLP,机器学习等人工智能领域
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息