深度学习与计算机视觉(12)_tensorflow实现基于深度学习的图像补全

原文地址:Image Completion with Deep Learning in TensorFlow by Brandon Amos
原文翻译与校对:@MOLLY && 寒小阳 ([email protected])
时间:2017年4月。
出处:http://blog.csdn.net/han_xiaoyang/article/details/70214565
声明:版权所有,转载请联系作者并注明出

  • 简介
  • 第一步:将图像理解为一个概率分布的样本
    • 你是怎样补全缺失信息的呢?
    • 但是怎样着手统计呢?这些都是图像啊。
    • 那么我们怎样补全图像?
  • 第二步:快速生成假图像
    • 在未知概率分布情况下,学习生成新样本
    • [ML-Heavy] 生成对抗网络(Generative Adversarial Net, GAN) 的架构
    • 使用G(z)生成伪图像
    • [ML-Heavy] 训练DCGAN
    • 现有的GAN和DCGAN实现
    • [ML-Heavy] 在Tensorflow上构建DCGANs
    • 在图片集上跑DCGAN
  • 第三步:找到用于图像补全最好的伪图像
    • 使用 DCGAN 进行图像补全
    • [ML-Heavy] 到 pgpg 的投影的损失函数
    • [ML-Heavy] 使用tensorflow来进行DCGAN图像补全
    • 补全图像
  • 结论

简介

内容识别填充(译注: Content-aware fill ,是 photoshop 的一个功能)是一个强大的工具,设计师和摄影师可以用它来填充图片中不想要的部分或者缺失的部分。在填充图片的缺失或损坏的部分时,图像补全和修复是两种密切相关的技术。有很多方法可以实现内容识别填充,图像补全和修复。在这篇博客中,我会介绍 Raymond Yeh 和 Chen Chen 等人的一篇论文,“基于感知和语境损失的图像语义修补(Semantic Image Inpainting with Perceptual and Contextual Losses)”。论文在2016年7月26号发布于 arXiv 上,介绍了如何使用 DCGAN 网络来进行图像补全。博文面向一般技术背景的读者,部分内容需要有机器学习的背景。我在相关章节标注了[ML-Heavy]标签,如果你不想了解太多细节,可以跳过这些章节。我们只会涉及到填充人脸图像缺失部分的情况。博文相关 Tensorflow 代码已经发布到 GitHub 上:bamos/dcgan-completion.tensorflow
图像补全分为三个步骤。

  • 首先我们将图像理解为一个概率分布的样本。
  • 基于这种理解,学习如何生成伪图片。
  • 然后我们找到最适合填充回去的伪图片。

使用photoshop来对图像缺失部分补全
使用photoshop来对图像缺失部分补全

使用photoshop自动删除不要的部分
使用photoshop自动删除不要的部分

图像补全
下文将要介绍到的图像补全。图像的中心是自动生成的。源码可以从此处下载。
这些图像是我从 LFW 数据集中取得的一个随机样本。

第一步:将图像理解为一个概率分布的样本

你是怎样补全缺失信息的呢?

在上面的例子中,想象你正在构造一个可以填充缺失部分的系统。你会怎么做呢?你觉得人类大脑是怎么做的呢?你使用了什么样的信息呢?
在博文中,我们会关注两种信息:
语境信息:你可以通过周围的像素来推测缺失像素的信息。
感知信息:你会用“正常”的部分来填充,比如你在现实生活中或其它图片上看到的样子。
两者都很重要。没有语境信息,你怎么知道填充哪一个进去?没有感知信息,通过同样的上下文可以生成无数种可能。有些机器学习系统看起来“正常”的图片,人类看起来可能不太正常。
如果有一种确切的、直观的算法,可以捕获前文图像补全步骤介绍中提到的两种属性,那就再好不过了。对于特定的情况,构造这样的算法是可行的。但是没有一般的方法。目前最好的解决方案是通过统计和机器学习来得到一个近似的技术。

但是怎样着手统计呢?这些都是图像啊。

为了激发大家的思考,我们从一个很好理解、可以写成简洁形式的概率分布开始:一个正态分布。这是正态分布的概率密度函数(PDF)。你可以将PDF理解成在输入空间横向移动,纵轴表示某个值出现的概率。(如果你感兴趣,绘制这幅图的代码可以从 bamos/dcgan-completion.tensorflow:simple-distributions.py 下载。)

正态分布的PDF

从这个分布中采样,就可以得到一些数据。需要搞清楚的是PDF和样本之间的联系。

从正态分布中的采样
从正态分布中的采样
2维图像的PDF和采样
2维图像的PDF和采样。 PDF 用等高线图表示,样本点画在上面。

这是1维分布,因为输入只能沿着一个维度。在两个维度上也可以这么做。
在图像和统计学之间,最关键的联系就是,我们可以将图像看作是从一个高维概率分布中得到的采样。概率分布对应的是图像的像素。想象你在用相机拍照。得到的图像是由有限个数的像素组成。当你通过相机拍照的时候,你就在从这个复杂的概率分布中进行采样。这个概率分布就决定了我们判断一张图片是正常的,还是不正常的。对于图片而言,与正态分布不同的是,我们无法得知真实的概率分布,我们只能去收集样本。
在这篇文章中,我们会使用彩色图像,它用 RGB颜色 表示。 我们的图像宽64像素, 高64像素, 所以我们的概率分布是 64⋅64⋅3≈12k 维的。

那么我们怎样补全图像?

首先考虑多变量正态分布, 以求得到一些启发。给定 x=1 , 那么 y 最可能的值是什么?我们可以固定x的值,然后找到使PDF最大的 y。
在多维概率分布中,给定x,得到最大可能的y
在多维正态分布中,给定x,得到最大可能的y

这个概念可以很自然地推广到图像概率分布。我们已知一些值,希望补全缺失值。这可以简单理解成一个最大化问题。我们搜索所有可能的缺失值,用于补全的图像就是可能性最大的值。
从正态分布的样本来看,只通过样本,我们就可以得出PDF。只需挑选你喜欢的 统计模型, 然后拟合数据即可。
然而,我们实际上并没有使用这种方法。对于简单分布来说,PDF很容易得出来。但是对于更复杂的图像分布来说,就十分困难,难以处理。之所以复杂,一部分原因是复杂的条件依赖:一个像素的值依赖于图像中其它像素的值。另外,最大化一个一般的PDF是一个非常困难和棘手的非凸优化问题。

第二步:快速生成假图像

在未知概率分布情况下,学习生成新样本

除了学习如何计算PDF之外,统计学中另一个成熟的想法是学习怎样用 生成模型 生成新的(随机)样本。生成模型一般很难训练和处理,但是后来深度学习社区在这个领域有了一个惊人的突破。Yann LeCun 在这篇 Quora 回答中对如何进行生成模型的训练进行了一番精彩的论述,并将它称为机器学习领域近10年来最有意思的想法。

Yann LeCun 对 生成对抗网络的介绍
Yann LeCun 对 生成对抗网络的介绍

街机类比
将生成对抗网络类比为街机游戏。两个网络相互对抗,共同进步。就像两个人类在游戏中对抗一样。

其它的深度学习方法,比如 Variational Autoencoders(VAEs),也可以用来训练生成模型。在这篇博文中,我们用的是生成对抗网络(Generative Adversarial Nets,GANs)。

[ML-Heavy] 生成对抗网络(Generative Adversarial Net, GAN) 的架构

这个想法是 Ian Goodfellow 等人在2014年Neural Information Processing Systems (NIPS) 研讨会上发表的里程碑式论文“生成对抗网络”(Generative Adversarial Nets,GANs)中提出的。主要思想是,我们定义一个简单、常用的分布,用 pz 表示。在下文中,我们使用 pz 来表示在-1到1闭区间上的均匀分布。我们将从分布中的一个采样记作 zpz 。若 pz 是五维的,我们可以通过一行python的 numpy 代码来进行采样:

z = np.random.uniform(-1, 1, 5)
array([ 0.77356483,  0.95258473, -0.18345086,  0.69224724, -0.34718733])

现在有了一个用于采样的简单分布,我们定义一个函数 G(z) 来从我们的原始概率分布中采样。

