精华内容
下载资源
问答
  • 实现代码:https://github.com/yjc567/StyleBank本文是对文章 StyleBank: An Explicit Representation for Neural Image ...大纲本文的大体内容分为以下几点: StyleBank的网络结构 StyleBank的训练策略 StyleBank的

    实现代码:https://github.com/yjc567/StyleBank

    本文是对文章 StyleBank: An Explicit Representation for Neural Image Style Transfer 的整理,以及自己重现其实验的结果和查阅相关资料的记录。

    大纲

    本文的大体内容分为以下几点:

    1. StyleBank的网络结构
    2. StyleBank的训练策略
    3. StyleBank的特性与优点
    4. StyleBank的参数调整对实验结果的影响
    5. 训练结果分析
    6. Instance normalization简介
    7. Total Variation(TV)loss简介
    8. 将VGG net用于特征抽取,以及Gram Matrix 简介
    9. 对FRIQA和SSIM两个图像质量评价方法的介绍
    10. 反思
    11. 参考文献

    因为时间有限,加上自己的实验还没有完全结束。所以本文着重于讲述[1, 2, 6, 7, 8]这几个偏向理论的部分,其余部分留在下一次的实验报告中提交

    StyleBank的网络结构

    网络结构

    1. 图片编码器(image encoder)E
    2. StyleBank层(StyleBank layer)K,其中包括n个并行的过滤器(filter,在本文中,使用cnn作为filter){Ki},(i=1,2,,n),对应n个不同的风格。
    3. 图片解码器(image decoder)D

    ![StyleBank网络结构.png](C:\Users\yjc56\iCloudDrive\study\Machine Learing\Project1_StyleBank\elements\StyleBank网络结构.png)

    训练分枝

    1. 自动编码器(auto-encoder)分枝 ED
    2. 风格化(stylizing)分枝 EKD

    训练的目标是使图像的内容(content)经过ED后尽可能的不会损失。同时图像的风格信息会被StyleBank加入,以在保持内容的同时将图像用不同风格表现出来。也就是希望网络可以尽可能地将图像的内容和风格分离开。

    输入与输出

    输入一个图像(content image)I,编码器E会从这个图像抽取出多层特征(multi-layer feature maps)F,即:F=E(I)

    ED分枝中,直接将F传给解码器D,得到输出图像O,即O=D(F),输出图像O应该和输入图像I尽可能的接近,这也是我们训练的目标

    EKD分枝中,F还需要通过K中的某一层Ki,得到Fi~,接着再通过解码器D,生成对应风格i的输出图像Oi,即:Oi=D(Fi~),(i=1,2,,n)

    Encoder and Decoder

    E由3层卷积层组成,其步长和卷积大小分别是:

    1. stride: 1, 99 kernel
    2. stride: 2, 33 kernel
    3. stirde: 2, 33 kernel

    D的结构与E相反,其3层卷积层的构造是:

    1. stride: 12, 33 kernel
    2. stride: 12, 33 kernel
    3. stirde: 1, 99 kernel

    其中除了最后一层以外,每一层后面都加上了Instance normalization和ReLU,关于Instance normalization的简介可以查阅文章后半部分。

    StyleBank Layer

    n个卷积层组成,代表n个不同的风格。

    训练策略

    loss function

    ED分枝只需要计算生成图像和原图在识别度上的loss(identity loss LI):

    LI(I,O)=||OI||2

    EKD分枝就需要结合生成图像内容上的loss(Lc),风格上的loss(Ls),和一个正则化loss(Ltv(Oi))):
    LK(I,Si,Oi)=αLc(Oi,I)+βLs(Oi,Si)+γLtv(Oi)

    其中正则化lossLtv(Oi)是全变差正则化(total variation (tv) regularization)关于其介绍,请参阅后面的章节。

    LcLs则是分别利用VGG-16网络进行特征抽取和格莱姆矩阵(Gram matrix)计算得到的。这两者的介绍放在文章后面中。

    Lc(Oi,I)=l{lc}||Fl(Oi)Fl(I)||2

    Ls(Oi,S)=l{ls}||G(Fl(Oi))G(Fl(Si))||2

    其中{lc}只用到了VGG-16中的relu4_2

    {ls}用到了VGG-16中的relu1_2,relu2_2,relu3_2,relu4_2

    训练策略

    StyleBank训练策略.png

    敲一遍太麻烦了,所以直接上截图好了 QAQ

    其中T=2,m=4(branch大小为4),λ=1

    StyleBank 的特性与应用场景

    特性

    1. 分离图像的内容和风格

      论文指出ED分枝就是一个图像压缩与重构结构,并且K是完全独立于ED的,这也是后面增量学习特性的基础。

      同时每个Ki公用同一对ED,极大地节省了内存空间。

      此模型对内容和风格的分离可以见我的实验结果(下图),左图为原图(content image),中间是风格画像,右边是生成的图像,虽然生成的图像是一个画师以原图为基础的作画,但是显然生成图像只从中间的图片学来了画家的风格,其内容更接近原图。

      6_th_result.png

    2. 传统方法与神经网络的结合

      详见论文,这一部分主要介绍了神经网络的风格转换方法和一些传统方法的相似性

    3. 支持增量学习

      对一个已经训练完成的StyleBank,可以保持其ED不变,以增加一个新的Ki的方法来增加一个新的风格,固定ED完成对新风格的学习,并且以这种方式得到的网络性能和原先一致。

      incremental_training与fresh_training的区别.png

    应用场景

    StyleBank可以以两种方式实现风格的融合。

    1. 线性融合风格

      formula_of_Linear_Fusion.png

      两个Style的线性融合.png

    2. 特定区域的风格融合

      formula_of_Region_specific_fusion.png

      Picasso_Van_Gophm.png

    参数调整对实验结果的影响

    因为实验还没有全部完成,目前还很难下定论,下次再更新这一段。

    训练结果分析

    同上。

    Instance normalization

    在 Texture Networks: Feed-forward Synthesis of Textures and Stylized Images 一文指出,针对每一个输入的图像进行normalization,而不是针对输入的一批图像进行归一化,会得到更好的风格化结果,尽管这篇文章并没有探寻这个现象的原因(不知道为什么,自己不能在arxiv上查看原始版本的论文,所以只能看网络上的中文翻译版本)。

    Texture Networks: Feed-forward Synthesis of Textures and Stylized Images

    Total Variation(TV)loss

    本章节两张图片显示不出来了QAQ
    自己查看图片的原网址把,反正也是从别人那里摘抄来的 = =

    全变分去噪,或者说全变分loss,是一个经常被用在图像去噪上的方法,这个方法认为图片的噪声点与其周围的像素点有着很高的方差,其计算公式非常简单:

    TVLoss formula

    TVLoss反应的是图像的噪声,因此利用这个loss函数生成的图像可以保持光滑。

    看一下加了TV正则项以后的图像复原结果和不加的差异:

    TVLoss picture

    图(a)是原始图像,图(b)在原图像上加了一定程度的模糊和噪声,图(c)是不加TV项的复原结果,可以看到有一圈一圈的伪影,这是我们不想要的。图(d)是加了TV项以后的复原结果,没有伪影,复原结果基本和原图像相同。

    其代码实现也非常简单:

    def TVLoss(output_image):
        return torch.sum(torch.abs(output_image[:, :, :, :-1] - output_image[:, :, :, 1:])) + torch.sum(torch.abs(output_image[:, :, :-1, :] - output_image[:, :, 1:, :]))

    VGG net and Gram Matrix

    VGG net

    为什么VGG net的某些层可以用来抽取特征呢?可能是自己浏览的不是很仔细,竟然无法在网上找到具体的解释或原因,猜测可能很多网络都可以用来抽取特征,只是VGG深度适当,所以其运算速度和结果精确度之间有比较好的平衡?那为什么又是用VGG特定的那几层呢?

    Gram Matrix

    给定一个实矩阵 A,矩阵 ATAA 的列向量的格拉姆矩阵,而矩阵 AATA 的行向量的格拉姆矩阵。

    而对一个三维的矩阵A,设A的大小是(ch,h,w)可以把A展开为(ch,hw)的二维矩阵,然后求其gram矩阵就好了。

    根据Gram矩阵和协方差矩阵的定义可以看出Gram就是一个偏心协方差矩阵(即没有减去均值的协方差矩阵),因此Gram矩阵相比协方差矩阵,其对角线还可以体现每个特征在图像中出现的量。

    其实到底为什么Gram矩阵可以用来计算features之间的loss,还是需要更高深的数学知识才可以解释,希望自己以后有机会可以掌握其真正原理。

    FRIQA and SSIM

    因为还没有把这两个东西具体应用到我的实验里,所以打算之后再完成这个章节。

    反思

    感觉自己相关的知识掌握的还不够,阅读论文的方法也有问题,很多东西都是自己问了QZQ之后才明白的。而且对pytorch相关的代码知识也不是很掌握,也是第一次接手这种项目的开发,希望在这段时间里自己可以学到一些有意思也实用的知识。

    参考

    StyleBank: An Explicit Representation for Neural Image Style Transfer
    Instance Normalization: The Missing Ingredient for Fast Stylization
    Algorithm With Total Variation Regularization for 3D Confocal Microscope Deconvolution
    very deep convolutional networks for large-scale image recognition

    展开全文
  • 给定任意风格图与内容图,0.1秒实现风格转换。

    如果不知道风格转换的,移步 http://blog.csdn.net/hungryof/article/details/53981959 ,瞄上一眼再回来。

    1. 以前风格转换速度之尴尬

    如果从得到效果图速度来分的话,可以分为三个阶段。

    阶段一

    最初的用神经网络实现的风格转换是需要不断迭代的,不仅速度慢,而且我要在A图加上B图的风格,就需要分别根据这两幅图进行不断前反向传播,更新输入,效率实在太低。称之为style transfer

    阶段二

    后来人们就想能不能直接一个前向传播搞定啊~,然后他们想出了,先训练一个G, 这个G可以让输入I通过G后得到的G(I)是A图加上B图的风格。这个方法还是有很大的问题,那就是我训练的G必须是同一种风格,一般就用一幅风格图B,然后用很多的内容图,不断优化训练G, 最终G有啥用啊,只是“B风格的滤镜”罢了。那我要很多种风格呢?我就要训练很多很多的G,那挺尴尬的。. 代表论文是是 http://blog.csdn.net/hungryof/article/details/53981959 中提到的 Texture Networks: Feed-forward Synthesis of Textures and Stylized ImagesPerceptual Losses for Real-Time Style Transfer and Super-Resolution . 这也就是网上经常说的 fast style transfer.

    阶段三

    大家就想,我怎么直接输入任意A和B,一次前向出来呢?如果能成功,那么速度就不需要考虑了,因为已经到达顶峰了。
    style-swap 就是第三阶段的开始。
    0.1秒出结果。
    这里写图片描述

    2. Style-swap的魅力


    这里写图片描述

    效果还是挺不错的嘛~~再放几张。。

    图片名称

    图片名称

    用上面素描画形成的效果:

    这里写图片描述

    这里写图片描述
    别问这人是谁,一个好友的qq头像,有较多的纹理,就直接拿过来试了试效果。。

    3. style-swap浅谈

    论文分为2个部分,第一部分就是常规的迭代方式,第二个是将常规的改成一次前向的方法。

    3.1 style-swap的新方法

    以前不都是认为Gram操作就是相当于“风格”的一种表示嘛,他们认为,如果我要得到C图的内容加上S图的风格,那么我希望我的网络输入I在高维度特征ϕ(I)(一般用VGG19的某一层的相应的输出,作为I的高维特征)与C图的高维特征ϕ(C)尽量一样,同时希望ϕ(I)进行Gram计算后得到的G(ϕ(I))G(ϕ(S))尽量一样。为什么要用Gram矩阵呢?是否有必要?这些都不知道。
    后来Chuan Li的 Combining Markov Random Fields and Convolutional Neural Networks for
    Image Synthesis将Style loss改成了MRFs Loss Function,依旧保留content loss。这篇论文第一部分工作其实就单纯用第一种loss了,舍弃了content loss。 这篇论文的详细讲了计算这种Loss的高效方法。这篇论文的主要贡献还是第二部分工作,引入了Inverse Net,这使得一次前向传播得到的特征图成为可能。

    3.2 实现方法

    CS分别代表内容图和风格图,ϕ()代表预训练网络(一般VGG19)的前部分网络。ϕ(C)就是C传入网络中在某一层出来的特征。

    1. 先提取一系列块ϕi(C)ϕj(S)。其中inc, jns,其中ncns分别是能从ϕi(C)ϕj(S)抽取的块数。
    2. 对于每块ϕi(C),我们希望选择其最近的style 块ϕj(S), 称之为ϕssi(C,S).
      ϕssi(C,S):=ARGMAXϕj(S),j=1,,ns<ϕi(C),ϕj(S)>||ϕi(C)||||ϕj(S)||
    3. 这步称之为重建Φss(C,S)。这时候我们只需要平均一下那些重叠区域的值就行了。这样就可以得到Φss(C,S),称之为Φss(C,S)的重建。

    因此总的优化目标是:

    Istylized(C,S)=ARGMINIRh×w×d||Φ(I)Φss(C,S)||2F+λTV(I)

    3.3 高效方法

    这里可能会写的比较啰嗦。。因为要讲的很明白,确实需要啰嗦点。。为了简便,提取的块spatial size就3x3吧, relu3_1层是256个通道。下面的三步统称为style-swap.

    3.3.1 实现方法的第一二步解释

    先看看3.2节实现方法的第一二步干啥:

    ϕssi(C,S):=ARGMAXϕj(S),j=1,,ns<ϕi(C),ϕj(S)>||ϕi(C)||||ϕj(S)||

    对于每一块ϕi(C),从nsϕj(S)中找到与其最匹配的块,称之为ϕssi(C,S)。最终我们可以找到ncϕssi(C,S)
    可以发现<ϕi(C),ϕj(S)>是相关操作,也是卷积网络中说的卷积,对于某一块ϕi(C) ,其和ns块分别进行相关,不就是将这ns块看成ns个卷积核,每个卷积核就是ϕj(S)(大小是256×3×3)。输入是ϕi(C), 最终输出是ϕi(C)ns个卷积核卷积后的输出,大小为ns×1×1。总共有ncϕi(C),恰恰对应这卷积核在Φ(C)上的位置的所有情况,就是卷积核在Φ(C)上的卷积操作的移动恰恰就能满足这样。

    3.3.2 高效方法的第一步

    结论:Φ(C)作为输入,nsϕj(S)ϕj(S)作为卷积核(ns×256×3×3)。得到的输出就是所有的i=1,,ncϕi(C)所对应的

    ϕj(S),j=1,,ns<ϕi(C),ϕj(S)>||ϕj(S)||

    论文的写法更为简便:
    Ka,b,j=ϕa,b(C),ϕj(S)ϕi(S)

    输出的大小为:ns×w×h, 显然w×h等于nc。为了计算速度,省略了ϕi(C), 因为这不会影响取哪一个最近style块。
    该步称之为swap_enc

    3.3.3 高效方法的第二步

    第一步得到的输出O到底是什么?记Oa,bO中以(a,b)为中心点的ns*1*1大小的输出张量,那么Oa,b,jϕa,b(C)ϕj(S)的卷积的值。因此我们对于每个位置(a,b)如果第j个通道的值是ns个值中最大的,将该位置记为1,其他ns1个通道记为0. 这样就选出了块ϕi(C)对应的最匹配的块ϕj(S)j值!

    K¯¯¯a,b,j={1,0,if j=argmaxjKa,b,j otherwise

    没错,第二步就是通道最大值记录为1,其余为0
    实现结束高效方法的第一第二步,我们要的就是K¯¯¯
    该步称之为Maxcoord

    3.3.4 高效方法的第三步

    K¯¯¯作为输入,将ϕj(S)作为反卷积核。显然反卷积核与刚才的一样,也是ns×256×3×3
    对于每个位置(a,b), 只有最匹配的style块才会输出,其他的块都被乘上了0!此时就可以得到ϕssa,b(C,S),比如与ϕ10,10(C)相关程度最大的块是第200块,即max{O10,10,j}的值为O10,10,200,得到K¯¯¯10,10,200=1, 同时 K¯¯¯10,10,j=0,j200K¯¯¯10,10,jϕ(S)反卷积,此时可以提取出ϕssa,b(C,S),就是ϕ200(S)。直到这里我们才弄好了所有的ϕssa,b(C,S), 反卷积后这些ϕssa,b(C,S)是重叠的,重叠部分取平均即可。
    此时才真正得到Φss(C,S)
    这一步称之为swap_dec

    4. 训练Inverse网络

    这是第二部分内容,是核心部分。回忆第一部分的优化目标:

    Istylized(C,S)=ARGMINIRh×w×d||Φ(I)Φss(C,S)||2F+λTV(I)

    我们希望该Inverse网络f无论对于任何输入H (这些输入包括Φ(C)或是Φ(S)或是Φss(C,S) ), 我们都能使得f(H)能得到Istylized(C,S)。 即Φ(f(H))H尽量一样。因此有:
    arginff=EH[Φ(f(H))H2F+λ(f(H))]

    值得注意的是,如果我们训练好Inverse网络,称之为decoder, 然后进行前向传播是,首先是Φ(C)经过style-swap结构后得到Φss(C,S),再输入到decoder中,即可得到Iˆstylized(C,S)

    至此, 彻底完成一次前向传播出结果的目标!!!!!

    4.1 训练时代码的细节

    在训练时,

    Enc(4,256,64,64)latent_beforeswapLoss(8,256,64,64)latent_after(8,256,64,64)recons_latentdec(8,3,256,256)recons_inputEnc

    比如我一下子输入2个content图和2个style图,然后latent_before是(4, 256, 64, 64),经过swap结构,得到latent_after是(8,256,64,64)。注意的是latent_after的前4个仍旧是latent_before, 而后4个是Φss(C,S)。更加准确的说:
    latent_before[1]和latent_before[2]是Φ(C1)Φ(C2),而latent_before[3]和latent_before[4]是Φ(S1)Φ(S2)。 然后传入swap中,得到latent_after,latent_after[1:4]与latent-before一致,latent_after[5:8]分别为Φ(C1,S1),Φ(C1,S2),Φ(C2,S1),Φ(C2,S2)。得到的Loss是MSE(latent_after, recons_latent)。具体的含义见下图

    Enc[Φ(C),Φ(S)]swapLoss[Φ(C),Φ(S),Φss(C,S)][Φ(f(Φ(C))),Φ(f(Φ(S))),Φ(f(Φss(C,S)))]Dec[f(Φ(C)),f(Φ(S)),f(Φss(C,S))]Enc

    因此我们当然是希望Φ(f(Φ(C)))Φ(C)尽量接近,Φ(f(Φ(S)))Φ(S)尽量接近,Φ(f(Φss(C,S))Φss(C,S)尽量接近,这样才能实现对于Φ的反转!

    为什么是用[Φ(C),Φ(S),Φ(C,S)][Φ(f(Φ(C))),Φ(f(Φ(S))),Φ(f(Φss(C,S)))]进行求Loss,再反向传播呢?

    为了方便,直接说为什么是用Φ(C,S)Φ(f(Φss(C,S)))。其实我们希望优化Dec,那么最好是希望f(Φ(C,S))C在高层语义上尽量一样。高层语义自然要将f(Φ(C,S))C进行升维,所以把f(Φ(C,S))再次输入到Φ中,与Φ(C)相比,用MSE就行了。
    其实这种思想和fast neural style是类似的,或是可以看成是fast neural style的升级版本。fast neural style使用G网络生成G(x),使用D网络提供Loss形式。希望在高层语义特征上D(G(x))D(C)尽量接近,同时希望在高层语义上Gram(D(G(x)))Gram(D(S))尽量接近。那么style-swap也是如此。Enc就是D,而Dec就是G。不过更加准确的说Dec不仅仅是G,而是G的升级版,因为以前的G只是针对一种style进行训练,而这里的Dec是针对大量的style一起训练。

    附录:
    Fast Patch-based Style Transfer of Arbitrary Style

    展开全文
  • 风格迁移

    千次阅读 2018-02-22 17:20:54
     既要保留原本图片的基本内容,又想将其他喜欢的绘画风格叠加上来,就像下面的例子: 那么对喜欢的绘画风格,怎么将其风格,搬到另外一张图片上呢? what is texture of a image?  texture of imag...

      好久之前就想研究下风格迁移了,很酷炫的玩法~现在主要整理下风格迁移的基本方法,高分辨率的处理,以及计算效率问题。

    风格迁移

      既要保留原本图片的基本内容,又想将其他喜欢的绘画风格叠加上来,就像下面的例子:  

      那么对喜欢的绘画风格,怎么将其风格,搬到另外一张图片上呢?

    what is texture of a image?

      texture of image是描述图像风格的纹理脉络,具有很强的同质性和规律性。

    如何描述一张图的绘画风格

      参考文献1,2,3都是Gatys的文章,提出了texture representation的方法。
      卷积网络的feature-map在分类任务中学习了图像的深层特征,在上篇博文CNN的隐层可视化中已经讲解了不少关于隐层的特征特性。这些feature-map如何表示图像的纹理特性呢?
      对某一隐层而言,假设有Nl个channel的feature-map,每个map的size=Ml=height×width,那么每两个channel间都计算各inner-production,再累和作为本层的Texture表示矩阵,数学上称之为Gram matrix(详见补充),定义如下

    Gi,jl=kFi,klFj,kl
      其中,F表示feature-map被展开成1-D的向量;k表示某个feature-map被展开成向量后的pos-index;i,j表示同层内的不同feature-map的channel-index;l表示当前所在的隐层;GlRNl×Nl
      Gatys发现,Gram-Mat能够递进地表达Texture-Character,下图为例:  

      从左往右,层数越深,Style-Reconstrucation得到的弯弯曲曲的风格越明显。
      如果有两张图x是原始图像,x^是生成图像,如何表示texture上的距离呢?现定义如下的平方差距离如下:
    El=14Nl2Ml2i,j(G2^i,jGi,j2)
      将各个层的距离都合并到一起的loss如下:
    Lstyle(x^,x)=l=0LwlEl
      其中,wl是每层对总texture-diff-loss的贡献权重,通常是选择型权重(内部值非0即1)。
      ElFl^i,j计算梯度如下:
    ElFl^i,j={1Nl2Ml2(Fl^)T(Gl^Gl)i,jif Fl^i,j>00if Fl^i,j<0

      注意:风格上的差异需要多层来共同定义。
      注意:梯度那里if F<0, =0是由于ReLU做激活函数。
      注意:Image论文里的Style/Content-Reconstruction是分别对feature-map和Gram-Mat正向估计出来的。

    如何描述一张图的图片内容

      新生成的图还要保留原本的内容大体不变,那就需要图片内容表示方法,并且定义图像间内容上的差距。
      feature-map本身就表示了图像在不同层上的内容,虽然它描述了图像许多维特性,但是不妨碍我们将其作为内容的主要描述方式。
      对两张图片上内容的差距定义为平方差的形式如下:

    Lcontent(x^,x,l)=12i,j(Fl^i,jFi,jl)2
      LcontentFl^i,j计算梯度如下:
    LcontentFl^i,j={(Fl^Fl)i,jif Fl^i,j>00if Fl^i,j<0
      注意:图像间在内容上的差距仅需要1/2层就足矣区分。
      注意:在Image论文里的Fig. 1,图中下侧的”Content Reconstructions”不是反卷积(转置卷积)反向计算得到的,而是用正向估计的方法估计出来的。为什么要这么搞呢,当时反卷积已经面世了,还要这么蛋疼地正向估计,猜测是跟作者想要说明的一个小结论有关系,在图Fig.1下的注释里,有句话说“层越深,像素细节越被丢掉,但是更高维的内容信息留下了”,用反向卷积对这个小结论可能不利吧,也可能再写个反卷积麻烦,猜的。

    怎么做风格的调优优化

      这个就是怎么权衡内容和风格了,整体优化目标如下:

    Ltotal=αLcontent+βLstyle
        看Image论文里是以αβ[101,102,103,104]来生成渲染图像的,其中103为渲染效果较为明显。上个图,表示下优化的流程,左侧是style-image,右侧是原始图,中间是生成图。  


      Image论文里仅用一个网络结构VGG-19(稍微调整结构),描述内容和风格距离的网络是用分类任务训练好的网络(参数固定),生成网络用来不断调整输入,以便生成图像x^:=x^lrLtotalx^在内容上接近原图,在风格上接近Style图,优化方法是L-BFGS
      注意:初始化不管是随机还是用原始图或者风格图,无明显区别,生成很慢。

    高分辨率的风格迁移方法

      上述风格迁移的方法,有两个重要的缺陷:
       1. 无法对不同图像尺度做迁移处理,受限于固定的输入尺寸。
       2. receptive-filed 是很小的(filter的尺寸,也即一个节点所能接收的输入范围),无法描述大范围的纹理特性

    高分辨下怎么描述风格更准确

      怎么办呢?早在1984年就已经有了对此类问题的处理思路:pyramid-method,详细见参考5。
      Snelgrove,一个加拿大人(跟白求恩同一个国家),使用pyramid-method对texture的表示方法做了改进,原来的方法仅限一个固定尺寸的图像做输入,而pyramid-method则允许多个不同尺度的图像同时做输入。
      具体做法:对原始图像做Gaussian-lowpass (高斯滤波器+低通滤波器做门函数)卷积处理之后的multi-scale的结果(Gaussian pyramid,对前一层图像加Gaussian-lowpass 卷积处理,依次得到缩小的图像,详细见参考5),同时输入到CNN里面,计算其第8个隐层的Gram-mat,如下:

    Gi,jl,s=1NlMlkFi,kl,sFj,kl,s

      单个输入在单个隐层上的texture的差距:Els=i,j(G^i,jsGi,js)2
      多个输入在多个隐层上的texture的差距:Lstyle(x^,x)=s=0Svsl=0L1wlEls
      在训练的时候,将Gatys训练方法的Lstyle替换为pyramid-texture-representation形式的,其中vswl都是选择性权重(内部值非0即1)。
      基本的multi-scale的风格迁移处理中,原始图像与生成图像的texture-loss计算结构如下图:


      注意:这里的合成图像的优化结构不同于Gatys的,后面有介绍。

    Snelgrove方法 与 Gatys方法的效果对比

      为了说明本方法能抓住更大尺度上的texture信息,做了如下对比:  

    Pyramid Method in Image Process

      详见参考5和6。

    疑惑 与 解答

      1. 在Imag那篇文章的2小结,有提到”normalized the network by scaling the weights such that the mean activation of each convolutional filter over images and positions is equal to one”,不明白这是怎么个操作?
       解答:暂时没有弄明白。
      2. 在High-Resolution那篇文章里,是怎么解决输入多尺度问题的?
       解答:输入与卷积层直接相连,卷积计算是不关心输入尺寸的,避免了输入大小的限制,所以有几个输入就有几个输出,最后会加起来。
      3. 在High-Resolution的Discussion里面,提到一句“We use a simple optimization process to synthesize our images”,说明作者不是用的梯度迭代这种方法做的,而是一种更简单的方法,遗憾地是没有具体说是什么方法。后面紧接着提到了[Johnson 2016]年的工作,“feed-forwark neural networks can be trained to approximate this optimaization”,应该是跟这个有关系。后文有介绍。
       解答:确实是这个Johnson提出的实时计算的方法,详见后面的Real-Time Style Transfer章节。

    效率 与 思考

      1)效率肯定可以提高。
      在Image论文里,生成一张风格迁移的图像,需要1个小时,还仅仅是对[512×512]的,速度简直尴尬。国外已经有Prisma, Vinci, Artisto的商业产品了,说明速度问题被解决了,只是没公开其技术。
      2)优化可能改进。
      直接随机初始化,或者用风格图初始化,或者用待渲染图来初始化,都无法避开Gatys所讲方法中迭代更新这一步,感觉效率问题应该是在迭代渲染方法或初始化上做了巨大的改进。现有的合成逼近方法或者结构并不是唯一的估计方法,肯定还有其他方法更适合现在的场景。
      3)网络可能改进。
      另外关于网络结构,VGG都是比较庞大冗余的网络,也极有可能在网络上做了精简和适应性大调整。

    Real-Time Style Transfer

      果然有更快的合成方法,Johnson简直是神助攻,提出feed-forward方法来加快优化合成的速度(参考7)。
      基本思路:用一个已经用训练好的分类任务的CNN模型作为图像style和content-loss计算的网络,再单独设计个网络来作为生成网络,对这个生成网络单独训练;在使用时,做次数有限地迭代(一次前向计算)来生成所需图像。

    网络结构

      整个模型结构与生成网络参数如下:  

      其中,Residual-Block 是3×3Conv+BN+ReLU+3×3Conv+BN并行上identity-connect组成。
      可以看到生成图像的时间大大缩减了,将评估和生成的网络分开是重要一步,另外用Adam单独训练生成最优的估计网络是关键步骤,与我们上面对效率如何提高的思考第2点和第3点是相验证的。一句话解释:用前向网络来快速估计最优解。

    how do it

      训练生成网络如下:  

    w=argminwEx,{yi}[i=1λili(fw(x),yi)]
      其中,生成网络得到的图像y^=fw(x)x=yc,其中{yi}表示ysyc的集合。这个式子写得这么复杂,可以简化为:  
    w=argminwEyc,ys[αLstyle(fw(yc),ys)+βLcontent(fw(yc),yc)]
      训练使用数据Microsoft CoCo dataset,用lr=0.001的Adam训练了2-epoch,无权重衰减和dropout-trick,VGG-16来自参考9。
      生成图像y^=argminy[αLstyle(y,ys)+βLcontent(y,yc)+Lother]
      不同于gatys的迭代生成y^=y方法,这里是一次前向计算得到y^=y,速度提高的根本所在,一次计算即估计最优解。

    补充知识

    inner-porduct 与 Gram-Mat 与 Correlation-Mat

      举个例子,有向量x组成矩阵MRN×3,其中x1=[x1,1,x1,2,x1,3]M=[x1x2x3],可以认为是N个特征,共3个样本。
      内积x1,x1=x1x1T=[x1,1,x1,2,x1,3][x1,1x1,2x1,3]=j=13xjxj
      则Mx间的Gram-Matrix=MMT=[x1,x1x1,x2x1,x3x2,x1x2,x2x2,x3x3,x1x3,x2x3,x3]N,N
      则Mx间的Correlation-Matrix
    =[cov(x1,x1)cov(x1,x2)...cov(x1,xN)cov(x2,x1)cov(x2,x2)...cov(x2,xN).........cov(xN,x1)cov(xN,x2)...cov(xN,xN)]
    =[E[x1x¯1]E[x1x¯1]E[x1x¯1]E[x2x¯2]E[x1x¯1]E[x3x¯3]E[x2x¯2]E[x1x¯1]E[x2x¯2]E[x2x2¯]E[x2x¯2]E[x3x¯3]E[x3x¯3]E[x1x¯1]E[x3x¯3]E[x2x2¯]E[x3x¯3]E[x3x¯3]]
    对样本集的特征的协方差矩阵: