机器学习-41-GAN-08-Intelligent Photo Editing(智能修图,GAN+Autoencoder)

Intelligent Photo Editing

问题提出

生成器的输入是一个低维向量 z z z,输出是一张图片。向量 z z z的每一维可能对应着图像的某个特征,改变 z z z的值就可以调整图像内容。那么:

  1. 对于一张已有的生成图像,如何得到它对应的向量 z z z

  2. 又如何知道 z z z中的每个元素/维度对应着图像中哪个特征?

  3. 该维度是以怎样的具体值控制着该特征的表现呢?

其实我们之前也说过这个问题,我们是通过InfoGAN来解决这个问题的,强迫性的使 z z z中的某些维度和 x x x中的某些特征产生关系,详情可以看:

👉 机器学习-40-Feature Extraction(InfoGAN,VAE-GAN,BiGAN,Triple GAN,Feature Disentangle(Voice Conversion))

接下来我们介绍另外一种方法:GAN+Autoencoder

GAN+Autoencoder

我们可以将既有的Generator作为Decoder,从图片x中可以得到相应的特征标记,例如:头发颜色,头发浓密,胡子,性别,皮肤颜色、笑的表情等,如果我们能知道是什么样的z生成的x,就可以把x中的某些维度和图片的特征联系起来。

要知道z,就是要训练一个Encoder ,输入一张图片x,得到z,z经过上图中的Generator后可以还原回图片x。

训练Encoder的时候,由于是要反推z,所以这里Generator中的参数是固定不变的。由于Encoder在上图中和Discriminator的功能相似,所以在实际计算的时候,可以用Discriminator来对Encoder进行初始化

Attribute Representation

完成上面的工作,我们就训练好了一个Encoder,这个Encoder可以把图片还原为一个向量。也就是用这个Encoder可以找到生成某个图片的向量。

接下来把数据库中的图片整出来:

丢到Encoder中,得到这些图片对应的向量(注意蓝色和绿色的点就是向量)

对于左边的图片是长发,右边是短发,把两簇向量取平均后得到长短发的代表,然后相减:

得到短发与长发的差异,也就是说短发向量加上上面的 z l o n g z_{long} zlong就变成长发。用数学公式描述这一过程为:
z l o n g = 1 N 1 ∑ x ∈ l o n g E n ( x ) − 1 N − 2 ∑ x ′ ∉ l o n g E n ( x ′ ) z_{long} = \frac{1}{N_1}\sum_{x∈long}En(x)-\frac{1}{N-2}\sum_{x'∉long}En(x') zlong=N11xlongEn(x)N21x/longEn(x)
其中En是Encoder,long代表长发。如果现在有一张短发的图片x,我们可以通过下面的步骤把其变成长发:

将x丢到Encoder中得到x对应的向量z,加上 z l o n g z_{long} zlong 后变成 z ′ z' z ,经过Generator,就可以得到对应的长发图片。也就是说通过缩放 z l o n g z_{long} zlong就可以控制头发的长短了这其实就是一个可以依据要求从 z z z改变图像的方法。

Photo Editing(实例展示)

👉 完整视频:CelebA GAN set attributes


具体实例(Photos Editing )

👉 Jun-Yan Zhu, Philipp Krähenbühl, Eli Shechtman and Alexei A. Efros. “Generative Visual Manipulation on the Natural Image Manifold”, ECCV, 2016.

👉 Andrew Brock, Theodore Lim, J.M. Ritchie, Nick Weston, Neural Photo Editing with Introspective Adversarial Networks, arXiv preprint, 2017

Basic Idea

效果如下:

👉 完整视频:Generative Visual Manipulation on the Natural Image Manifold

类似上图的编辑效果是如何做到的呢?假设有一组商品图片,想要在一定的条件/限制下生成与某个商品图类似的图片。如下图所示:在红色的限制下,从黑色的衣服生成样式基本不变的红色衣服图片。

首先利用训练好的生成器将所有图片映射到编码 z z z的空间,每一个图片就是该空间中的一个采样点,我们就在该空间内寻找想要的图像。将黑色衣服的图片输入生成器得到对应的编码 z z z,以较小的半径在该 z z z点周围采样(这个半径和具体采样的位置应该都和条件/限制有关),就应该得到符合限制的相近的红色衣服图像。至于为什么在编码空间内操作,应该是因为低维空间内更好采样吧,更容易找到需要的点(否则空间中只有极少极少的点是我们需要的)。


三种方法
Method 1

