那些堪比照片质感的PhotoRealistic Style Transfer系列

1. Prerequisite Knowledge

此部分为预备知识,主要涉及内容如下:

  • Upsampling, Uppooling, Transpose Convolution(上采样,上池化,转置卷积)

  • Whitening and Coloring Transformations(白化与上色)

  • Wavelet Transforms(小波变换)

若是熟悉这几块内容的童鞋可以直接跳过~

1.1 Upsampling, UpPooling, Transpose Convolution

  • Upsampling(上采样)
    在这里插入图片描述
    可以看出,上采样相当于做了一个均值池化操作的反操作。但会有一个问题,恢复的特征图中只保留了低频信息,丢失了高频信息。也就是说,生成的图像会比较平滑,严重的话会有些模糊的纹理。

  • Uppooling(反池化)
    在这里插入图片描述

  • Transpose Convolution
    转置卷积,也有叫反卷积的。这是一个比较深的学问,而不是直接掉个包就觉得懂了。为什么一副较小的特征图能变大?这里就讲个转置卷积的大概流程:首先对原始特征图进行插值得到放大后的特征图,再对插值后的特征图进行卷积得到最终的结果。那怎么插值?插什么值比较好?这都是学问,大家可以查找相关资料,也建议阅读源码。

1.2 Whitening and Coloring Transformations

前言

假设 X X X是一个均值为0的向量,那么我们可以得到其协方差矩阵:

Σ = E ( X X T ) \Sigma= E(XX^T) Σ=E(XXT)

如果说 X X X中的向量是互相关联的,那么其协方差矩阵肯定不会是一个对角矩阵。为什么这么说?假设 X T = [ x 1   x 2 ] X^T = [x_1 ~ x_2] XT=[x1 x2]那么 Σ = [ x 1 x 1 x 1 x 2 x 1 x 2 x 2 x 2 ] \Sigma= \left[ \begin{matrix} x_1x_1 & x_1x_2 \\ x_1x_2 & x_2x_2 \end{matrix} \right] Σ=[x1x1x1x2x1x2x2x2]。由于 X X X均值为0,所以其该协方差举证的对角线元素为方差,而其他的元素都为向量中每个元素之间的协方差。所以,一旦 X X X中的向量相互都不关联,那么所有的协方差都为0,那么 Σ = [ x 1 x 1 0 0 x 2 x 2 ] \Sigma = \left[ \begin{matrix} x_1x_1 & 0 \\ 0 & x_2x_2 \end{matrix} \right] Σ=[x1x100x2x2],这就是一个对角矩阵。

而白化的目的就是去除原始向量中各维度的相关性,且每个维度的方差为1。

Whitening Transformation(白化)

白化的过程分为两步:

  1. 去除向量 X X X中各维度之间的相关性,具体步骤如下:

    • 首先通过下面的办法,找到向量 X X X协方差矩阵 Σ \Sigma Σ的特征值和特征向量

      Σ   Φ = Φ Λ \Sigma ~ \Phi = \Phi \Lambda Σ Φ=ΦΛ

      其中, Σ \Sigma Σ是对角矩阵,其对角线上的元素都是特征值, Φ \Phi Φ是协方差矩阵的特征向量。推导一下,可以得到如下等式:

      Φ T   Σ   Φ = Λ \Phi^T ~ \Sigma ~ \Phi = \Lambda ΦT Σ Φ=Λ

    • 那么,若是想得到一个新的 X X X,其协方差矩阵为对角矩阵的话,进行如下操作

      Y = Φ T X Y = \Phi^TX Y=ΦTX

    • 最后我们检验一下, Y Y Y的协方差矩阵是否为对角阵

      Σ Y = E ( Y Y T ) = Φ T X X T Φ = Φ T   Σ   Φ = Λ \Sigma_Y = E(YY^T) = \Phi^TXX^T\Phi = \Phi^T ~ \Sigma ~ \Phi = \Lambda ΣY=E(YYT)=ΦTXXTΦ=ΦT Σ Φ=Λ

  2. 使得向量 X X X中每个维度的方差为1,即使得协方差矩阵的对角线上的元素相同,这就是完整的白化过程。

    • 我们定义进行第二步操作之后的 Y Y Y W W W,那么:

      W = Λ − 1 2   Y = Λ − 1 2   Φ T   X W = \Lambda^{-\frac{1}{2}} ~ Y = \Lambda^{-\frac{1}{2}} ~ \Phi^T ~ X W=Λ21 Y=Λ21 ΦT X

    • 那么最后 X X X就被转化成了 W W W W W W的协方差真的是一个对角元素相同的对角阵了吗?我们检查一下:
      在这里插入图片描述
      以上就是白化的所有操作,我们借用参考资料**[3]**中的图像再解释一下,如下图:
      在这里插入图片描述

    • 假设 S S S是从 X X X中多次采样获得的n个样本 X i , i = 1 , 2 , . . . , n . X_i,i=1,2,..., n. Xi,i=1,2,...,n.构成列向量的矩阵

    • 那么上图(a)显示了原始采样数据 X 1 , X 2 X_1, X_2 X1,X2这两个变量的关系散点图。可以看到散点图中的点云斜向下,那么这两个变量成负相关。

    • 图(b)显示了,经过第一步操作后获得的变量 Y 1 , Y 2 Y_1, Y_2 Y1,Y2的关系散点图。此时,散点图中的点云垂直于 Y 1 Y_1 Y1

    • 图©显示了,经过第二步操作后获得的变量 W 1 , W 2 W_1, W_2 W1,W2的关系散点图。此时,散点图中的点云形成一个圆,这说明了 W 1 , W 2 W_1, W_2 W1,W2的相关性接近于0。也就达到了白化的目的,去相关性。

