总说

精致的像素级别的风格转换 ----- Deep Image Analogy
一般情况下,我们只有两幅图片,AB。如果以A为主体,我们希望得到的图像在内容上与A相似,但是一些图像属性(比如颜色,纹理等)与B相似,我们记这样的图为A,同理我们也可以定义B

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

基本想法

A:A::B:B

其中AB是未知的。这样的表示有以下两个约束:
1. AA是完全对齐的,同理BB也是。
2. AB在图像属性上是近似的。(比如颜色,纹理)。
精致的像素级别的风格转换 ----- Deep Image Analogy

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

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

A(p)=B(Φab(p))andA(p)=B(Φab(p))1

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

构建AB

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

Deep PatchMatch

输入AB, 那么我们可以得到l层的AB的特征,这是预先计算的。 给定latent images AB (加上输入的两幅,所有的4幅图像已经有了),我们可以定义映射ΦabΦba就是一次NNF(Nearest-neighbor Field)搜索。上面已经讲到,在网络的最高层,我们可以直接认为AA, BB相同。现在考虑:
如果我们已经有了第L层的4幅图的特征。对于L1层的A特征,我们想法是将L层的A的特征与L层的B的特征进行融合的。由于AA形状是基本一样的(只是细节不同),所以我们可以将第L层的A的特征乘以某个权值,作为第L1层的A特征的一部分,那么B的特征也要在构建A起作用,毕竟B是给A提供细节的。前面说到,BA不是对齐的!所以我们需要对B进行一个映射,使得映射后的特征与A对齐,这样就可以融合了。
那么这个对B的映射是什么呢?就是L层已经计算出来的Φab, 见公式(1)

算法具体步骤

精致的像素级别的风格转换 ----- Deep Image Analogy
输入AB,可以预先计算得到每一层的FlA以及FlB。然后我们假设第5层(最高层)的F5A=F5AF5B=F5B。那么我们首先可以NNF搜索计算第5层的ϕ5ab以及ϕ5ba。然后再根据ϕ5abF5B进行修改(使之在空间位置上与A的特征相匹配)得到FLB(ϕ5ab),但是值得注意的是,网络用的是VGG。一般取层,层与层之间是经过pooling的。所以我们得到的FLB(ϕ5ab)F4A的一半大小,如上图所示。如果我们直接将上采样ϕ5ab,使之放大两倍得到ϕ5ab,再 FLBϕ5ab),其实是会出现问题的。在下面会更仔细讲解。

预处理

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

Nearest-neighbor Field Search

对于第L层,定义:

ϕLab(p)=argminqxN(p),yN(q)(F¯¯¯LA(x)F¯¯¯LB(y)2+F¯¯¯LA(x)F¯¯¯LB(y)2)

其中N(p)p点为中心的小patch。当L=5,4,3时,取3x3; L=2,1时取5x5。F¯¯¯L(x)=FL(x)|FL(x)|
当得到ϕLab时,我们要构建L1层的FL1A
FL1A=FL1AWL1A+RL1B(1WL1A)

其中RL1BFLB经过变换得到的。刚才已经说了,我们利用L层得到的ϕLab, 将其上采样,得到ϕLab, 再作用于FLB,得到FLB(ϕLab),作为RL1B。这样得到的RL1BFL1A是不对齐的。这是因为ϕLabϕL1ab之间有pooling,因此它们之间并不是简单的上采用就可以得到(而且L-1层与L层之间是经过卷积等其他操作的)。这就陷入一个难题:我们要得到FL1A, 不仅需要FLA, 还需要FLB的细节指导。前者是预先计算得到的,后者是与其不对齐的。所以要重建。我们虽然可以用ϕLab的映射,但是这毕竟不是ϕL1ab,而且 ϕL1ab不能由ϕLab简单上采样得到。

最终重建A的唯一障碍就是:怎样利用ϕLab以及FLB得到与FL1A对齐的RL1B
反过来思考,如果我们已经得到了RL1B,它应该有什么特点。它应该经过L1层到L层之间的计算后,得到的应该就是FLB(ϕLab)

定义CNNLL1()L1层到L层之间的子网络。那么CNNLL1(RL1B)显然是要与FLB(ϕLab)尽量接近。因此利用这一点可以得到:

LRL1B=CNNLL1(RL1B)FLB(ϕLab)2

从而近似求出FLB(ϕLab).

重建A’(或B)

上面唯一的问题就在于WL1A的得到了,其实就是手动选的。显然WL1A越大则说明我们希望FL1A利用更多的FLA的内容结构,利用更少的FLB的细节特征。
具体选择方法是:

WL1A=αL1ML1A

其中ML1A就是FL1A归一化之后,再经过一个sigmoid函数,从而得到。
ML1A(x)=11+exp(κ×(|FL1A(x)|2τ))

其中κ=300,τ=0.05

因此A(B)的重建就是三个过程:将当前层的特征warp上当前层的映射,然后反卷积得到上一层的特征,然后融合。如下图所示:
精致的像素级别的风格转换 ----- Deep Image Analogy

Nearest-neighbor Field Upsampling

前面已经说了直接从ϕLab上采样得到的映射ϕL1ab无法作为ϕL1ab,但是可以作为ϕL1ab的初始化值。ϕL1ab必须是由L1层的4幅图的特征通过NNF搜索精调整得到的。在第L1层的NNF搜索,只在ϕL1ab映射关系的p点周围一定的范围内进行随机搜索,从而微调ϕL1ab,得到ϕL1ab。对于{4,3,2,1}层,搜索范围半径分别是{6,6,4,4}。由于整个过程是corase-to-fine的一个过程,因此后一层的这种映射对于前一层的映射是有一定指导作用的。如果随机初始化不利用后一层的指导信息,那么无法得到好的A的重建。
精致的像素级别的风格转换 ----- Deep Image Analogy
从上图可以看到,如果是layer independent的话,重建出来的图会乱掉。

算法伪代码

精致的像素级别的风格转换 ----- Deep Image Analogy

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

效果展示

精致的像素级别的风格转换 ----- Deep Image Analogy

效果比Deep photo style transfer还好,不错。
精致的像素级别的风格转换 ----- Deep Image Analogy

并且这种素描与真实图的转换,效果也不错。
精致的像素级别的风格转换 ----- Deep Image Analogy

精致的像素级别的风格转换 ----- Deep Image Analogy

参考论文:Visual Attribute Transfer through Deep Image Analogy

相关文章:

  • 2022-02-15
  • 2021-07-02
  • 2022-12-23
  • 2022-01-17
  • 2021-08-04
  • 2021-07-04
  • 2021-04-01
  • 2021-05-19
猜你喜欢
  • 2021-10-01
  • 2021-08-21
  • 2021-09-16
  • 2022-01-01
  • 2021-10-13
  • 2021-10-04
相关资源
相似解决方案