把寻找code的过程看做最优化的过程:
z ∗ = a r g min ⁡ z L ( G ( z ) , x T ) z^* = arg\min\limits_zL(G(z),x^T) z=argzminL(G(z),xT)
要找z,通过G(z)后得到一个图片,我们希望这个图片和 x T x^T xT越接近越好,衡量接近(二者差距)程度用函数L表示。常见的衡量方法有:

  • Pixel-wise:逐像素比较
  • By another network:用一个NN来进行转化后比较。(把图片都丢到一个类似Encoder的网络可以得到向量表示。)
    然后用梯度下降求解这个最优化方程。
Method 2

就是用我们上面提到的方法,训练一个Encoder来找z

Method 3

将第一种和第二种方法相结合。

上面的方法一由于使用了Gradient Descent的方法优化,可能会出现陷入局部最小值的问题(该现象受 z z z初始值的影响),因此可以先利用这种GAN+Autoencoder的方法得到一个 z z z的初始值(用现有图片和生成器训练编码器,然后把该图片输入编码器就会得到对应的 z z z),然后再用方法一。此时要解的一个优化式子为:
z ∗ = a r g min ⁡ z U ( G ( z ) ) + λ 1 ∣ ∣ z − z 0 ∣ ∣ 2 − λ 2 D ( G ( z ) ) z^* = arg\min\limits_zU(G(z))+\lambda_1||z-z_0||^2-\lambda_2D(G(z)) z=argzminU(G(z))+λ1zz02λ2D(G(z))
找到 z z z要令 U ( G ( z ) ) U(G(z)) U(G(z))最小, U U U是判别函数,判断 G ( z ) G(z) G(z)是否符合限制条件; λ 1 ∣ z − z 0 ∣ ∣ 2 \lambda_1|z - z_0||^2 λ1zz02要求编码 z z z不能偏离原图片过多,保证了内容的相似性; λ 2 D ( G ( z ) ) \lambda_2D(G(z)) λ2D(G(z))越大越好,保证生成的图片真实。

下面看一个例子

Editing Photos

可以找到图片对应的z之后,我们继续来看如何进行编辑,假设现在有一个图片(上左边),和一个用户编辑的约束(上右边):

图片对应的code是 z 0 z_0 z0,那么最后要满足下面的式子:

z ∗ = a r g min ⁡ z U ( G ( z ) ) + λ 1 ∣ ∣ z − z 0 ∣ ∣ 2 − λ 2 D ( G ( z ) ) z^* = arg\min\limits_zU(G(z))+\lambda_1||z-z_0||^2-\lambda_2D(G(z)) z=argzminU(G(z))+λ1zz02λ2D(G(z))

  • a r g min ⁡ z U ( G ( z ) ) arg\min\limits_zU(G(z)) argzminU(G(z)):U代表用户做的编辑约束,这里要使得图片尽量的满足用户的编辑约束,例如用户用的红色点了一下,生成的新图片就是要红色基调,这里如何定义一个图片满足某个约束的函数由我们自己来弄。
  • λ 1 ∣ ∣ z − z 0 ∣ ∣ 2 \lambda_1||z-z_0||^2 λ1zz02:是使得新生成的图片不能脱离原图片太远。
  • λ 2 D ( G ( z ) ) \lambda_2D(G(z)) λ2D(G(z)):使得新生成的图片越真实越好。

其他应用

Image super resolution(高清图片处理)

将低清晰度的图片变成高清晰度,主要利用低清晰度和高清晰度的Pair利用Conditional GAN来训练。一般来说,大概都直接拿高清晰度来改成低清晰度资料。

👉 Christian Ledig, Lucas Theis, Ferenc Huszar, Jose Caballero, Andrew Cunningham, Alejandro Acosta, Andrew Aitken, Alykhan Tejani, Johannes Totz, Zehan Wang, Wenzhe Shi, “Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network”, CVPR, 2016

左一传统处理方法:不行,太模糊了

左二普通NN处理:效果可以,但是头饰,项圈细节还是模糊

左三GAN:效果可以,头饰,项圈细节清晰,但是这些细节和原图不一样,因为这些细节是GAN模型自己生成的,只要能骗过discriminator即可。

最后是原图

这个模型的数据比较好处理,就是找一堆高清图,处理模糊后就有数据了,因为图片清晰变模糊好弄。


Image Completion(图像补全)

这个模型的训练数据也好处理,随便找图片,然后挖空就有了。模型思想是:conditional GAN。其实方法和我们所说的Image super resolution差不多

👉 [Satoshi Iizuka - Globally and Locally Consistent Image Completion (tsukuba.ac.jp)]

下图是不同做法的效果比较,可以看到,最开始的时候,对图像进行补全是直接把空缺的部分补上,柱子其实还是挖掉的。我们现在模型可以直接将柱子给补上!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值