Coloring Transformations

如果白化懂了,那么剩下的上色就很容易理解了。因为上色本质上就是白化操作的逆操作。承接上文中的矩阵 S S S经白化后得到的样本 W i , i = 1 , 2 , . . . , n . W_i,i=1,2,..., n. Wi,i=1,2,...,n.,现在想把 S S S恢复为协方差矩阵为 Σ \Sigma Σ,且均值为 μ \mu μ的矩阵。那么也需要两步操作

  1. 化协方差矩阵为非单位阵
    • 首先,对协方差矩阵 Σ \Sigma Σ进行特征值分解

      Σ = Φ   Λ   Φ T = Φ   Λ 1 2   Λ 1 2   Φ T \Sigma = \Phi ~ \Lambda ~\Phi^T = \Phi ~ \Lambda^{\frac{1}{2}} ~ \Lambda^{\frac{1}{2}} ~ \Phi^T Σ=Φ Λ ΦT=Φ Λ21 Λ21 ΦT

      其中, Λ \Lambda Λ是一个具有特征值 λ i \lambda_i λi的对角矩阵, Φ \Phi Φ是相对应的特征向量矩阵。由于 Φ T \Phi^T ΦT中的特征向量互为正交,所以 Φ − 1 = Φ T \Phi^{-1} = \Phi^T Φ1=ΦT

    • 进行白化中第二步的逆操作,得到 Y Y Y
      Y = Λ 1 2   S Y = \Lambda^{\frac{1}{2}} ~ S Y=Λ21 S

  2. 化协方差矩阵为非对角阵,进行白化第一步操作的逆操作
    X = Φ Y = Φ   Λ 1 2   S X = \Phi Y = \Phi ~ \Lambda^{\frac{1}{2}} ~ S X=ΦY=Φ Λ21 S
    至此,上色操作就结束了~

1.3 Wavelet Transforms

