文/Hungryof https://blog.csdn.net/Hungryof/article/details/73752993

总说

110054jhazk3gxg6aav6xk.png
一般情况下,我们只有两幅图片,A和B′。如果以A为主体,我们希望得到的图像在内容上与A相似,但是一些图像属性(比如颜色,纹理等)与B′相似,我们记这样的图为A′,同理我们也可以定义B′。

与以前风格转换的异同:

以前style transfer的风格是全局的,指的是一种”画风“,这种转换与局部内容关系不大,比如古代山水画的画风或是抽象派的画风等等,是图像全局的风格的表达”。 如果是图像属性之间的转换, 是pixel级别的风格。
比如上图A′具有A的轮廓,相应位置的内容几乎是一样的。但是整幅图像的属性(比如颜色,纹理)都变成了B′的,即变成了暗以及脸部的纹理也抹去了很多。

基本想法

A:A′::B:B′

其中A′和B是未知的。这样的表示有以下两个约束:

1. A和A′是完全对齐的,同理B和B′也是。
2. A和BB在图像属性上是近似的。(比如颜色,纹理)。


110056d8oe89exee2dydev.png
作者们认为直接学到从A到B′的映射是困难的(红色)。这是因为A和B′具有视觉效果的差异性,在像素上存在misalignment。如果把这种映射分解为
1. A→A′的相同位置的映射。(这个是对齐的,spatial位置上,这是后面为什么可以用A重建出A′的内容的原因)
2. 到以及A′→B′的风格映射。(这个存在着misalignment,所以使用NNF搜索)

现在定义两个映射。Φa→b如果表示A→B′的映射,即其将A的一个p位置的点映射到B′的p′位置上。那么由于A→A′本身是相同位置点的映射(完全对齐的),B和B′也是对齐映射。所以Φa→b的映射可以认为是A或者A′到B或者B′的映射。同理可以定义Φb→a。

A(p)=B(Φa→b(p))andA′(p)=B′(Φa→b(p))(1)

上面前半部分的意思是,对于A图的p点,如果该点映射到B图的p′点,其中p′=Φa→b(p)。那么这两个点应该是相同的。当然为了加强一下对称性约束,可以加上双向约束:Φb→a(Φa→b(p))=p Φa→b(Φb→a(p))=p

构建A′和B

由于A和B′我们是有的,如果我有也有A′和B, 那么我们就可以得到映射Φa→b和Φb→a。理想的A′是即具有A的内容结构,又具有B′的细节。 现在想,如果A′和A是对齐的,只有细节不同(局部纹理,颜色等),那么A和A′在CNN的高层上的特征是及其相似的。所以在最高层特征,直接假设A和A′相等,然后在CNN的浅层逐步恢复A′,恢复的方法是取当前层的A的特征与B′的特征进行融合,同理可以构建当前层的B。通过一层一层往前构建,最终得到输入层的A′和B。

Deep PatchMatch

输入A和B′, 那么我们可以得到ll层的A和B′的特征,这是预先计算的。 给定latent images A′和B (加上输入的两幅,所有的4幅图像已经有了),我们可以定义映射Φa→b和Φb→a就是一次NNF(Nearest-neighbor Field)搜索。上面已经讲到,在网络的最高层,我们可以直接认为A和A′, B′和B相同。现在考虑:

如果我们已经有了第L层的4幅图的特征。对于L−1L−1层的A′特征,我们想法是将L层的A的特征与L层的B′的特征进行融合的。由于A和A′A′形状是基本一样的(只是细节不同),所以我们可以将第L层的A的特征乘以某个权值,作为第L−1L−1层的A′特征的一部分,那么B′的特征也要在构建A′起作用,毕竟B′是给A′提供细节的。前面说到,B′和A′不是对齐的!所以我们需要对B′进行一个映射,使得映射后的特征与A′对齐,这样就可以融合了。

那么这个对B′的映射是什么呢?就是L层已经计算出来的Φa→b, 见公式(1)

算法具体步骤

110057ap7e4pt8647stsqt.png
输入A′B′,可以预先计算得到每一层的FlA以及FlB′。然后我们假设第5层(最高层)的F5A′=F5A,F5B=F5B′。那么我们首先可以NNF搜索计算第5层的ϕ5a→b以及ϕ5b→a。然后再根据ϕ5a→b对F5B′进行修改(使之在空间位置上与A的特征相匹配)得到FLB′(ϕ5a→b),但是值得注意的是,网络用的是VGG。一般取层,层与层之间是经过pooling的。所以我们得到的FLB′(ϕ5a→b)是F4A的一半大小,如上图所示。如果我们直接将上采样ϕ5a→b,使之放大两倍得到ϕ′5a→b,再 FLB′(ϕ′5a→b)FB′L(ϕa→b′5),其实是会出现问题的。在下面会更仔细讲解。

预处理

采用的是VGG的每一个“block”的第一层的卷积层后面的Relu层。就是reluL1,即relu1_1, relu2_1,….relu5_1。neural style中也是默认采用这5层作为style层。上面已经讲了预处理怎么做了。

Nearest-neighbor Field Search

对于第L层,定义:
ϕLa→b(p)=argminq∑x∈N(p),y∈N(q)(∥F¯¯¯¯LA(x)−F¯¯¯¯LB(y)∥2+∥F¯¯¯¯LA′(x)−F¯¯¯¯LB′(y)∥2)

110058k1tny9fnztwjhey8.png
Nearest-neighbor Field Upsampling

前面已经说了直接从ϕLa→b上采样得到的映射ϕ′L−1a→b无法作为ϕL−1a→b,但是可以作为ϕL−1a→b的初始化值。ϕL−1a→b必须是由L−1层的4幅图的特征通过NNF搜索精调整得到的。在第L−1层的NNF搜索,只在ϕ′L−1a→b映射关系的p点周围一定的范围内进行随机搜索,从而微调ϕ′L−1a→b,得到ϕL−1a→b。对于{4,3,2,1}层,搜索范围半径分别是{6,6,4,4}。由于整个过程是corase-to-fine的一个过程,因此后一层的这种映射对于前一层的映射是有一定指导作用的。如果随机初始化不利用后一层的指导信息,那么无法得到好的A′的重建。

110100wmx8mtnux6xbuz6p.png
从上图可以看到,如果是layer independent的话,重建出来的图会乱掉。

算法伪代码

110103hgoz7baabgbgggzr.png
我们可以通过一层一层往下计算,得到ϕ1a→b,然后直接将ϕ1a→b作为Φa→b(伪代码第倒数第三行)。这是因为ϕ1a→b与输入层之间是没有pooling之类的。spatial size是一样的。当得到Φa→b之后,就可以重建A′。A′(p)=1n∑x∈N(p)(B′(Φa→b(x)),其中n=5。同理可以重建出B

效果展示

110106nr9s9nlbz9blglip.png
效果比Deep photo style transfer还好,不错。

110108d6mrar9j8dryjddy.png
并且这种素描与真实图的转换,效果也不错。

110110uisr44ts165djk4j.png
110114gbxbn8n86k9q88xn.png
参考论文:Visual Attribute Transfer through Deep Image Analogy




锐亚教育

锐亚教育,游戏开发论坛|游戏制作人|游戏策划|游戏开发|独立游戏|游戏产业|游戏研发|游戏运营| unity|unity3d|unity3d官网|unity3d 教程|金融帝国3|8k8k8k|mcafee8.5i|游戏蛮牛|蛮牛 unity|蛮牛