在之前的两篇 GAN 系列文章–[GAN学习系列1]初识GAN以及[GAN学习系列2] GAN的起源中简单介绍了 GAN 的基本思想和原理,这次就介绍利用 GAN 来做一个图片修复的应用,主要采用的也是 GAN 在网络结构上的升级版–DCGAN,最初始的 GAN 采用的还是神经网络,即全连接网络,而 DCGAN 则是换成卷积神经网络(CNNs)了,这可以很好利用 CNN 强大的特征提取能力,更好的生成质量更好的图片。

原文是:

http://bamos.github.io/2016/08/09/deep-completion/

由于原文比较长,所以会分为 3 篇来介绍。


这篇文章的目录如下:

  • 介绍
  • 第一步:将图像解释为概率分布中的样本
    • 如何填充缺失的信息?
    • 对于图片在哪里适配这些统计数据?
    • 我们如何修复图片呢?
  • 第二步:快速生成假的图片
    • 从未知的概率分布中学习生成新的样本
    • [ML-Heavy] 建立 GAN 模型
    • 采用 G(z) 生成假的图片
    • [ML-Heavy] 训练 DCGAN
    • 目前的 GAN 和 DCGAN 实现
    • [ML-Heavy] TensorFlow 实现 DCGAN
    • 在你的数据集上运行 DCGAN 模型
  • 第三步:为图像修复寻找最佳的假图片
    • 利用 DCGANs 实现图像修复
    • [ML-Heavy] 损失函数
    • [ML-Heavy] TensorFlow 实现 DCGANs 模型来实现图像修复
    • 修复你的图片
  • 结论
  • 对本文/项目的引用
  • 供进一步阅读的部分参考书目
  • 一些未实现的对于 TensorFlow 和 Torch 的想法

本文会先讲述背景和第一步的工作内容。

介绍

设计师和摄像师习惯使用一个非常强有力的工具–内容感知填充,来修复图片中不需要或者缺失的部分。图像修复是指用于修复图像中缺失或者毁坏的部分区域。实现图像的修复有很多种方法。在本文中,介绍的是在 2016年7月26日发表在 arXiv 上的论文“Semantic Image Inpainting with Perceptual and Contextual Losses”,这篇论文介绍如何采用 DCGAN 来实现图像修复。这篇文章会即兼顾非机器学习背景和有机器学习背景的读者,带有 [ML-Heavy] 标签的标题内容表示可以跳过这部分细节内容。我们只考虑有限制的修复带有缺失像素的人脸图片的例子。TensorFlow 实现的源代码可以在下面的 Github 地址上查看:

https://github.com/bamos/dcgan-completion.tensorflow

我们将从以下三个步骤来完成图片修复工作:

  1. 首先将图像解释为概率分布中的样本
  2. 这样的解释步骤可以让我们学习如何生成假的图片
  3. 为修复图片寻找最佳的生成图片

下面是两张修复前和修复后的图片例子:

下面是本文将用到的带有缺失区域的人脸例子:

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

如何填充缺失的信息?

对于上述几张图片例子,假设你正在设计一个系列来填充这些缺失的区域,你会选择如何做?你认为人脑会怎么处理它呢?你需要使用哪些信息来实现这个修复工作呢?

本文会主要关注下面两种信息:

  1. 上下文信息(Contextual information):利用缺失像素区域周围像素提供的信息来填充
  2. 感知信息(Perceptual information):将填充的部分解释为“正常”,如同现实生活或者其他图片中看到的一样。

这两种信息都非常重要。没有上下文信息,你怎么知道填充什么信息呢?没有感知信息,对于一个上下文来说会有很多种有效的填充方式。比如一些对于机器学习系统来说看上去是“正常”的填充信息,但对于我们人类来说其实就是非常奇怪的填充内容。

因此,有一个即精确又直观的捕获这两种属性,并且可以解释说明如何一步步实现图像修复的算法是再好不过了。创造出这样的算法可能只会适用于特殊的例子,但通常都没有人知道如何创造这样的算法。现在最佳的做法是使用统计数据和机器学习方法来实现一种近似的技术。

对于图片在哪里适配这些统计数据?

为了解释这个问题,首先介绍一个非常好理解而且能简明表示的概率分布:正态分布。下面是一个正态分布的概率密度函数(probability density function, PDF)的图示。你可以这么理解 PDF,它是水平方向表示输入空间的数值,在垂直方向上表示默写数值发生的概率。

上面这张图的绘制代码如下:

# !/usr/bin/env python3import numpy as np
from scipy.stats import normimport matplotlib as mplmpl.use('Agg')
import matplotlib.pyplot as pltplt.style.use('bmh')
import matplotlib.mlab as mlabnp.random.seed(0)
### 绘制一个正态分布的概率密度函数图###
# 生成数据 X范围是(-3,3),步进为0.001, Y的范围是(0,1)
X = np.arange(-3, 3, 0.001)
Y = norm.pdf(X, 0, 1)
# 绘制
fig = plt.figure()
plt.plot(X, Y)
plt.tight_layout()
plt.savefig("./images/normal-pdf.png")

接着可以从上述分布中采样得到一些样本数据,如下图所示:

绘制代码如下:

### 绘制从正态分布采样的 1D 散点图例子 ###
nSamples = 35
# np.random.normal 是从正态分布中随机采样指定数量的样本,这里指定 35个
X = np.random.normal(0, 1, nSamples)
Y = np.zeros(nSamples)
fig = plt.figure(figsize=(7, 3))
# 绘制散点图
plt.scatter(X, Y, color='k')
plt.xlim((-3, 3))
frame = plt.gca()
frame.axes.get_yaxis().set_visible(False)
plt.savefig("./images/normal-samples.png")

这是 1 维概率分布的例子,因为输入数据就只是一维数据,我们也可以实现二维的例子,如下图所示:

绘制代码如下:

### 绘制从正态分布采样的 2D 散点图例子###delta = 0.025
# 设置 X,Y 的数值范围和步长值,分别生成 240个数
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-3.0, 3.0, delta)
print('x shape', x.shape)
# 根据坐标向量来生成坐标矩阵
X, Y = np.meshgrid(x, y)  # X, Y shape: (240, 240)print('X shape', X.shape)
print('Y shape', Y.shape)
# Bivariate Gaussian distribution for equal shape *X*, *Y*
# 等形状的双变量高斯分布
Z = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)  # Z shape (240, 240)
print('Z shape', Z.shape)plt.figure()
# 绘制环形图轮廓
CS = plt.contour(X, Y, Z)
plt.clabel(CS, inline=1, fontsize=10)nSamples = 200
mean = [0, 0]
cov = [[1, 0], [0, 1]]
# 从多元正态分布中采样,得到结果图中的黑点例子
X, Y = np.random.multivariate_normal(mean, cov, nSamples).T
plt.scatter(X, Y, color='k')plt.savefig("./images/normal-2d.png")

绘制上述三张图的完整代码如下所示,代码地址为:

https://github.com/bamos/dcgan-completion.tensorflow/blob/master/simple-distributions.py

图片和统计学之间的关键关系就是我们可以将图片解释为高维概率分布的样本。概率分布就体现在图片的像素上。假设你正采用你的相机进行拍照,照片的像素数量是有限的,当你用相机拍下一张照片的时候,就相当于从这个复杂的概率分布中进行采样的操作。而这个分布也是我们用来定义一张图片是否正常。和正态分布不同的是,只有图片,我们是不知道真实的概率分布,只是在收集样本而已。

在本文中,我们采用 RGB 颜色模型表示的彩色图片。我们采用的是宽和高都是 64 像素的图片,所以概率分布的维度应该是 64×64×3≈12k。

我们如何修复图片呢?

首先为了更加直观,我们先考虑之前介绍的多元正态分布。给定x=1时,y最有可能的取值是什么呢?这可以通过固定x=1,然后最大化 PDF 的值来找到所有可能的y的取值。如下图所示:

上图中垂直的黑色直线经过的黑点就是符合要求的y值。

这个概念可以延伸到我们的图像概率分布中,当我们知道某些数值,然后想填补完成缺失的数值的时候。只需要将它当做寻找所有可能缺失数值的最大问题,那么找到的结果就是最有可能的图片。

从视觉上观察由正态分布采样得到的样本,仅凭它们就找到概率密度函数是一件似乎很合理的事情。我们只需要选择最喜欢的统计模型并将其与数据相适应即可。

然而,我们并不会应用这个方法。虽然从简单分布中恢复概率密度函数是很简单,但这对于图像的复杂分布是非常困难和棘手的事情。其复杂性一定程度上是来自于复杂的条件独立性:图像中的每个像素值之间都是相互依赖的。因此,最大化一个通用的概率密度函数是一个极其困难而且往往难以解决的非凸优化问题。


小结

第一篇主要介绍了图像修复的简单背景,然后就是开始实现的第一步,也是比较偏理论,将我们待处理的图片数据作为一个概率分布的样本,并简单用代码实现了一维和二维的正态分布函数图。

在下一篇将介绍第二步内容,也就是快速生成假数据的工作。

