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

这是本文的最后一部分内容了,前两部分内容的文章:

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

以及原文的地址:

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

最后一部分的目录如下:

  • 第三步:为图像修复寻找最佳的假图片
    • 利用 DCGANs 实现图像修复
    • [ML-Heavy] 损失函数
    • [ML-Heavy] TensorFlow 实现 DCGANs 模型来实现图像修复
    • 修复你的图片

第三步:为图像修复寻找最佳的假图片

利用 DCGANs 实现图像修复

在第二步中,我们定义并训练了判别器D(x)和生成器G(z),那接下来就是如何利用DCGAN网络模型来完成图片的修复工作了。

在这部分,作者会参考论文"Semantic Image Inpainting with Perceptual and Contextual Losses" 提出的方法。

对于部分图片y,对于缺失的像素部分采用最大化D(y)这种看起来合理的做法并不成功,它会导致生成一些既不属于真实数据分布,也属于生成数据分布的像素值。如下图所示,我们需要一种合理的将y映射到生成数据分布上。

[ML-Heavy] 损失函数

首先我们先定义几个符号来用于图像修复。用M表示一个二值的掩码(Mask),即只有 0 或者是 1 的数值。其中 1 数值表示图片中要保留的部分,而 0 表示图片中需要修复的区域。定义好这个 Mask 后,接下来就是定义如何通过给定一个 Mask 来修复一张图片y,具体的方法就是让yM的像素对应相乘,这种两个矩阵对应像素的方法叫做哈大马乘积,并且表示为 M ⊙ y ,它们的乘积结果会得到图片中原始部分,如下图所示:

接下来,假设我们从生成器G的生成结果找到一张图片,如下图公式所示,第二项表示的是DCGAN生成的修复部分:

根据上述公式,我们知道最重要的就是第二项生成部分,也就是需要实现很好修复图片缺失区域的做法。为了实现这个目的,这就需要回顾在第一步提出的两个重要的信息,上下文和感知信息。而这两个信息的获取主要是通过损失函数来实现。损失函数越小,表示生成的G(z)越适合待修复的区域。

Contextual Loss

为了保证输入图片相同的上下文信息,需要让输入图片y(可以理解为标签)中已知的像素和对应在G(z)中的像素尽可能相似,因此需要对产生不相似像素的G(z)做出惩罚。该损失函数如下所示,采用的是 L1 正则化方法:

这里还可以选择采用 L2 正则化方法,但论文中通过实验证明了 L1 正则化的效果更好。

理想的情况是yG(z)的所有像素值都是相同的,也就是说它们是完全相同的图片,这也就让上述损失函数值为0

Perceptual Loss

为了让修复后的图片看起来非常逼真,我们需要让判别器D具备正确分辨出真实图片的能力。对应的损失函数如下所示:

因此,最终的损失函数如下所示:

这里 λ 是一个超参数,用于控制两个函数的各自重要性。

另外,论文还采用泊松混合(poisson blending) 方法来平滑重构后的图片。

[ML-Heavy] TensorFlow 实现 DCGANs 模型来实现图像修复

代码实现的项目地址如下:

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

首先需要新添加的变量是表示用于修复的 mask,如下所示,其大小和输入图片一样

self.mask = tf.placeholder(tf.float32, [None] + self.image_shape, name='mask')

对于最小化损失函数的方法是采用常用的梯度下降方法,而在 TensorFlow 中已经实现了自动微分的方法,因此只需要添加待实现的损失函数代码即可。添加的代码如下所示:

self.contextual_loss = tf.reduce_sum(tf.contrib.layers.flatten(tf.abs(tf.mul(self.mask, self.G) - tf.mul(self.mask, self.images))), 1)
self.perceptual_loss = self.g_loss
self.complete_loss = self.contextual_loss + self.lam*self.perceptual_loss
self.grad_complete_loss = tf.gradients(self.complete_loss, self.z)

接着,就是定义一个 mask。这里作者实现的是位置在图片中心部分的 mask,可以根据需求来添加需要的任意随机位置的 mask,实际上代码中实现了多种 mask

