一般情况下,我们只有两幅图片, A 和 B′ 。如果以 A 为主体,我们希望得到的图像在内容上与 A 相似,但是一些图像属性(比如颜色,纹理等)与 B′ 相似,我们记这样的图为 A′ ,同理我们也可以定义 B′ 。
与以前风格转换的异同:
以前style transfer的风格是全局的,指的是一种”画风“,这种转换与局部内容关系不大,比如古代山水画的画风或是抽象派的画风等等,是图像全局的风格的表达”。 如果是图像属性之间的转换, 是pixel级别的风格。
比如上图 A′ 具有 A 的轮廓,相应位置的内容几乎是一样的。但是整幅图像的属性(比如颜色,纹理)都变成了 B′ 的,即变成了暗黄色以及脸部的纹理也抹去了很多。
作者们认为直接学到从 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 和 B′ 我们是有的,如果我有也有 A′ 和 B , 那么我们就可以得到映射 Φa→b 和 Φb→a 。理想的 A′ 是即具有 A 的内容结构,又具有 B′ 的细节。 现在想,如果 A′ 和 A 是对齐的,只有细节不同(局部纹理,颜色等),那么 A 和 A′ 在CNN的高层上的特征是及其相似的。所以在最高层特征,直接假设 A 和 A′ 相等,然后在CNN的浅层逐步恢复 A′ ,恢复的方法是取当前层的 A 的特征与 B′ 的特征进行融合,同理可以构建当前层的 B 。通过一层一层往前构建,最终得到输入层的 A′ 和 B 。
输入 A 和 B′ , 那么我们可以得到 l 层的 A 和 B′ 的特征,这是预先计算的。 给定latent images A′ 和 B (加上输入的两幅,所有的4幅图像已经有了),我们可以定义映射 Φa→b 和 Φb→a 就是一次NNF(Nearest-neighbor Field)搜索。上面已经讲到,在网络的最高层,我们可以直接认为 A 和 A′ , B′ 和 B 相同。现在考虑:
如果我们已经有了第 L 层的4幅图的特征。对于 L−1 层的 A′ 特征,我们想法是将 L 层的 A 的特征与 L 层的 B′ 的特征进行融合的。由于 A 和 A′ 形状是基本一样的(只是细节不同),所以我们可以将第 L 层的 A 的特征乘以某个权值,作为第 L−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) ,其实是会出现问题的。在下面会更仔细讲解。
采用的是VGG的每一个“block”的第一层的卷积层后面的Relu层。就是 reluL1 ,即relu1_1, relu2_1,….relu5_1。neural style中也是默认采用这5层作为style层。上面已经讲了预处理怎么做了。
对于第 L 层,定义:
最终重建 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) 尽量接近。因此利用这一点可以得到:
上面唯一的问题就在于 WL−1A 的得到了,其实就是手动选的。显然 WL−1A 越大则说明我们希望 FL−1A′ 利用更多的 FLA 的内容结构,利用更少的 FLB′ 的细节特征。
具体选择方法是:
因此 A′(或B) 的重建就是三个过程:将当前层的特征warp上当前层的映射,然后反卷积得到上一层的特征,然后融合。如下图所示:
前面已经说了直接从 ϕ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