欢迎关注我的微信公众号–机器学习与计算机视觉,或者扫描下方的二维码,在后台留言,和我分享你的建议和看法,指正文章中可能存在的错误,大家一起交流,学习和进步!

[GAN学习系列3]采用深度学习和 TensorFlow 实现图片修复(上)相关推荐

  1. [GAN学习系列3]采用深度学习和 TensorFlow 实现图片修复(下)

    这是本文的最后一部分内容了,前两部分内容的文章: [GAN学习系列3]采用深度学习和 TensorFlow 实现图片修复(上) [GAN学习系列3]采用深度学习和 TensorFlow 实现图片修复( ...

  2. [GAN学习系列3]采用深度学习和 TensorFlow 实现图片修复(中)

    上一篇文章–[GAN学习系列3]采用深度学习和 TensorFlow 实现图片修复(上)中,我们先介绍了对于图像修复的背景,需要利用什么信息来对缺失的区域进行修复,以及将图像当做概率分布采样的样本来看 ...

  3. 【深度学习系列4】深度学习及并行化实现概述

    转自 http://djt.qq.com/article/view/1245 摘要: 深度学习可以完成需要高度抽象特征的人工智能任务,如语音识别.图像识别和检索.自然语言理解等.深层模型是包含多个隐藏 ...

  4. DL之随机性:理解和探究采用深度学习算法预测时导致多次运行结果不一致的问题

    DL之随机性:理解和探究采用深度学习算法预测时导致多次运行结果不一致的问题 目录 理解和探究采用深度学习算法预测时导致每次运行结果不一致的问题

  5. 基于keras的深度学习基本概念讲解——深度学习之从小白到入门

    2019独角兽企业重金招聘Python工程师标准>>> Author: shikanon CreateTime: 2017-02-13 10:33:34 Tensorflow1.0正 ...

  6. 深度学习框架zf_谈谈深度学习框架的数据排布

    最近同事碰到了一个不同框架模型互相转换的问题:pytorch模型或caffe模型要转到tensorflow和TFLite上进行移动端的部署.模型从pytorch或caffe转tensorflow通过O ...

  7. 学习笔记之——基于深度学习的图像超分辨率重建

    最近开展图像超分辨率( Image Super Resolution)方面的研究,做了一些列的调研,并结合本人的理解总结成本博文~(本博文仅用于本人的学习笔记,不做商业用途) 本博文涉及的paper已 ...

  8. 深度学习-从历史认识深度学习

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/liyoushui01/article/ ...

  9. 机器学习、监督学习、非监督学习、强化学习传统机器学习、深度学习、迁移学习基本概念

    文章目录 机器学习(machine learning) 监督学习(supervised learning) 非监督学习(unsupervised learning) 强化学习(reinforcemen ...

最新文章

  1. 驳“中国的网页设计为什么这么烂?”
  2. SAP MM 启用批次管理的物料MB21创建预留单据时批次号可以为空!
  3. python ffmpeg4 保存h264
  4. .NET开发中的连接字串
  5. python搞笑代码-python有趣代码
  6. Web安全实践(2)基于http的web架构剖析
  7. python爬虫php_PHP爬虫编写
  8. HashMap为什么在多线程下会让cpu100%
  9. 二手房买卖砍价最新攻略 帮你花少钱买好房
  10. win10 利用安装包 安装 ssh
  11. 数据复制技术(三)---实践操作全过程图文并貌
  12. 一篇关于实体链接的小综述
  13. 生信技能树 电脑配置linux,生信技能树----Linux练习题答案
  14. 量子力学 量子计算机,量子力学和量子计算机
  15. java:文本框的简单使用
  16. 国资委79号文解读:国央企OA办公系统信创替代落地实践与标杆案例
  17. SQLServer的sql_variant数据类型
  18. linux中卸载rpm包,linux卸载rpm包
  19. Rancher docker集群
  20. mtk 按键中断驱动

热门文章

  1. w550官方例程_急!求索爱w550的刷机所需要的所有文件! 全部分送上!
  2. android限制输入字符的范围,Android EditText 对输入字数和内容范围进行限制
  3. 擎天出口退税软件_新版申报系统退税申报注意事项
  4. supervisor 守护多个进程_进程管理工具之Supervisor
  5. android wp主题,WP桌面:win10系统的最佳替代安卓应用
  6. datatables 搜索框 placeholder 属性
  7. 本地搭建wp,更新升级时需要ftp的解决办法
  8. React Router路由详解
  9. Spring Boot SLF4J日志实例
  10. GVim中以十六进制方式打开文件