if config.maskType == 'center':scale = 0.25assert(scale <= 0.5)mask = np.ones(self.image_shape)l = int(self.image_size*scale)u = int(self.image_size*(1.0-scale))mask[l:u, l:u, :] = 0.0

因为采用梯度下降,所以采用一个 mini-batch 的带有动量的映射梯度下降方法,将z映射到[-1,1]的范围。代码如下:

for idx in xrange(0, batch_idxs):batch_images = ...batch_mask = np.resize(mask, [self.batch_size] + self.image_shape)zhats = np.random.uniform(-1, 1, size=(self.batch_size, self.z_dim))v = 0for i in xrange(config.nIter):fd = {self.z: zhats,self.mask: batch_mask,self.images: batch_images,}run = [self.complete_loss, self.grad_complete_loss, self.G]loss, g, G_imgs = self.sess.run(run, feed_dict=fd)# 映射梯度下降方法v_prev = np.copy(v)v = config.momentum*v - config.lr*g[0]zhats += -config.momentum * v_prev + (1+config.momentum)*vzhats = np.clip(zhats, -1, 1)

修复你的图片

选择需要进行修复的图片,并放在文件夹dcgan-completion.tensorflow/your-test-data/raw下面,然后根据之前第二步的做法来对人脸图片进行对齐操作,然后将操作后的图片放到文件夹dcgan-completion.tensorflow/your-test-data/aligned。作者随机从数据集LFW中挑选图片进行测试,并且保证其DCGAN模型的训练集没有包含LFW中的人脸图片。

接着可以运行下列命令来进行修复工作了:

