此部分为预备知识,主要涉及内容如下:
Upsampling, Uppooling, Transpose Convolution(上采样,上池化,转置卷积)
Whitening and Coloring Transformations(白化与上色)
Wavelet Transforms(小波变换)
若是熟悉这几块内容的童鞋可以直接跳过~
Upsampling(上采样)
可以看出,上采样相当于做了一个均值池化操作的反操作。但会有一个问题,恢复的特征图中只保留了低频信息,丢失了高频信息。也就是说,生成的图像会比较平滑,严重的话会有些模糊的纹理。
Transpose Convolution
转置卷积,也有叫反卷积的。这是一个比较深的学问,而不是直接掉个包就觉得懂了。为什么一副较小的特征图能变大?这里就讲个转置卷积的大概流程:首先对原始特征图进行插值得到放大后的特征图,再对插值后的特征图进行卷积得到最终的结果。那怎么插值?插什么值比较好?这都是学问,大家可以查找相关资料,也建议阅读源码。
前言
假设 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(白化)
白化的过程分为两步:
去除向量 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 Σ Φ=Λ
使得向量 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 μ的矩阵。那么也需要两步操作
首先,对协方差矩阵 Σ \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
这一段内容,主要是对参考文献[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′=2x0−x1=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′=2x2−x3=15
其中,85是平均数,而15是它们的波动范围
通过上述计算得到的 { 80 10 85 15 } \{80 ~~ 10 ~~ 85 ~~ 15\} {80 10 85 15}四个值
现在,我们将 { 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′′=2x0′−x1′=−2.5x2′′=2x2′+x3′=12.5x3′′=2x2′−x3′=−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][212121−21]=[80 10]
这个右乘的矩阵 1 2 [ 1 1 1 − 1 ] \frac{1}{2}\left[ \begin{matrix} 1 & 1 \\ 1 & -1 \end{matrix} \right] 21[111−1]是不是很熟悉,有点接近 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][212121−21]=[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,这个性质在后面的论文中会用到。
针对什么问题?
现有的基于前向传播网络的风格迁移方法,只能局限于已见过的风格,难以推广到未见过的风格。此外,生成的图像质量一般。
提出什么方法?
在风格迁移中,引入 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,将内容图的特征协方差直接与指定风格图的进行匹配。
效果怎么样?
能实现任意风格迁移,且生成图像质量较好。
首先见图(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层的特征应该可以从低到高的捕捉一个风格的所有特征。
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^=EcDc−21EcTfc
下面,我们对这个公式进行分析
通过上述的操作,原始的内容特征被转化为了白化特征。作者将其输入到了预训练好的解码器中,得到下图:
这说明白化后的内容特征依然保持了全局结构,但却移除了其自带的风格。这为上色操作做好了准备。
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
最后再进行如下操作来调整生成的风格化图中:内容和风格的强度。
f c s = α f c s ^ ^ + ( 1 − α ) f c \hat{f_{cs} = \alpha\hat{f_{cs}}} + (1- \alpha)f_c fcs=αfcs^^+(1−α)fc
我们再来说说编码器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=∣∣Io−Ii∣∣22+λ∣∣Φ(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数据集训练,一旦训练完毕,参数就固定了。
本文首先将自己的方法和众多方法进行对比,如下图:
相比之下,本文的方法不需要先去学习风格,就可以进行任意的风格迁移;同时,能够极大的保留原始的内容特征。
最后,作者又展示了自己方法在纹理合成上的优势。将内容图变为随机噪音图像如高斯噪音,那么本文的方法可以合成纹理,如下图所示:
上图中,每对图像的左边是原始纹理,右边是合成纹理。作者说,多做几次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^合成两个不同的纹理,效果如下图:
可以看出,效果还是很不错的。
针对什么问题?
现有的方法如 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强怼),且生成的效果又逼真。
本文提出方法的第一步很简单,仅对原 W C T WCT WCT的模型做了简单的修改,如下图:
原始的 W C T WCT WCT方法在解码器中使用的是上采样的方法,而本文将其替换成了上池化,以便保留更多的内容结构,使得生成的图像不再出现伪影的现象**(这一说法被后文的 W C T 2 WCT^2 WCT2用指标强势打脸)**。
可能很多童鞋会疑惑,难道不断地上采样或者上池化就可以完成图像的重构了?想想都不可能啊?对,你们想的没错,是不可能。每个上采样或者上池化操作之后都会附加一个卷积操作,还是得学习参数的。我去翻阅了下源码,的确也是这样的,如下图:
可以看出,上池化之后先做了Padding操作,又接了一层卷积;这类似于自己实现了个反卷积的操作。
本文的第一步就这样结束了,关键在于第二步~
通过第一步生成的结果如下图所示:
虽然效果是挺好的,但是被圈出来的天空有着风格不一致的问题,这也是很多风格迁移方法的通病。那么怎么样才能使得:
本文选择的方法是“流行排序”。首先上述的问题被转化成以下的优化目标:
式子中, r r r代表的是最终生成的图像, y y y代表的是第一步生成的图像。
故式子中的第二项很好理解,即满足上文提到的第二个目标:保证最终的输出图,和第一步输出的图像内容相差不大。
我们的主要目的是理解上式中的第一项,即:使得生成的风格化图中局部内容相似的地方有着一致的风格。其实这个目标又可以转化为:**对于第一步生成的图像中的每个局部内容块,寻找与它在语义上最接近的那几个内容块,然后优化它们,使得它们之间的距离变短。体现出来的效果就是,天空具有一致化的风格了。**如下图所示:
说到距离度量,大家肯定会想到使用“欧氏距离”就行啦,为什么非要用“流行排序”呢?
那么对于一个图像流形中的点(即图像中的局部内容块),使用欧氏距离度量它们之间的距离合适吗?如下图:
再举个通俗点的例子,如果将地球看作高维空间,那地球上的陆地平面就是低维流形,如下图:
当距离很短时,两点之间的直线距离(即欧氏距离)可以近似度量两点之间的真正距离。但当两点之间的距离很大了,再使用欧氏距离(图中的黄线)来度量,就不准确了。
以上就是第二步的内容,至于”流形排序“的具体算法,有兴趣的同学可以查看参考文章5,我们这里不多做展开。
在第二步的优化目标中,有一个 λ \lambda λ平衡着两项损失,本文做了实验以获取较好的 λ \lambda λ,如下图所示:
可以看出,在 λ = 1 0 − 4 \lambda=10^{-4} λ=10−4的时候,能够取得较好的效果。
接着,作者有比较了自己方法的速度,如下图所示:
可以发现,大部分的时间消耗都集中在第二步上,不过总体上来说还是很快的(被 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分辨率图像的端到端模型,无需任何处理就能获得令人愉悦的真实感。
平均池化,最大池化出了什么问题?
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=21[1 1], HT=21[−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[−1−111]
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[−11−11] HHT=21[1−1−11]
作者在文中说到:通过对原始信号的镜像操作,就可以重建原信号,具体操作就是先进行转置卷积,再将所有转置卷积的结果求和。这个是小波分解运用的核心在将它之前,我们需要看一下模型的结构
上图清晰的展示了 W C T 2 WCT^2 WCT2的模型结构,可以发现它有以下几个特点
再结合我们上一小结提到的:通过对原始信号的镜像操作,就可以重建原信号,具体操作就是先进行转置卷积,再将所有转置卷积的结果求和。在理解这句话之前,我们先提几个问题?为什么小波变换能够保留更多的原始信息?,**为什么转置之后求和,求和之后真的能恢复原始图像中的所有信息吗?**现在我们进行解答
定义原始特征层为 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[1−1−11]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 U−Net的拼接操作。这虽然会增加训练参数,但是作者说生成的图像会更加的清晰,如下图所示:
不过说实话,我感觉区别不大,可能是区别大的图像没有放出来。如果能在保证理论上的正确性又能取得很好的效果就更加完美了。
在上面的模型图中,大家可以看到在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操作,但是为了降低计算量就取消了。
由于作者认为:图像中的低频部分代表的是光滑的表面和纹理,高频部分代表的是边缘。故 L L LL LL应该会影响到生成图像的整体纹理或者表面,而 L H H L H H LH ~ HL ~ HH LH HL HH应该影响边缘信息。故作者做了一个实验,即在恢复图像的过程中仅保留 L L LL LL的信息,效果如下:
作者为了验证 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作为验证指标,如下图所示:
最后再看一下, 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版传送门。
本文为作者原创,转载需注明出处!