CVPR2018: Generative Image Inpainting with Contextual Attention 论文翻译、解读

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

  CVPR2018: Generative Image Inpainting with Contextual Attention 论文翻译、解读
  
  注:博主是大四学生,翻译水平可能比不上研究人员的水平,博主会尽自己的力量为大家翻译这篇论文。翻译结果仅供参考,提供思路,翻译不足的地方博主会标注出来,请大家参照原文,请大家多多关照。
  
  未经允许,严禁转载。
  
  0. 译者序
  
  题目翻译:基于内容感知生成模型的图像修复
  
  介绍:这篇文章也被称作deepfill v1,作者的后续工作 "Free-Form Image Inpainting with Gated Convolution" 也被称为deepfill v2。两者最主要的区别是,v2支持任意形状的mask(标记图像待修复区域的罩子),且支持标记黑线来指定修复的大致形状。
  
  相关资料:
  
  deepfill v1官方介绍
  
  deepfill v2官方介绍
  
  deepfill v1官方Tensorflow代码
  
  deepfill v2非官方Tensorflow代码
  
  量子位对deepfill v2的介绍(知乎)
  
  多种感知模型(Attention Model)的介绍
  
  卷积核的膨胀(dilation)
  
  近期在做有关图像修复的工作,正好看到CVPR2018上这篇Jiahui Yu(余家辉)大牛的著作deepfill v1,在此基础上作者与其导师Thomas S.Huang(黄煦涛,计算机视觉之父)等人发布了deepfill v2 。本博文只关注deepfill v1,今后会更新deepfill v2的翻译解读。
  
  引言 Abstract
  
  近期的基于深度学习的图像修复方法展现了很大的潜力,这些方法都能生成看似合理的图像结构及纹理,但在修复区域的边界,经常会生成扭曲的结构和模糊的图像,这是因为卷积神经网络无法从图像较远的区域提取信息导致的。不过,传统的纹理和斑块(patch)的修复能取得比较好的效果(因为他们只需要从周围区域借鉴图像)。
  
  作者基于上述这些现象,提出了一种新的基于深度生成模型的方法,不仅可以生成新的图像结构,还能够很好地利用周围的图像特征作为参考,从而做出更好的预测。
  
  该模型是一个前馈全卷积神经网络,可以处理包含多个缺失区域的图像,且在修复图像的时候,输入的图像大小没有限制。作者在人脸图像、自然图像、纹理图像等测试集上,都产生了比现在已有的方法更好的效果。
  
  1. 介绍 Introduction
  
  图像修复(填补缺失像素值)在计算机视觉领域是一项很重要的研究工作。其核心挑战就是能够综合现实情况(realistic)和图像的语义(semantic),来修补缺失的图像。
  
  早期的图像修复原理,都类似于纹理的合成,通过匹配(match)和复制(copy)背景的斑块来填补缺失的图像。这些方法在背景修复(background inpainting)任务上都有着比较好的结果,但他们无法修复一些比较复杂的,不可重复的图像结构(类似于人脸、物体)。更多地,这些方法不能捕捉到图像的高维特征(high-level semantics)。
  
  近期基于深度卷积网络和GAN(生成对抗网络)的图像修复方法,其原理都是通过自编码器,结合对抗网络训练的方式,来让生成的图像和存在的图像保持一致性。
  
  可惜的是,这些基于CNN的方法,通常都会在边界生成扭曲的结构和模糊的纹理。作者发现是因为卷积神经网络无法很好地提取远距离的图像内容(distant contextual information)和不规则区域的图像内容(hole regions)。
  
  举例来说,一个像素点的内容被64个像素点以外的内容影响,那么他至少要使用6层3x3的卷积核才能够有这么大的感受野(receptive filed)。而且由于这个感受野的形状是非常标准且对称的矩形(regular and symmetric grid),所以在不规则的一些图像内容上,无法很好地给对应特征分配正确的权值。
  
  近期的一项研究基于生成斑块和匹配斑块的相似性优化问题(optimize problem),能够提高效果,但由于是基于优化问题,需要非常多次的梯度下降迭代,以及处理一张512x512的图像需要很长的时间。
  
  作者提出了一个带有内容感知层(contextual attention layer)的前馈生成网络,这个网络的训练分为两个阶段。第一阶段是一个简单的卷积网络,通过不断修复缺失区域来产生损失值reconstruction loss,修复出的是一个比较模糊的结果。第二阶段是内容感知层的训练,其核心思想是:使用已知图像斑块的特征作为卷积核来加工生成出来的斑块,来精细化这个模糊的修复结果。它是这样来设计和实现的:用卷积的方法,来从已知的图像内容中匹配相似的斑块,通过在全通道上做softmax来找出最像待修补区域的斑块,然后使用这个区域的信息做反卷积(deconvolution)从而来重建该修补区域。
  
  (译者注:这里的思想应该是,假设我有一个待修补区域x,我要通过卷积的方法,从整个图像出匹配出几个像x的区域a, b, c, d,然后从a, b, c, d中使用softmax的方法挑选出最像x的那个区域,然后通过反卷积的方式,来生成x区域的图像。)
  
  这个内容感知模块,还有着空间传播层(spatial propagation layer)来提高感知的空间一致性。
  
  为了让网络能“想象”(hallucinate)出新的图像内容,有着另一条卷积通路(convolutional pathway),这条通路和内容感知卷积通路是平行的。这两个通路最终聚合并送入一个大哥哥来产生最后的输出。第二阶段的网络通过两个损失值来训练(重建损失值 reconstruction losses 和两个WGAN-GP损失(Wasserstein GAN losses),其中一个WGAN来观察全局图像,另一个WGAN来观察局部生成出的图像。
  
  网络架构如下图:
  
  图1
  
  作者的主要贡献总结如下:
  
  作者提出了一种全新的内容感知层(contextual attention layer)来从距离遥远的区域提取近似待修复区域的特征。
  
  介绍了几种技术(图像修复网络增强、全局和局部的WGANs、空间衰减的重建损失(spatially discounted reconstruction loss, 会在下文中讲到)来提高训练的稳定性和速度,上述这些方法都基于最近的图像修复生成网络。最终,作者能够在一周内训练出该网络而不是两个月。(据译者在github issue里看到,作者使用的是一个GTX1080Ti进行训练)
  
  作者的前馈生成网络在众多具有挑战的数据集(例如CelebA、CelebA-HQ、DTD textures、ImageNet、Places2)实现了高质量的图像修复结果
  
  2. 相关研究 Related Work
  
  2.1 图像修复 Image Inpainting
  
  现有的图像修复技术分为两个流派,一个是传统算法,其基于扩散(diffusion)或斑块(patch-based),只能提取出低维特征(low-level features)。另一个是基于学习的算法,比如训练深度卷积神经网络来预测像素值。
  
  传统的扩散或斑块算法,通常使用变分算法(variational algorithms)或斑块相似性来将图像信息从背景区域传播到缺失区域内,这些算法在静态纹理(stationary textures)比较适用,但在处理一些非静态纹理(non-stationary textures)比如自然景观就不行了。
  
  Simakov等人提出的基于双向斑块相似性的方法(bidirectional patch similarity-based scheme)可以更好地模拟非静态纹理,但计算量十分巨大,无法投入使用。
  
  最近,深度学习和基于GAN的方法在图像修复领域很有前途,初始的研究是将卷积网络用于图像去噪、小区域的图像修复。内容编码器(Context Encoder)首先被用于训练大面积图像修复的深度神经网络。它使用GAN的损失值加上2-范数(MSE)作为重建损失值(reconstruction loss)来作为目标函数。
  
  更进一步的研究,比如Iizuka等人提出了利用全局和局部的判别器(Discriminator)来作为GAN的对抗损失,全局判别器用于判定整幅图像的语义一致性,局部判别器专注于小块生成区域的语义,以此来保证修复出的图像的高度一致性。
  
  此外,Iizuka等人还使用了扩展卷积(dialated convolutions)的方式来替代内容编码器的全连接层,这两种方法的目标都是为了提高输出神经元(output neurons)的感受野的大小。
  
  与此同时,还有多项研究专注于人脸的图像生成修复。例如Yeh等人通过在缺失区域的周围寻找一种编码,来尝试解码来获得完整的图像。Li等人引入了额外的人脸完整度作为损失值来训练网络。然而这些方法通常都需要图像的后续处理,来修复缺失区域边界上的色彩一致性(color coherency)。
  
  2.2 感知模型 Attention Modeling
  
  (译者注:感知模型在参考资料里有)
  
  关于深度卷积网络中的空间感知问题有着很多的研究。在这里,作者回顾了几个具有代表性的内容感知模型。
  
  首先是Jaderberg等人提出的STN(spatial transformer network),用来进行目标分类任务。由于整个网络专注于全局迁移问题(global transformation),所以在斑块大小的问题上不合适,不能用于图像修复。
  
  第二个是Zhou等人的表征扩散(appearance flow),就是从输入的图像中查找哪些像素点应该被移动到待修复区域,这种方法适合在多个同样的物体之间进行图像修复。但从背景区域还原前景效果不是很好(译者注:可能是因为找不到哪些像素点可以flow到前景)。
  
  第三个是Dai等人提出的空间感知卷积核的学习和激活。
  
  这些方法都不能很好地从背景中提取有效的特征。
  
  3. 改进图像修复的生成网络 Improved Generative Inpainting Network
  
  (译者注:为了不让读者读懵了,译者在这里说明一下接下来的论文结构。作者在第三部分改进了Iizuka等人提出的图像修复网络,在第四部分将内容感知层加入这个修复网络,从而构建出完整的图像修复网络)
  
  作者通过复现近期的图像修复模型(其实就是上文中提到的用全局和局部Discriminator的Iizuka的方案),以及做出多种提升方法来构建生成模型。Iizuka的模型在人脸图像、建筑图像、自然图像都能有较好的结果。
  
  1) 粗细网络 Coarse-to-fine network architecture
  
  网络结构如下图(其实就是上文中网络结构的简化版):
  
  图2
  
  整个网络的输入和输出和Iizuka的网络设定是一样的,也就是说,生成网络的输入是一张带有白色mask的图像,以及一个用于表示mask区域的二进制串,输出是一张完整的图像。作者配对(pair)了输入的图像和对应的二进制mask,这样就可以处理任意大小、任意位置、任意形状的mask了。
  
  网络的输入是带有随机矩形缺失区域的256x256图像,训练后的模型可以接受包含多个孔洞的任意大小的图像。
  
  在图像修复任务中,感受野的大小决定了修复的质量,Iizuka等人通过使用扩张卷积(dilated convolution)来增大感受野,为了进一步增大感受野,作者提出了粗细网络的概念。
  
  (译者注:这里扩张卷积的意思就是,将卷积核填充扩大,见参考资料,以此来提高感受野的大小,在下文中会反复提到。)
  
  粗网络(Coarse network)仅仅使用使用重构损失进行训练,而细网络(Refinement network)使用重构损失+两个GAN损失进行训练。
  
  直观上,细网络比带有缺失区域的图像看到的场景更完整(译者注:因为粗网络已经修复了一部分),因此编码器比粗网络能更好地学习特征表示。这种二阶段(two-stage)的网络架构类似于残差学习(residual learning)或是深度监督机制(deep supervision)。
  
  为了提高网络的训练效率以及减少参数的数量,作者使用了窄而深(thin and deep)的网络,在layer的实现方面,作者对所有layer的边界使用了镜像填充(mirror padding),移除了批归一化(batch normalization),原因是作者发现批归一化会降低修复的图像色彩的一致性。此外,作者使用了ELUs来替代ReLU,通过对输出卷积核的值的裁剪(clip the output filter values)来替代激活函数tanh或是sigmoid。另外,作者发现将全局和局部的特征表示分开,而不是合并到一起(Iizuka的网络合并到一起了),能够更好地对GAN进行训练。
  
  2) 全局和局部的WGAN Global and local Wasserstein GANs
  
  不同于先前的使用DCGAN进行图像修复,作者提出了WGAN-GP的修改版本。通过在第二阶段结合全局和局部的WGAN-GP损失来增强全局和局部的一致性(这一点是受Iizuka网络的启发)。WGAN-GP损失是目前已有的用于图像生成的GAN中表现最好的损失值(使用1-范数重建损失,表现的会更好)。
  
  (译者注:以下是公式证明推导来说明WGAN损失的有效性,译者的数学水平不够,请大家见谅,详细推导请参照原文)
  
  更精确的说,WGAN使用了Earth-Mover距离来比较生成图像和真实图像的分布。它的目标函数应用了Kantorovich-Rubinstein duality……
  
  3) 空间衰减重构损失 Spatially discounted reconstruction loss
  
  对于图像修复问题,一个缺失区域可能会有多种可行的修复结果。一个可行的修复结果可能会和原始图像差距很大,如果使用原始图像作为唯一的参照标准(ground truth),计算重构损失(reconstruction loss)时就会误导卷积网络的训练过程。
  
  直观上来说,在缺失区域的边界上修复的结果的歧义性(ambiguity),要远小于中心区域(译者注:这里的意思是边界区域的取值范围要比中心区域小)。这与强化学习中的问题类似。当长期奖励(long-term rewards)有着很大的取值范围时,人们在采样轨迹(sampled trajectories)上使用随着时间衰减的奖励(译者注:随着时间的流逝,网络得到的奖励会越来越小)。
  
  受这一点的启发,作者提出了空间衰减重构损失。
  
  (译者注:随着像素点越靠近中心位置,权重越来越小,以此来减小中心区域的权值,使计算损失值时,不会因为中心结果和原始图像差距过大,从而误导训练过程)
  
  具体的做法是使用一个带有权值的mask M,在M上,每一点的权值由γl来计算,其中γ被设定为0.99,l是该点到最近的已知像素点的距离(1-范数,即城市街区距离)。
  
  近似的权重衰减方法在其他人的研究中也被提到了(例如Pathak等人的研究),在修复大面积缺失区域的时候,这种带衰减的损失值在提高修复质量上将更有效。
  
  通过上述提升的方法,作者的生成修复网络有着比Iizuka的网络更快的收敛速度,结果也更精确。此外也不需要图像的后续处理了。
  
  4. 使用内容感知进行图像修复 Image Inpainting with Contextual Attention
  
  卷积神经网络通过一层层的卷积核,很难从远处区域提取图像特征,为了克服这一限制。作者考虑了感知机制(attention mechanism)以及提出了内容感知层(contextual attention layer)。在这一部分,作者首先讨论内容感知层的细节,然后说明如何将它融入生成修复网络中。
  
  4.1 内容感知 Contextual Attention
  
  内容感知层学习的内容是,从已知图像的何处借鉴特征信息,以此来生成缺失的斑块。
  
  (译者注:这一部分译者在第一部分Introduction里就有简单的说明,如果没有概念的读者可以倒回去看一看)
  
  由于这个layer是可微的(differentiable),所以可以在深度模型和全卷积网络中进行训练,允许在任意分辨率的图像上进行测试。
  
  图3
  
  1) 匹配及选取 Match and attend
  
  作者想解决的问题是:在背景区域中匹配缺失区域的特征。
  
  作者首先在背景区域提取3x3的斑块,并作为卷积核。为了匹配前景(即待修复区域)斑块,使用标准化内积(余弦相似度)来测量,然后用softmax来为每个背景斑块计算权值,最后选取出一个最好的斑块,并反卷积出前景区域。对于反卷积过程中的重叠区域(overlapped pixels)取平均值。
  
  对于这个匹配出的背景斑块可视化:
  
  图4
  
  2) 感知传播 Attention propagation
  
  (译者注:这一部分译者不是很明白其原理,各位读者可参照原文)
  
  为了进一步保持图像的一致性,作者使用了感知传播。思想是对前景区域做偏移,可能对应和背景区域做相同的偏移,实现方式是使用单位矩阵作为卷积核,从而做到对图像的偏移。作者先做了左右传播,然后再做上下传播。从而得到新的感知分数(attention score)
  
  该方法有效的提高了修复的结果,以及在训练过程中提供了更丰富的梯度。
  
  3) 显存效率 Memory efficiency
  
  假设在128x128的图像中有个64x64的缺失区域作为输入,那么从背景区域提取出的卷积核个数是12288个(3x3大小)。这可能会超过GPU的显存限制。
  
  为了克服这一问题,作者介绍两种方法:1)在提取背景斑块时添加步长参数来减少提取的卷积核个数;2)在卷积前降低前景区域(缺失区域)的分辨率,然后在感知传播后提高感知图(attention map)的大小。
  
  4.2 合并修复网络 Unified Inpainting Network
  
  为了将感知模块集成到修复模型中,作者提出了两个平行的编码器(见图4).
  
  下面的那个编码器通过扩张卷积(dilated convolution)来“想象”缺失区域的内容。
  
  上面的那个编码器则专注于提取感兴趣的背景区域。
  
  两个编码器的输出被聚合输入到一个大哥哥中,反卷积生成出最后的图像。
  
  在图4中,作者使用了颜色来指出最感兴趣的背景区域的相关位置。比如说,白色区域(彩色图的中心)意味着该区域的像素依赖于自己、左下角的粉色、右上角的绿色。对于不同的图像,偏移值也会跟着缩放,以此来更好地标记出感兴趣的区域(interested background patch)。
  
  (译者注:这里用颜色图(color map)来可视化感知图(attention map)的概念译者不是很明白,读者可以参考原文)
  
  对于训练过程,可以用以下算法来表示:
  
  当G还没有收敛时:
  
  以下步骤循环5次:
  
  从训练集中提取图像x
  
  生成随机的mask m
  
  使用x和m生成带有缺失区域的图像z
  
  将z和m输入生成网络G中,获取修复后的缺失区域图像~x
  
  通过空间衰减重构损失的maskM,对~x做一个权值处理,然后覆盖原图像的这个区域,得到图像^x(这一步译者不确定)
  
  使用x、~x、^x计算全局、局部损失值(这一步译者不确定)
  
  循环结束
  
  从训练集中提取图像x
  
  生成随机的mask m
  
  计算空间衰减重构损失、全局和局部的WGAN-GP损失,来更新生成网络G的权值。
  
  结束循环。
  
  5. 实验 Experiments
  
  (译者注:这里实验可以直接参照参考资料中的余家辉官方的demo,译者后续会给出翻译)
  
  6. 总结 Conclusion
  
  作者提出了粗细网络图像生成修复的框架(coarse-to-fine generative image inpainting framework),并介绍了带有内容感知的模型。作者展示了内容感知模型在提高图像修复结果上,有着很大的意义(通过对背景特征的匹配、提取这一过程的学习)。在今后的研究中,作者基于GAN的不断发展,计划将该方法扩展到更高分辨率的图像修复应用中。图像修复框架和内容感知模块也可以用于带有条件的图像生成、图像编辑、计算摄影任务中(例如图像渲染、超高分辨率图像、指导编辑(guided editing),以及其他种种应用。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.www.huarenyl.cn support import expected_conditions as EC

driver = webdriver.Firefox(www.gcyl152.com/ )
driver.get("http://www.gcyl159.com somedomain/url_that_delays_loading")
try:
element = WebDriverWait(driver,www.furong157.com 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
# 注意:是传的一个元组!!!!
)
finally:
driver.quit(www.michenggw.com)
一些其他的等待条件:

presence_of_element_located:某个元素已经加载完毕了。
presence_of_all_emement_located:网页中所有满足条件的元素都加载完毕了。
element_to_be_cliable:某个元素是可以点击了。
更多条件请参考:http:// www.mhylpt.com selenium-python.readthedocs.io/waits.html

切换页面:
有时候窗口中有很多子tab页面。这时候肯定是需要进行切换的。selenium提供了一个叫做switch_to_window来进行切换,具体切换到哪个页面,可以从driver.window_handles中找到。

# 打开一个新的页面
self.driver.execute_script("window.open('"+url+"')")
# 切换到这个新的页面中
self.driver.switch_to_window(self.driver.window_handles[1])
设置代理ip:
有时候频繁爬取一些网页。服务器发现你是爬虫后会封掉你的ip地址。这时候我们可以更改代理ip。更改代理ip,不同的浏览器有不同的实现方式。这里以Chrome浏览器为例来讲解:

from selenium import webdriver

options = webdriver.ChromeOptions(www.mcyllpt.com)
options.add_argument("--proxy-server=http://110.73.2.248:8123")
driver_path = r"D:\ProgramApp\chromedriver\chromedriver.exe"
driver = webdriver.Chrome(executable_path=driver_path,chrome_options=options)

driver.get('http://httpbin.org/ip')
  
  其他
  
  D. 网络架构 Network Architectures
  
  这里是论文第三部分的附录,提供了网络的更多细节。
  
  以下的表示方法:K(卷积核大小,kernel size)、D(卷积核扩张量,dilation)、S(卷积步长,stride size)、C(通道数,channel number)。

转载于:https://my.oschina.net/u/3386278/blog/2907490

你可能感兴趣的:(CVPR2018: Generative Image Inpainting with Contextual Attention 论文翻译、解读)