./complete.py ./data/your-test-data/aligned/* --outDir outputImages

上面的代码会将修复图片结果保存在--outDir参数设置的输出文件夹下,接着可以采用ImageMagick工具来生成动图。这里因为动图太大,就只展示修复后的结果图片:

而原始的输入待修复图片如下:


小结

最后,再给出前两步的文章链接:

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

当然这个图片修复方法由于也是2016年提出的方法了,所以效果不算特别好,这两年其实已经新出了好多篇新的图片修复方法的论文,比如:

  1. 2016CVPR Context encoders: Feature learning by inpainting

  2. Deepfill 2018–Generative Image Inpainting with Contextual Attention

  3. Deepfillv2–Free-Form Image Inpainting with Gated Convolution

  4. 2017CVPR–High-resolution image inpainting using multi-scale neural patch synthesis

  5. 2018年的 NIPrus收录论文–Image Inpainting via Generative Multi-column Convolutional Neural Networks


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

我的个人博客:

http://ccc013.github.io/


往期精彩推荐

1.机器学习入门系列(1)–机器学习概览(上)

2.机器学习入门系列(2)–机器学习概览(下)

3.[GAN学习系列] 初识GAN

4.[GAN学习系列2] GAN的起源

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408818.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL Server 限制IP登陆

一、背景 在MySQL的mysql.User表保存了登陆用户的权限信息&#xff0c;Host和User字段则是关于登陆IP的限制。但是在SQL Server没有这样一个表&#xff0c;那SQL Server有什么办法可以实现类似的安全控制的功能呢&#xff1f; SQL Server 包括三种常规类型的触发器&#xff1a;…

[资源]基于 Pytorch 的 TorchGAN开源了!

之前推荐过一个基于 TensorFlow 的 GAN 框架–谷歌开源的 GAN 库–TFGAN。 而最近也有一个新的 GAN 框架工具&#xff0c;并且是基于 Pytorch 实现的&#xff0c;项目地址如下&#xff1a; https://github.com/torchgan/torchgan 对于习惯使用 Pytorch 框架的同学&#xff0…

c语言iso校验算法,模式识别c语言ISODATA算法.doc

模式识别c语言ISODATA算法.doc下载提示(请认真阅读)1.请仔细阅读文档&#xff0c;确保文档完整性&#xff0c;对于不预览、不比对内容而直接下载带来的问题本站不予受理。2.下载的文档&#xff0c;不会出现我们的网址水印。3、该文档所得收入(下载内容预览)归上传者、原创作者&…

2018 总结 2019 展望

今天是 2018 年的最后一天了&#xff0c;照例还是需要对今年做个总结的&#xff01;2018 总结1. 工作今年其实是分两个阶段&#xff0c;上半年还是研究生的最后半年&#xff0c;努力的赶完毕业论文&#xff0c;顺利通过了盲审和毕业答辩&#xff0c;也算是给自己的学业生涯画上…

程序员的数学笔记1--进制转换

最近在学习极客时间的课程–程序员的数学基础课。 课程地址&#xff1a;https://time.geekbang.org/column/intro/143 这是第一节课程的学习笔记–有关进制的转换。 二进制 什么是二进制 十进制计数是使用 10 作为基数&#xff0c;例如一个数字&#xff1a;2871&#xff0c…

android层级关系图,画出 View 的层级 3D 图和树形图来分析层级关系

HierarchyLayout 介绍HierarchyLayout是一个自定义的ViewGroup工具&#xff0c;用于分析视图的层级关系&#xff0c;并画出层级树的结构图和可交互的3D 层级View:HiearchyLayout的静态图&#xff0c;实际是可随手势改变 3D 形态的。hierarchyView.jpeghierarchyViewNode.jpeghi…

换个角度看GAN:另一种损失函数

转载自&#xff1a;机器之心选自Medium作者&#xff1a;Phc L机器之心编译参与&#xff1a;张玺「本质上&#xff0c;GAN 就是另一种。」Jeremy Howardf 老师曾在&#xff08;GAN&#xff09;课程中说过&#xff1a;「……本质上&#xff0c;GAN 就是另一种损失函数。」本文将在…

程序员的数学笔记2--余数

上一节程序员的数学笔记1–进制转换是介绍了进制&#xff0c;特别是十进制和二进制之间的转换&#xff0c;移位操作和逻辑操作。 今天介绍的是余数&#xff0c;看完本节笔记&#xff0c;你会发现生活中有很多东西都有余数的影子。 余数 余数的特性 整数是没有边界的&#xf…

机器学习入门系列(1)--机器学习概览

本文比较长&#xff0c;八千字&#xff0c;建议收藏起来慢慢看&#xff01;此外&#xff0c;这其实是合并公众号最开始写的两篇文章&#xff0c;整合在一起了。机器学习入门系列(1)--机器学习概览(上)机器学习入门系列(2)--机器学习概览(下)主要参考《hands-on-ml-with-sklearn…

[bbk5307]第76集 第9章 -数据库性能维护 03

/* Oracle optimizer 执行选择方式原理分析 */ select * from emp where empno7369; oracle在执行查询计划的时候&#xff0c;并不是说要执行一次全表扫描和一次索引扫描之后&#xff0c;来决定到底是走哪一条路?而是通过数据字典里的统计数据信息&#xff0c;来分析判断到底是…

[资源]推荐一些Python书籍和教程,入门和进阶的都有!

前几天后台有读者留言说希望推荐一些入门的书籍&#xff0c;所以这几天都在整理一些我入门时候学习过的书籍教程&#xff0c;或者是口碑还不错的书籍&#xff01;入门和进阶书籍教程入门和进阶方面的书籍教程&#xff0c;这里推荐两本书和一个教程。1. 廖雪峰老师的 Python 教程…

html 状态栏不显示文字,电脑打字的时候输入法不显示状态栏怎么办?

有时我们在打字的时候&#xff0c;输入法不显示&#xff0c;能打出汉字&#xff0c;但无法选字&#xff0c;这就给输入字体造成了很大的麻烦。怎么解决呢&#xff1f;下面以搜狗输入法为例&#xff0c;描述详细解决过程。解决方法一1、我在某个网页输入字体的时候&#xff0c;没…

系统在iis6上部署

1. 安装Framework 4.0 服务器安装Framework4.0版本。 2. 安装IIS 2.1 安装IIS6.0步骤 1) 在添加或删除程序,单击“添加/删除Windows组件”。 2) 勾选“应用程序服务器”&#xff0c;并单击“详细信息”。 3) 勾选“ASP.NET/IIS/启用网络COM访问/启用网络DTC访问”信…