def G(z):
   ...
   return imageSample
z = np.random.uniform(-1, 1, 5)
imageSample = G(z)

那么我们怎样定义G(z),可以使它输入一个向量,输出一张图像?我们将使用深度神经网络。神经网络基础有很多教程,所以我不会在此介绍。推荐一些不错的参考,斯坦福CS231n课程,Ian Goodfellow 等人的 deep learning bookImage Kernels Explained Visually,以及 convolution arithmetic guide

构造一个基于深度学习的 G(z)有很多种方式。原始的 GAN 论文提出了一个想法, 一个训练过程,以及一个初步的实验结果。这个想法已经被极大地发扬了,其中一个想法在论文“基于深度卷积生成对抗网络的无监督表征学习(Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks)”中提出,作者是 Alec Radford, Luke Metz, 和 Soumith Chintala, 发表在 2016 International Conference on Learning Representations (ICLR, 读作 “eye-clear”)上。这篇论文提出了深度卷积GANS(叫做DCGANs),使用微步长卷积来对图像进行上采样。

那么什么是微步长卷积,以及它是怎样对图像进行上采样的呢? Vincent Dumoulin 和 Francesco Visin 的论文“深度学习卷积运算指南(A guide to convolution arithmetic for deep learning)”和卷积运算项目是对深度学习中的卷积运算的一个非常好的介绍。 图例非常棒,可以让我们对微步长卷积的工作方式有一个直观的理解。首先,确保你搞懂了一般卷积如何将内核滑过输入空间(蓝色),得到输出空间(绿色)。此处,输出比输入要小。(如果不理解,参阅 CS231n CNN sectionthe convolution arithmetic guide
卷积运算图示
卷积运算图示,蓝色是输入,绿色是输出。

接下来,假设你有一个3X3的输入。我们的目标是进行上采样(upsample),这样,得到一个更大的输出。你可以将微步长卷积理解为将输入图像放大,然后在像素间插入0。 然后在这个放大后的图像上进行卷积操作,得到一个较大的输出。此处,输出为5X5。
微步长卷积
微步长卷积运算图示,蓝色是输入,绿色是输出。

插一段边注:进行上采样的卷积层有很多名字: 全卷积( full convolution), 网内上采样(in-network upsampling), 微步长卷积(fractionally-strided convolution), 反向卷积(backwards convolution), 反卷积(deconvolution),上卷积(upconvolution), 或者转置卷积(transposed convolution)。非常不推荐使用术语“反卷积”, 因为这个术语已经有其他含义了: 在某种数学运算,以及计算机视觉的其它应用中,这个术语有完全不同的含义。

现在我们有了微步长卷积结构,可以得到G(z)的表达,以一个向量 zpz 作为输入,输出一张 64x64x3 的RGB图像。

使用 DCGAN 构造生成器的一种方法。
使用 DCGAN 构造生成器的一种方法。图像来自DCGAN论文

DCGAN 论文也提出了其他的在训练 DCGANs 时的技巧和调整,比如批量正则化(batch normalization)以及 leaky RELUs。

使用G(z)生成伪图像

让我们先停下来欣赏一下 G(z) 多么强大吧!DCGAN 论文给出了DCGAN在卧室数据集训练出来的样子。然后 G(z) 可以给出下面的伪图像,生成器认为的卧室是什么样子的。下面的图片都不在原始数据集里哦!

使用DCGAN生成卧室图像
另外,你也可以在输入空间z进行代数运算。下面是一个生成人脸的网络。

人脸运算
基于DCGAN的人脸代数运算 DCGAN论文 。

[ML-Heavy] 训练DCGAN

现在我们已经定义了G(z), 并见识了它多么强大。那么我们怎么训练它呢?我们有很多未知的变量(参数),需要找到它们。 此时,我们就要用到对抗网络了。
首先我们要定义一些符号。数据的概率分布(未知的)记作 pdata 。那么G(z),(其中 zpz )可以理解为从一个概率分布中的采样。让我们把这个概率分布记作 pg

概率分布

pzpdatapgz
  • 18
    点赞
  • 128
    收藏
    觉得还不错? 一键收藏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值