|
文/Hungryof https://blog.csdn.net/Hungryof/article/details/73752993
总说
一般情况下,我们只有两幅图片,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在图像属性上是近似的。(比如颜色,纹理)。
作者们认为直接学到从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)
算法具体步骤
输入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)
其中N(p)N(p)是pp点为中心的小patch。当L=5,4,3L=5,4,3时,取3x3; L=2,1L=2,1时取5x5。F¯¯¯¯L(x)=FL(x)|FL(x)|F¯L(x)=FL(x)|FL(x)|。
当得到ϕLa→bϕa→bL时,我们要构建L−1L−1层的FL−1A′FA′L−1。
FL−1A′=FL−1A∘WL−1A+RL−1B′∘(1−WL−1A)
其中RL−1B′是FLB′经过变换得到的。刚才已经说了,我们利用LL层得到的ϕLa→b, 将其上采样,得到ϕ′La→b, 再作用于FLB′,得到FLB′(ϕ′La→b),作为RL−1B′。这样得到的RL−1B′与FL−1A是不对齐的。这是因为ϕLa→b与ϕL−1a→b之间有pooling,因此它们之间并不是简单的上采用就可以得到(而且L-1层与L层之间是经过卷积等其他操作的)。这就陷入一个难题:我们要得到FL−1A′, 不仅需要FLA′, 还需要FLB′的细节指导。前者是预先计算得到的,后者是与其不对齐的。所以要重建。我们虽然可以用ϕLa→b的映射,但是这毕竟不是ϕL−1a→b,而且 ϕL−1a→b不能由ϕLa→b简单上采样得到。
最终重建A′A′的唯一障碍就是:怎样利用ϕLa→b以及FLB′得到与FL−1A′对齐的RL−1B′?
反过来思考,如果我们已经得到了RL−1B′,它应该有什么特点。它应该经过L−1层到L层之间的计算后,得到的应该就是FLB′(ϕLa→b)。
定义CNNLL−1(⋅)是L−1层到L层之间的子网络。那么CNNLL−1(RL−1B′)显然是要与FLB′(ϕLa→b)尽量接近。因此利用这一点可以得到:
LRL−1B′=∥CNNLL−1(RL−1B′)−FLB′(ϕLa→b)∥2
从而近似求出FLB′(ϕLa→b).
重建A’(或B)
上面唯一的问题就在于WL−1A的得到了,其实就是手动选的。显然WL−1A越大则说明我们希望FL−1A′利用更多的FLA的内容结构,利用更少的FLB′的细节特征。
具体选择方法是:
WL−1A=αL−1ML−1A
其中ML−1AMAL−1就是FL−1AFAL−1归一化之后,再经过一个sigmoid函数,从而得到。
ML−1A(x)=11+exp(−κ×(|FL−1A(x)|2−τ))
其中κ=300,τ=0.05。
因此A′(或B)的重建就是三个过程:将当前层的特征warp上当前层的映射,然后反卷积得到上一层的特征,然后融合。如下图所示:
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′的重建。
从上图可以看到,如果是layer independent的话,重建出来的图会乱掉。
算法伪代码
我们可以通过一层一层往下计算,得到ϕ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
效果展示
效果比Deep photo style transfer还好,不错。
并且这种素描与真实图的转换,效果也不错。
参考论文:Visual Attribute Transfer through Deep Image Analogy
|
|