文章目录
Intelligent Photo Editing
问题提出
生成器的输入是一个低维向量 z z z,输出是一张图片。向量 z z z的每一维可能对应着图像的某个特征,改变 z z z的值就可以调整图像内容。那么:
-
对于一张已有的生成图像,如何得到它对应的向量 z z z?
-
又如何知道 z z z中的每个元素/维度对应着图像中哪个特征?
-
该维度是以怎样的具体值控制着该特征的表现呢?
![](https://i-blog.csdnimg.cn/blog_migrate/e70122c1368c5074b41ff4dabe0e986c.png)
其实我们之前也说过这个问题,我们是通过InfoGAN来解决这个问题的,强迫性的使 z z z中的某些维度和 x x x中的某些特征产生关系,详情可以看:
👉 机器学习-40-Feature Extraction(InfoGAN,VAE-GAN,BiGAN,Triple GAN,Feature Disentangle(Voice Conversion))
接下来我们介绍另外一种方法:GAN+Autoencoder
GAN+Autoencoder
![](https://i-blog.csdnimg.cn/blog_migrate/28de81daa9f90b61eef8e84cf8200ff4.png)
我们可以将既有的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可以找到生成某个图片的向量。
接下来把数据库中的图片整出来:
![](https://i-blog.csdnimg.cn/blog_migrate/0846da639e4d5e421934a90e17a39752.png)
丢到Encoder中,得到这些图片对应的向量(注意蓝色和绿色的点就是向量)
![](https://i-blog.csdnimg.cn/blog_migrate/4f42e0a9b7b5c9e5d07a8ec6fb8c4467.png)
对于左边的图片是长发,右边是短发,把两簇向量取平均后得到长短发的代表,然后相减:
![](https://i-blog.csdnimg.cn/blog_migrate/2916f72f0fabfaf901b2c270ba7c0bd2.png)
得到短发与长发的差异,也就是说短发向量加上上面的
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=N11x∈long∑En(x)−N−21x′∈/long∑En(x′)
其中En是Encoder,long代表长发。如果现在有一张短发的图片x,我们可以通过下面的步骤把其变成长发:
![](https://i-blog.csdnimg.cn/blog_migrate/da1956e9bb231241858bbd5841029253.png)
将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(实例展示)
具体实例(Photos Editing )
Basic Idea
![](https://i-blog.csdnimg.cn/blog_migrate/ec671502098bd12a0590c0ba798f90b2.png)
效果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/3dfb5d132411739b675435884bc6b9cf.gif)
👉 完整视频:Generative Visual Manipulation on the Natural Image Manifold
类似上图的编辑效果是如何做到的呢?假设有一组商品图片,想要在一定的条件/限制下生成与某个商品图类似的图片。如下图所示:在红色的限制下,从黑色的衣服生成样式基本不变的红色衣服图片。
![](https://i-blog.csdnimg.cn/blog_migrate/dbf5299335a30e00cc5d01168f5d794f.png)
首先利用训练好的生成器将所有图片映射到编码 z z z的空间,每一个图片就是该空间中的一个采样点,我们就在该空间内寻找想要的图像。将黑色衣服的图片输入生成器得到对应的编码 z z z,以较小的半径在该 z z z点周围采样(这个半径和具体采样的位置应该都和条件/限制有关),就应该得到符合限制的相近的红色衣服图像。至于为什么在编码空间内操作,应该是因为低维空间内更好采样吧,更容易找到需要的点(否则空间中只有极少极少的点是我们需要的)。
三种方法
![](https://i-blog.csdnimg.cn/blog_migrate/7c5f7aa354d06e6237f54ce4da5f90e5.png)
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
![](https://i-blog.csdnimg.cn/blog_migrate/e33c09655ad3f4ab5bdfd413350eb0ed.png)
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))+λ1∣∣z−z0∣∣2−λ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
λ1∣z−z0∣∣2要求编码
z
z
z不能偏离原图片过多,保证了内容的相似性;
λ
2
D
(
G
(
z
)
)
\lambda_2D(G(z))
λ2D(G(z))越大越好,保证生成的图片真实。
下面看一个例子
Editing Photos
可以找到图片对应的z之后,我们继续来看如何进行编辑,假设现在有一个图片(上左边),和一个用户编辑的约束(上右边):
![](https://i-blog.csdnimg.cn/blog_migrate/f5a29fa6fdb1d29df03015fac3563aa8.png)
图片对应的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))+λ1∣∣z−z0∣∣2−λ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 λ1∣∣z−z0∣∣2:是使得新生成的图片不能脱离原图片太远。
- λ 2 D ( G ( z ) ) \lambda_2D(G(z)) λ2D(G(z)):使得新生成的图片越真实越好。
其他应用
Image super resolution(高清图片处理)
将低清晰度的图片变成高清晰度,主要利用低清晰度和高清晰度的Pair利用Conditional GAN来训练。一般来说,大概都直接拿高清晰度来改成低清晰度资料。
![](https://i-blog.csdnimg.cn/blog_migrate/b33accc49796d4f92f1811bfe9cceb6e.png)
左一传统处理方法:不行,太模糊了
左二普通NN处理:效果可以,但是头饰,项圈细节还是模糊
左三GAN:效果可以,头饰,项圈细节清晰,但是这些细节和原图不一样,因为这些细节是GAN模型自己生成的,只要能骗过discriminator即可。
最后是原图
这个模型的数据比较好处理,就是找一堆高清图,处理模糊后就有数据了,因为图片清晰变模糊好弄。
Image Completion(图像补全)
这个模型的训练数据也好处理,随便找图片,然后挖空就有了。模型思想是:conditional GAN。其实方法和我们所说的Image super resolution差不多
👉 [Satoshi Iizuka - Globally and Locally Consistent Image Completion (tsukuba.ac.jp)]
![](https://i-blog.csdnimg.cn/blog_migrate/7ac2e97fb3749706cb0b719ece53566b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2ed6b0864d26ab0a0d5ef2f5f29062f2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7135c09184dd6a75daa1ef4445076f61.png)
下图是不同做法的效果比较,可以看到,最开始的时候,对图像进行补全是直接把空缺的部分补上,柱子其实还是挖掉的。我们现在模型可以直接将柱子给补上!
![](https://i-blog.csdnimg.cn/blog_migrate/912cd0933512a585db1399cca62fbd5f.png)