这一段内容,主要是对参考文献[1]中部分相关资料的整理。由于非通信专业,对信号学的知识理解不多,感谢原作者分享的知识~。假设现在有一个信号 X = [ 90    70    100    70 ] X= [90 ~~ 70 ~~ 100 ~~ 70] X=[90  70  100  70],我想要对其进行压缩该怎么办呢?

  • x 0 = 90    x 1 = 70    x 2 = 100    x 3 = 70 x_0=90 ~~ x_1=70 ~~ x_2=100 ~~ x_3=70 x0=90  x1=70  x2=100  x3=70,现在我们通过如下计算重新获取它们的值

    { x 0 ′ = x 0 + x 1 2 = 80 x 1 ′ = x 0 − x 1 2 = 10 \begin{cases} x_0^{'} = \frac{x_0 + x_1}{2} = 80 \\ x_1^{'} = \frac{x_0 - x_1}{2} = 10 \end{cases} {x0=2x0+x1=80x1=2x0x1=10

    其中,80是平均数,而10则是它们的波动范围。同理,

    { x 2 ′ = x 2 + x 3 2 = 85 x 3 ′ = x 2 − x 3 2 = 15 \begin{cases} x_2^{'} = \frac{x_2 + x_3}{2} = 85 \\ x_3^{'} = \frac{x_2 - x_3}{2} = 15 \end{cases} {x2=2x2+x3=85x3=2x2x3=15

    其中,85是平均数,而15是它们的波动范围

  • 通过上述计算得到的 { 80    10    85    15 } \{80 ~~ 10 ~~ 85 ~~ 15\} {80  10  85  15}四个值

    • 其中80和85是局部平均值,反映该信号大的总体状态,是相对平缓的值;可以认为它们是信号的低频部分,记作 L L L
    • 而10和15是小范围波动的值,局部变化较快,可以认为它们是信号的高频部分,记作 H H H
  • 现在,我们将 { 80    10    85    15 } \{80 ~~ 10 ~~ 85 ~~ 15\} {80  10  85  15}重新排列,得到 [ 80    85    10    15 ] [80 ~~ 85 ~~ 10 ~~ 15] [80  85  10  15],记作 [ L    L    H    H ] [L ~~ L ~~ H ~~ H] [L  L  H  H]。然后,我们重复第一步的操作,得到

    { x 0 ′ ′ = x 0 ′ + x 1 ′ 2 = 82.5 x 1 ′ ′ = x 0 ′ − x 1 ′ 2 = − 2.5 x 2 ′ ′ = x 2 ′ + x 3 ′ 2 = 12.5 x 3 ′ ′ = x 2 ′ − x 3 ′ 2 = − 2.5 \begin{cases} x_0^{''} = \frac{x_0^{'} + x_1^{'}}{2} = 82.5 \\ x_1^{''} = \frac{x_0^{'} - x_1^{'}}{2} = -2.5 \\ x_2^{''} = \frac{x_2^{'} + x_3^{'}}{2} = 12.5 \\ x_3^{''} = \frac{x_2^{'} - x_3^{'}}{2} = -2.5 \end{cases} x0=2x0+x1=82.5x1=2x0x1=2.5x2=2x2+x3=12.5x3=2x2x3=2.5

  • 通过上述计算得到的 { 82.5    − 2.5    12.5    − 2.5 } \{82.5 ~~ -2.5 ~~ 12.5 ~~ -2.5\} {82.5  2.5  12.5  2.5}四个值,将它们重新排列,记作 [ L L    L H    H L    H H ] [LL ~~ LH ~~ HL ~~ HH] [LL  LH  HL  HH]

现在,我们使用线性代数的知识,利用矩阵运算完成上述操作

  • 对于 x 0 = 90    x 1 = 70 x_0=90 ~~ x_1=70 x0=90  x1=70,若要得到 x 0 ′ = 80    x 1 ′ = 10 x_0^{'}=80 ~~ x_1^{'}=10 x0=80  x1=10,那么需要做如下初等变换

    [ 90    70 ] [ 1 2 1 2 1 2 − 1 2 ] = [ 80    10 ] [90 ~~ 70]\left[ \begin{matrix} \frac{1}{2} & \frac{1}{2} \\ \frac{1}{2} & -\frac{1}{2} \end{matrix} \right] = [80 ~~ 10] [90  70][21212121]=[80  10]

    这个右乘的矩阵 1 2 [ 1 1 1 − 1 ] \frac{1}{2}\left[ \begin{matrix} 1 & 1 \\ 1 & -1 \end{matrix} \right] 21[1111]是不是很熟悉,有点接近 H a a r    W a v e l e t Haar ~~ Wavelet Haar  Wavelet了。

  • 那么

    [ L    L    H    H ] = [ 90    70    100    70 ] [ 1 2 1 2 1 2 − 1 2 ] = [ 80    85    10    15 ] [L ~~ L ~~ H ~~ H] = [90 ~~ 70 ~~ 100 ~~ 70]\left[ \begin{matrix} \frac{1}{2} & \frac{1}{2} \\ \frac{1}{2} & -\frac{1}{2} \end{matrix} \right] = [80 ~~ 85 ~~ 10 ~~ 15] [L  L  H  H]=[90  70  100  70][21212121]=[80  85  10  15]

以此类推,大家可以通过熟悉的线性代数得到最后的 [ L L    L H    H L    H H ] [LL ~~ LH ~~ HL ~~ HH] [LL  LH  HL  HH]。注意,为了得到 [ L L    L H    H L    H H ] [LL ~~ LH ~~ HL ~~ HH] [LL  LH  HL  HH],每次右乘的矩阵都是正交方阵,也就是说其可逆且 A A T = I AA^T=I AAT=I,这个性质在后面的论文中会用到

2. Universal Style Transfer via Feature Transforms( W C T WCT WCT)

针对什么问题?

现有的基于前向传播网络的风格迁移方法,只能局限于已见过的风格,难以推广到未见过的风格。此外,生成的图像质量一般。

提出什么方法?

在风格迁移中,引入 W h i t e n i n g a n d c o l o r i n g t r a n s f o r m s Whitening and coloring transforms Whiteningandcoloringtransforms,将内容图的特征协方差直接与指定风格图的进行匹配。

效果怎么样?

能实现任意风格迁移,且生成图像质量较好。

2.1 Model Architecture

本文的模型设计如下图所示:
在这里插入图片描述

  • 首先见图(a),使用预训练好的VGG-19作为编码器完成特征抽取;并训练了与编码器对称的解码器,将VGG-19抽取的图像特征还原为原始的像素图像。

  • 其次见图(b),这是进行风格迁移的主要步骤,使用的方法为WCT,也就是前文提到的方法,稍微有些不同,下文会详细讲。Encoder层接收到内容图和风格图之后,分别提取它们的特征,再进行WCT操作。先白化内容图,去除图像之间的相关性;再通过上色操作,匹配风格图的协方差。

  • 最后见图©,作者训练了多级别的风格化以得到更好的风格化图。为什么要这么做呢?作者首先使用VGG不同的特征层 R e l u _ X _ 1 ( X = 1 , 2 , . . . , 5 ) Relu\_X\_1(X=1,2,...,5) Relu_X_1(X=1,2,...,5)展示了相关的输出风格化图,如下:
    在这里插入图片描述
    可以看出:高层的特征捕捉了更为复杂的局部结构,而低层特征捕捉了更多的低级特征(如:颜色)。这是因为随着感受野的增大,特征的复杂度也会增大。所以,使用全部5层的特征应该可以从低到高的捕捉一个风格的所有特征。

2.2 WCT Operation

  1. Whitening transfrom

    • 定义Encoder抽取到的内容特征为 f c f_c fc,风格特征为 f s f_s fs;首先进行白化操作,去中心化 f c f_c fc即各通道减去均值,再进行如下转换:

      f c ^ = E c D c − 1 2 E c T f c \hat{f_c} = E_cD_c^{-\frac{1}{2}}E_c^Tf_c fc^=EcDc21EcTfc

      下面,我们对这个公式进行分析

      • 结合预备知识之所讲的, E c   D c E_c ~ D_c Ec Dc分别为 f c f_c fc协方差矩阵 f c f c T f_cf_c^T fcfcT的特征向量矩阵和特征值矩阵,其中特征值矩阵 D c D_c Dc是对角矩阵。
      • E c T f c E_c^Tf_c EcTfc使得其协方差矩阵为对角阵, D c − 1 2 E c T f c D_c^{-\frac{1}{2}}E_c^Tf_c Dc21EcTfc使得其协方差矩阵对单位阵。一直到这一步都是我们上面讲过的内容。
      • 那么 E c D c − 1 2 E c T f c E_cD_c^{-\frac{1}{2}}E_c^Tf_c EcDc21EcTfc是什么呢,其本质是将特征又投影回原始的特征空间中,且其协方差矩阵依然为单位矩阵,即 f c ^ f c ^ T = I \hat{f_c}\hat{f_c}^T = I fc^fc^T=I。源自于 Z C A 降 维 ZCA降维 ZCA。有兴趣的童鞋可至参考链接**[4]**。
    • 通过上述的操作,原始的内容特征被转化为了白化特征。作者将其输入到了预训练好的解码器中,得到下图:
      在这里插入图片描述
      这说明白化后的内容特征依然保持了全局结构,但却移除了其自带的风格。这为上色操作做好了准备。

  2. Coloring transform

    • 首先,去中心化风格图即各通道减去均值,再进行如下转换:

      f c s ^ = E s D s 1 2 E s T f c ^ \hat{f_{cs}} = E_sD_s^{\frac{1}{2}}E_s^T\hat{f_c} fcs^=EsDs21EsTfc^

      下面,我们对该公式进行分析

      • 同理, E s   D s E_s ~ D_s Es Ds分别为 f s f_s fs协方差矩阵 f s f s T f_sf_s^T fsfsT的特征向量矩阵和特征值矩阵,其中特征值矩阵 D s D_s Ds是对角矩阵。

      • 即进行了上色操作,所有操作都是白化操作的逆操作,但是用的是 f s f_s fs的相关特征。从而使得:

        f c s ^ f c s ^ T = f s f s T \hat{f_{cs}}\hat{f_{cs}}^T = f_sf_s^T fcs^fcs^T=fsfsT

    • 最后,再恢复中心化 f c s ^ \hat{f_{cs}} fcs^,加上风格特征通道的均值,如下:

      f c s ^ = f c s ^ + m s \hat{f_{cs}} = \hat{f_{cs}} + m_s fcs^=fcs^+ms

  3. 最后再进行如下操作来调整生成的风格化图中:内容和风格的强度。

    f c s = α f c s ^ ^ + ( 1 − α ) f c \hat{f_{cs} = \alpha\hat{f_{cs}}} + (1- \alpha)f_c fcs=αfcs^^+(1α)fc

2.3 Decoder

我们再来说说编码器Decoder,文中训练了多个Decoder,具体细节如下:

  • 分别使用 V G G 19   R e l u _ X _ 1 ( X = 1 , 2 , . . . , 5 ) VGG19 ~ Relu\_X\_1(X=1,2,...,5) VGG19 Relu_X_1(X=1,2,...,5)的输出特征训练如下损失

    L = ∣ ∣ I o − I i ∣ ∣ 2 2 + λ ∣ ∣ Φ ( I o ) − Φ ( I i ) ∣ ∣ 2 2 L = ||I_o - I_i||_2^2 + \lambda||\Phi(I_o) - \Phi(I_i)||_2^2 L=IoIi22+λΦ(Io)Φ(Ii)22

    其中, I o   I i I_o ~ I_i Io Ii分别为重构的输出图像和输入图像, Φ ( ) \Phi() Φ()就是 V G G VGG VGG不同层输出的特征。 λ \lambda λ是一个用来平衡两个损失的权重参数。

  • Decoder使用 C O C O COCO COCO数据集训练,一旦训练完毕,参数就固定了。

2.4 Experiment

  • 本文首先将自己的方法和众多方法进行对比,如下图:
    在这里插入图片描述

    • 基于迭代优化的方法虽然可以进行任意风格迁移,但是会遭遇到局部极小的问题
    • 基于前向网络的方法为了提升效率,牺牲了质量和普遍性,且会生成重叠的内容图像中的特征。
    • A d a I N AdaIN AdaIN虽然也是任意风格迁移,但仅调整了内容图像,使其具备和风格图像一样的均值和方差,难以捕捉风格的高级表示。
    • 基于内容块相似度的方法太过于约束内容特征,使得其只能捕捉风格图像低级的信息。

    相比之下,本文的方法不需要先去学习风格,就可以进行任意的风格迁移;同时,能够极大的保留原始的内容特征。

  • 其次,比较了各方法的速度和用户偏爱程度,如下表
    在这里插入图片描述

    • 可以看出,本文的方法受用户偏爱程度最高
    • 且本文的方法速度非常快,虽然和 A d a i n Adain Adain比相对慢了,但主要原因是为了计算协方差矩阵的特征值和特征向量而进行的特征值分解操作。
  • 接着,作者又展示了自己方法的生成图像上的灵活度,如下图:
    在这里插入图片描述

    • 由于网络参数已固定,通过调整风格图像的输入尺度,可以得到不同的风格化图像。

    • 通过调整 α \alpha α,即白化上色操作的最后一步,可以直接调整风格和内容的程度。

    • 此外,当使用者想调用不同的风格图编辑同一张内容图时,可以使用空间控制,通过使用 M ⨀ f c M \bigodot f_c Mfc替换 f c f_c fc。这里的 ⨀ \bigodot 是一个简单的掩码操作。效果如下图所示:
      在这里插入图片描述

  • 最后,作者又展示了自己方法在纹理合成上的优势。将内容图变为随机噪音图像如高斯噪音,那么本文的方法可以合成纹理,如下图所示:
    在这里插入图片描述
    上图中,每对图像的左边是原始纹理,右边是合成纹理。作者说,多做几次WCT操作还是很有帮助的,合成的纹理会更好。此外,本文的方法还可以通过 f c s ^ = β f c s 1 ^ + ( 1 − β ) f c s 2 ^ \hat{f_{cs}} = \beta\hat{f_{cs1}} + (1-\beta)\hat{f_{cs2}} fcs^=βfcs1^+(1β)fcs2^合成两个不同的纹理,效果如下图:
    在这里插入图片描述
    可以看出,效果还是很不错的。

3. A Closed-form Solution to Photorealistic Image Stylization( P h o t o W C T PhotoWCT PhotoWCT)

针对什么问题?

现有的方法如 W C T WCT WCT生成的风格化图存在着:1)有明显的伪影空间,2)相同空间却风格化不一致的问题。
在这里插入图片描述

提出什么方法?

提出新的风格迁移方法包括两个步骤:1)风格化,即 P h o t o W C T PhotoWCT PhotoWCT,2)平滑,即流行排序。各步骤效果如下图:

其中, F 1   F 2 F_1 ~ F_2 F1 F2各代表第一、二步,可以看出效果主要体现在第二步。

效果怎么样?

方法跑的又快(被后面提出的 W C T 2 WCT^2 WCT2强怼),且生成的效果又逼真。

3.1 First Step

本文提出方法的第一步很简单,仅对原 W C T WCT WCT的模型做了简单的修改,如下图:
在这里插入图片描述

  • 原始的 W C T WCT WCT方法在解码器中使用的是上采样的方法,而本文将其替换成了上池化,以便保留更多的内容结构,使得生成的图像不再出现伪影的现象**(这一说法被后文的 W C T 2 WCT^2 WCT2用指标强势打脸)**。

  • 可能很多童鞋会疑惑,难道不断地上采样或者上池化就可以完成图像的重构了?想想都不可能啊?对,你们想的没错,是不可能。每个上采样或者上池化操作之后都会附加一个卷积操作,还是得学习参数的。我去翻阅了下源码,的确也是这样的,如下图:
    在这里插入图片描述
    可以看出,上池化之后先做了Padding操作,又接了一层卷积;这类似于自己实现了个反卷积的操作。

本文的第一步就这样结束了,关键在于第二步~

3.2 Second Step

通过第一步生成的结果如下图所示:
在这里插入图片描述
虽然效果是挺好的,但是被圈出来的天空有着风格不一致的问题,这也是很多风格迁移方法的通病。那么怎么样才能使得:

  • 生成的风格化图中局部内容相似的地方(如天空),有着一致的风格呢?
  • 同时,又能保证最终的输出图,和第一步输出的图像内容相差不大?这样才能维持全局风格化的效果。

本文选择的方法是“流行排序”。首先上述的问题被转化成以下的优化目标:
在这里插入图片描述

  • 式子中, r r r代表的是最终生成的图像, y y y代表的是第一步生成的图像。

  • 故式子中的第二项很好理解,即满足上文提到的第二个目标:保证最终的输出图,和第一步输出的图像内容相差不大。

  • 我们的主要目的是理解上式中的第一项,即:使得生成的风格化图中局部内容相似的地方有着一致的风格。其实这个目标又可以转化为:**对于第一步生成的图像中的每个局部内容块,寻找与它在语义上最接近的那几个内容块,然后优化它们,使得它们之间的距离变短。体现出来的效果就是,天空具有一致化的风格了。**如下图所示:
    在这里插入图片描述

    • 如果将图像的局部内容看作图中的圈,对于每个圈1来说,内容语义上离它最近的应该是圈2,3等,以此类推。
    • 那么寻找这些最短的距离的内容块的过程就可以是:针对某一局部内容块,计算它与图中所有内容块之间的距离并将大小排序,选择离它最近的那几个,使得它们的语义相似即可。

说到距离度量,大家肯定会想到使用“欧氏距离”就行啦,为什么非要用“流行排序”呢?

  • 这是因为图像可以理解为高维空间中的低维流形,如下图:
    在这里插入图片描述

    • 如果把这些雕像的图像拉成一维向量,那么它们可以看成这个向量维度所在的空间中的散点图。
    • 但并不是这个空间中的每个散点都是这个雕像的图像,如上图中的红点就不是。所以所有雕像的图像根本就撑不满这个高维的空间,那么雕像所处的空间就称为高维空间中的低维流形。
    • 再举个通俗易懂的例子:二维空间中的点、线条;三维空间中的点、线条、平面、球体,都是高维中的低维流形。因为它们撑不满整个空间。
  • 那么对于一个图像流形中的点(即图像中的局部内容块),使用欧氏距离度量它们之间的距离合适吗?如下图:
    在这里插入图片描述

    • 图中的曲面为流形;红色的箭头度量的是流形中两个点的欧氏距离;
    • 但流形中真正的距离应该为黄色的那条线;所以欧氏距离的度量不好,要用“流形排序”的方法。
  • 再举个通俗点的例子,如果将地球看作高维空间,那地球上的陆地平面就是低维流形,如下图:
    在这里插入图片描述
    当距离很短时,两点之间的直线距离(即欧氏距离)可以近似度量两点之间的真正距离。但当两点之间的距离很大了,再使用欧氏距离(图中的黄线)来度量,就不准确了。

以上就是第二步的内容,至于”流形排序“的具体算法,有兴趣的同学可以查看参考文章5,我们这里不多做展开。

3.3 Experiment

  • 本文最后的风格化图的确很好,如下图所示:
    在这里插入图片描述
    可以看出来,不管是整体还是细节上,本文的方法都高于同行。

  • 在第二步的优化目标中,有一个 λ \lambda λ平衡着两项损失,本文做了实验以获取较好的 λ \lambda λ,如下图所示:
    在这里插入图片描述
    可以看出,在 λ = 1 0 − 4 \lambda=10^{-4} λ=104的时候,能够取得较好的效果。

  • 接着,作者有比较了自己方法的速度,如下图所示:
    在这里插入图片描述
    可以发现,大部分的时间消耗都集中在第二步上,不过总体上来说还是很快的(被 W C T 2 WCT^2 WCT2怼了)

  • 最后,作者展示了失败的例子,如下图:
    在这里插入图片描述

    平滑步骤反而使得风格没有被迁移的那么明显,当然已有的方法也没有做到很好。

4. Photorealistic Style Transfer viaWavelet Transforms( W C T 2 WCT^2 WCT2)

针对什么问题?

W C T WCT WCT再到 P h o t o W C T PhotoWCT PhotoWCT,生成的图片效果是一次一次刷新眼界。但 W C T WCT WCT P h o t o W C T PhotoWCT PhotoWCT都包含了多个Decoder,虽然会使得生成的图像保留更多的内容细节,但也会引入伪信号。此外,无论是最大池化还是上池化都会丢失原始图像的空间信息及细节。

提出什么方法?

本文使用Wavelet Pooling和Wavlet Unpooling取代最大池化和上池化,并构建了单一的Encoder和Decoder来取代多个Decoder的网络结构。

效果怎么样?

引用该文章摘要中的一句话:这是第一个也是唯一一个,可以在4.7秒内风格化 1024 × 1024 1024 \times 1024 1024×1024分辨率图像的端到端模型,无需任何处理就能获得令人愉悦的真实感。

4.1 Haar wavelet pooling and unpooling

平均池化,最大池化出了什么问题?

W C T 2 WCT^2 WCT2的精髓就在于引入小s波变换充当池化和反池化层。

  • 从作者的提供材料里可以了解到,若将图像看作信号,若是想要恢复一个完整的信号 f f f,那么就必须满足下列条件:

    { Φ ~ Φ T = I z = Φ f f = Φ ~ z = Φ ~ Φ f = f \begin{cases} \tilde{\Phi}\Phi^T = I \\ z = \Phi f \\ f = \tilde{\Phi}z = \tilde{\Phi}\Phi f = f \end{cases} Φ~ΦT=Iz=Φff=Φ~z=Φ~Φf=f

    ​ 这里面的 f f f可以看作原始图像, Φ \Phi Φ看作某种新的池化操作, Φ ~ \tilde{\Phi} Φ~看作该新池化操作的反池化。从公式中可以看出,一旦满足 Φ ~ Φ T = I \tilde{\Phi}\Phi^T = I Φ~ΦT=I,那么原始图像就可以被完整的恢复。

  • 若从线性代数的角度来解释的话就是池化操作 Φ \Phi Φ可逆,且该操作的逆为 Φ ~ \tilde{\Phi} Φ~;或者说原始图像 f f f经过两次基变换后能够回到原始的特征空间。

  • 那么问题来了,我们熟悉的平均池化操作(Mean Pooling)或者最大池化操作(Max Pooling)存在逆操作吗?答案是不存在。一旦进行平均池化或者最大池化,新的特征空间无法保留原先特征空间的所有信息。一种更容易理解的方式就是,以平均池化为例,平均池化的逆操作只会得到数值一摸一样的特征点。

小波池化就能做到恢复所有的原始特征吗?

答案是Yes。在 W C T 2 WCT^2 WCT2中主要使用的是 H a a r   w a v e l e t s Haar ~ wavelets Haar wavelets来做池化和反池化。

  • H a a r   w a v e l e t s Haar ~ wavelets Haar wavelets一共有四个滤波器,分别为 { L L T   L H T H L T H H T } \{LL^T ~ LH^T HL^T HH^T \} {LLT LHTHLTHHT},其中

    L T = 1 2 [ 1     1 ] ,     H T = 1 2 [ − 1     1 ] L^T = \frac{1}{\sqrt[]{2}}[1 ~~~ 1], ~~~ H^T = \frac{1}{\sqrt[]{2}}[-1 ~~~ 1] LT=2 1[1   1],   HT=2 1[1   1]

    ​ 其中低通滤波器专门用来捕获图像中光滑的表面和纹理,这其实也就是图像中的大部分信息了。高通滤波器用来提取垂直、水平和对角的边缘类信息,这就对对应了图像中的细节信息。

  • 这里,我们可以先计算出所有的滤波器,为后文滤波器的运用做铺垫。计算的结果如下(该数值经过作者源码的验证,有兴趣可以自己去查看一下源码,写的很干净):

    L L T = 1 2 [ 1 1 1 1 ]               L H T = 1 2 [ − 1 1 − 1 1 ] LL^T=\frac{1}{2}\left[ \begin{matrix} 1 & 1 \\ 1 & 1 \end{matrix} \right] ~~~~~~~~~~~~~ LH^T=\frac{1}{2}\left[ \begin{matrix} -1 & 1 \\ -1 & 1 \end{matrix} \right] LLT=21[1111]             LHT=21[1111]

    H L T = 1 2 [ − 1 − 1 1 1 ]          H H T = 1 2 [ 1 − 1 − 1 1 ] HL^T=\frac{1}{2}\left[ \begin{matrix} -1 & -1 \\ 1 & 1 \end{matrix} \right] ~~~~~~~~ HH^T=\frac{1}{2}\left[ \begin{matrix} 1 & -1 \\ -1 & 1 \end{matrix} \right] HLT=21[1111]        HHT=21[1111]

  • 作者在文中说到:通过对原始信号的镜像操作,就可以重建原信号,具体操作就是先进行转置卷积,再将所有转置卷积的结果求和。这个是小波分解运用的核心在将它之前,我们需要看一下模型的结构

4.2 Model Architecture

本文具体的模型结构如下:
在这里插入图片描述

  • 上图清晰的展示了 W C T 2 WCT^2 WCT2的模型结构,可以发现它有以下几个特点

    • 使用 W a v e l e t   P o o l i n g Wavelet ~ Pooling Wavelet Pooling以及 W a v e l e t   U n p o o l i n g Wavelet ~ Unpooling Wavelet Unpooling取代了最大池化,根据 H a a r   W a v e l e t Haar ~ Wavelet Haar Wavelet小波4个滤波器的性质,所有的池化窗口应该为 2 × 2 2 \times 2 2×2
    • 取消了多Decoder的模式,而分别在Encoder和Decoder中对称的做了多次的 W C T WCT WCT操作。
    • 因为 H a a r   w a v e l e t s Haar ~ wavelets Haar wavelets有四个滤波器,那么输出的通道应该为4层。其中 L L LL LL对应低频信息, L H   H L   H H LH ~ HL ~ HH LH HL HH对应高频信息。在Encoder中,仅有低频特征 L L LL LL前传,而剩余的高频特征 L H   H L   H H LH ~ HL ~ HH LH HL HH都先保留下来,并传递给了Decoder中与Encoder对称的地方。
  • 再结合我们上一小结提到的:通过对原始信号的镜像操作,就可以重建原信号,具体操作就是先进行转置卷积,再将所有转置卷积的结果求和。在理解这句话之前,我们先提几个问题?为什么小波变换能够保留更多的原始信息?,**为什么转置之后求和,求和之后真的能恢复原始图像中的所有信息吗?**现在我们进行解答

    • 定义原始特征层为 f f f,那么经过池化后可以得到 L L   L H   H L   H H LL ~ LH ~ HL ~ HH LL LH HL HH的表达式如下

      { L L = L L T f L H = L H T f H L = H L T f H H = H H T f \begin{cases} LL = LL^Tf \\ LH = LH^Tf \\ HL = HL^Tf \\ HH = HH^Tf \end{cases} LL=LLTfLH=LHTfHL=HLTfHH=HHTf

    • 若是我们暂不考虑图像特征在前向传播中的改变,即图像在Decoder中对称的 L L LL LL不变,那么进行转置卷积之后,再求和的结果是什么呢?

      { L L ′ = L L T L L T f = 1 2 [ 1 1 1 1 ] f L H ′ = L H T L H T f = 0 H L ′ = H L T H L T f = 0 H H ′ = H H T H H T f = 1 2 [ 1 − 1 − 1 1 ] f \begin{cases} LL^{'} = LL^TLL^Tf = \frac{1}{2}\left[ \begin{matrix} 1 & 1 \\ 1 & 1 \end{matrix} \right]f \\ LH^{'} = LH^TLH^Tf = 0 \\ HL^{'} = HL^THL^Tf = 0 \\ HH^{'} = HH^THH^Tf = \frac{1}{2}\left[ \begin{matrix} 1 & -1 \\ -1 & 1 \end{matrix} \right]f \end{cases} LL=LLTLLTf=21[1111]fLH=LHTLHTf=0HL=HLTHLTf=0HH=HHTHHTf=21[1111]f

      那么, L L ′ + L H ′ + H L ′ + H H ′ = 1 2 [ 2 0 0 2 ] f = I f = f LL^{'} + LH^{'} + HL^{'} + HH^{'} = \frac{1}{2}\left[ \begin{matrix} 2 & 0 \\ 0 & 2 \end{matrix} \right]f = If = f LL+LH+HL+HH=21[2002]f=If=f,没错就是这么神奇,原始信号经过两次小波变换再求和得到的就是原始信号。所以说 H a a r   W a v e l e t Haar ~ Wavelet Haar Wavelet作为池化层和反池化层的卷积核能够完整的重建信号。

    • 即使在前向传播的过程中,原始特征图的特征改变了,但原始图像的低频信息和高频信息都很好的被保留了下来,这使得生成的图像更加细腻、更加逼真。

    至此,本文中关于小波变换的部分讲解就到此结束了,下面我们还需要考虑模型的其他信息。

  • 虽然说在Decoder中,进行转置卷积并求和有着理论上的正确性,但在实际操作过程中,作者并未采取求和的办法,而是类似于 U − N e t U-Net UNet的拼接操作。这虽然会增加训练参数,但是作者说生成的图像会更加的清晰,如下图所示:
    在这里插入图片描述
    不过说实话,我感觉区别不大,可能是区别大的图像没有放出来。如果能在保证理论上的正确性又能取得很好的效果就更加完美了。

  • 在上面的模型图中,大家可以看到在Encoder和Decoder中做了3次对称的WCT操作。如果再增加WCT的次数,可能会有更好的效果,效果如下图:
    在这里插入图片描述

    可以看出WCT次数的增加会使得生成图像的风格更加鲜艳(会发现风格图的排版未对齐,这是作者留给观众的彩蛋吗?),但是也会涉及到更多的 S V D SVD SVD操作,因为要分解出特征图的特征向量和特征对角阵,这会导致时间的增加。此外,按道理来说,Encoder中通过跳级连接传递到Decoder中的 L H   H L   H H LH ~ HL ~ HH LH HL HH应该也要做WCT操作,但是为了降低计算量就取消了。

4.3 Experiments

  • 由于作者认为:图像中的低频部分代表的是光滑的表面和纹理,高频部分代表的是边缘。故 L L LL LL应该会影响到生成图像的整体纹理或者表面,而 L H   H L   H H LH ~ HL ~ HH LH HL HH应该影响边缘信息。故作者做了一个实验,即在恢复图像的过程中仅保留 L L LL LL的信息,效果如下:
    在这里插入图片描述

    • 可以看到,丢失了高频信息的图像中建筑的边缘并没有被风格化,而保留了低高频信息的建筑都被风格化了,这就验证了作者的观点。
    • 此外,这还证明了其他研究人员提出来的观点:在风格迁移中使用平均池化会使得生成的图像更加有吸引力,因为仅保留 L L LL LL的操作就类似于平均池化,只不过对于 2 × 2 2 \times 2 2×2平均池化除4取平均,而 L L T LL^T LLT滤波器除2取平均。
  • 作者为了验证 W a v e l e t   P o o l i n g Wavelet ~ Pooling Wavelet Pooling的有效性,将其和 S p l i t   P o o l i n g Split ~ Pooling Split Pooling L e a r n i n g   P o o l i n g Learning~ Pooling Learning Pooling做对比,效果如下图:
    在这里插入图片描述
    这个 L e a r n i n g   P o o l i n g Learning~ Pooling Learning Pooling的效果就惨不忍睹了,不过这个 S p l i t   P o o l i n g Split ~ Pooling Split Pooling看起来还不错。 S p l i t   P o o l i n g Split ~ Pooling Split Pooling也是使用 2 × 2 2 \times 2 2×2的滤波器进行池化,且也能捕获全局信息,不过其表达的能力差了点,所以陆地上的草效果看起来就比较差劲。

  • 当然,本文中最值得一提的实验就是使用 S S I M SSIM SSIM以及 G r a m   l o s s Gram ~ loss Gram loss作为验证指标,如下图所示:
    在这里插入图片描述

    • 首先解释一下这幅图的横纵坐标。横坐标代表的是 S S I M SSIM SSIM,越高说明生成的图像越好。纵坐标代表的是 G r a m   L o s s Gram ~ Loss Gram Loss,肯定是越小越好,越小就说明生成的图像和风格图的风格越接近。但注意纵轴坐标的值是递减而不是递增的,这样图中代表方法的点如果越靠近右上角,说明该方法越好。
    • 从图中可以看到,靠近右上角基本都是 W C T 2 WCT^2 WCT2。其中 D P S T DPST DPST的闪光点在于其风格损失很小,因为它直接优化了风格损失。然后,作者在论文中加粗了一句话打脸了 P h o t o W C T PhotoWCT PhotoWCT提出使用 U n p o o l i n g Unpooling Unpooling可以提升生成图像的质量。因为从图上来看,使用最大池化的 W C T WCT WCT效果反而比使用 U n p o o l i n g Unpooling Unpooling的好。所以,作者明确指出 P h o t o W C T PhotoWCT PhotoWCT生成图像质量好的主要原因还是第二阶段中经过“流形排序”处理了。
  • 最后再看一下, W C T 2 WCT^2 WCT2的速度
    在这里插入图片描述
    可以看出基于迭代过程的 D B S P DBSP DBSP W C T WCT WCT系列完全不是一个量级的。而 P h o t o W C T PhotoWCT PhotoWCT的第二步处理需要占用大量的内存和时间。所以 W C T 2 WCT^2 WCT2的速度优势很明显。

本文中提到的Style Transfer方法一脉相承但各具特色,皆为我辈之楷模,向优秀前辈致敬!Respect!本文的github版传送门

5. References

  1. 小波变换轻松入门(https://blog.csdn.net/jtxhe/article/details/42005685?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task)
  2. 反卷积、上采样、上池化(https://blog.csdn.net/a_a_ron/article/details/79181108)
  3. 白化上色(https://www.projectrhea.org/rhea/images/1/15/Slecture_ECE662_Whitening_and_Coloring_Transforms_S14_MH.pdf)
  4. ZCA降维(http://ufldl.stanford.edu/tutorial/unsupervised/ExercisePCAWhitening/)

本文为作者原创,转载需注明出处!

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值