好久之前就想研究下风格迁移了,很酷炫的玩法~现在主要整理下风格迁移的基本方法,高分辨率的处理,以及计算效率问题。
既要保留原本图片的基本内容,又想将其他喜欢的绘画风格叠加上来,就像下面的例子:
texture of image是描述图像风格的纹理脉络,具有很强的同质性和规律性。
参考文献1,2,3都是Gatys的文章,提出了texture representation的方法。
卷积网络的feature-map在分类任务中学习了图像的深层特征,在上篇博文CNN的隐层可视化中已经讲解了不少关于隐层的特征特性。这些feature-map如何表示图像的纹理特性呢?
对某一隐层而言,假设有 Nl N l 个channel的feature-map,每个map的 size=Ml=height×width s i z e = M l = h e i g h t × w i d t h ,那么每两个channel间都计算各inner-production,再累和作为本层的Texture表示矩阵,数学上称之为Gram matrix(详见补充),定义如下:
新生成的图还要保留原本的内容大体不变,那就需要图片内容表示方法,并且定义图像间内容上的差距。
feature-map本身就表示了图像在不同层上的内容,虽然它描述了图像许多维特性,但是不妨碍我们将其作为内容的主要描述方式。
对两张图片上内容的差距定义为平方差的形式如下:
这个就是怎么权衡内容和风格了,整体优化目标如下:
上述风格迁移的方法,有两个重要的缺陷:
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,如下:
为了说明本方法能抓住更大尺度上的texture信息,做了如下对比:
详见参考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] [ 512 × 512 ] 的,速度简直尴尬。国外已经有Prisma, Vinci, Artisto的商业产品了,说明速度问题被解决了,只是没公开其技术。
2)优化可能改进。
直接随机初始化,或者用风格图初始化,或者用待渲染图来初始化,都无法避开Gatys所讲方法中迭代更新这一步,感觉效率问题应该是在迭代渲染方法或初始化上做了巨大的改进。现有的合成逼近方法或者结构并不是唯一的估计方法,肯定还有其他方法更适合现在的场景。
3)网络可能改进。
另外关于网络结构,VGG都是比较庞大冗余的网络,也极有可能在网络上做了精简和适应性大调整。
果然有更快的合成方法,Johnson简直是神助攻,提出feed-forward方法来加快优化合成的速度(参考7)。
基本思路:用一个已经用训练好的分类任务的CNN模型作为图像style和content-loss计算的网络,再单独设计个网络来作为生成网络,对这个生成网络单独训练;在使用时,做次数有限地迭代(一次前向计算)来生成所需图像。
整个模型结构与生成网络参数如下:
训练生成网络如下:
举个例子,有向量 x x 组成矩阵 M∈RN×3 M ∈ R N × 3 ,其中 x1=[x1,1,x1,2,x1,3] x 1 = [ x 1 , 1 , x 1 , 2 , x 1 , 3 ] , M=⎡⎣⎢x1x2x3⎤⎦⎥ M = [ x 1 x 2 x 3 ] ,可以认为是N个特征,共3个样本。
内积 ⟨x1,x1⟩=x1xT1=[x1,1,x1,2,x1,3]⎡⎣⎢x1,1x1,2x1,3⎤⎦⎥=∑3j=1xjxj ⟨ x 1 , x 1 ⟩ = x 1 x 1 T = [ x 1 , 1 , x 1 , 2 , x 1 , 3 ] [ x 1 , 1 x 1 , 2 x 1 , 3 ] = ∑ j = 1 3 x j x j
则 M M 的 x x 间的Gram-Matrix =M∗MT=⎡⎣⎢⟨x1,x1⟩⟨x2,x1⟩⟨x3,x1⟩⟨x1,x2⟩⟨x2,x2⟩⟨x3,x2⟩⟨x1,x3⟩⟨x2,x3⟩⟨x3,x3⟩⎤⎦⎥N,N = M ∗ M T = [ ⟨ x 1 , x 1 ⟩ ⟨ x 1 , x 2 ⟩ ⟨ x 1 , x 3 ⟩ ⟨ x 2 , x 1 ⟩ ⟨ x 2 , x 2 ⟩ ⟨ x 2 , x 3 ⟩ ⟨ x 3 , x 1 ⟩ ⟨ x 3 , x 2 ⟩ ⟨ x 3 , x 3 ⟩ ] N , N
则 M M 的 x x 间的Correlation-Matrix:
=⎡⎣⎢⎢⎢⎢cov(x1,x1)cov(x2,x1)...cov(xN,x1)cov(x1,x2)cov(x2,x2)...cov(xN,x2)............cov(x1,xN)cov(x2,xN)cov(xN,xN)⎤⎦⎥⎥⎥⎥ = [ c o v ( x 1 , x 1 ) c o v ( x 1 , x 2 ) . . . c o v ( x 1 , x N ) c o v ( x 2 , x 1 ) c o v ( x 2 , x 2 ) . . . c o v ( x 2 , x N ) . . . . . . . . . c o v ( x N , x 1 ) c o v ( x N , x 2 ) . . . c o v ( x N , x N ) ]
=⎡⎣⎢E[x1−x¯1]E[x1−x¯1]E[x2−x¯2]E[x1−x¯1]E[x3−x¯3]E[x1−x¯1]E[x1−x¯1]E[x2−x¯2]E[x2−x¯2]E[x2−x2¯]E[x3−x¯3]E[x2−x2¯]E[x1−x¯1]E[x3−x¯3]E[x2−x¯2]E[x3−x¯3]E[x3−x¯3]E[x3−x¯3]⎤⎦⎥ = [ E [ x 1 − x ¯ 1 ] E [ x 1 − x ¯ 1 ] E [ x 1 − x ¯ 1 ] E [ x 2 − x ¯ 2 ] E [ x 1 − x ¯ 1 ] E [ x 3 − x ¯ 3 ] E [ x 2 − x ¯ 2 ] E [ x 1 − x ¯ 1 ] E [ x 2 − x ¯ 2 ] E [ x 2 − x 2 ¯ ] E [ x 2 − x ¯ 2 ] E [ x 3 − x ¯ 3 ] E [ x 3 − x ¯ 3 ] E [ x 1 − x ¯ 1 ] E [ x 3 − x ¯ 3 ] E [ x 2 − x 2 ¯ ] E [ x 3 − x ¯ 3 ] E [ x 3 − x ¯ 3 ] ]
对样本集的特征的协方差矩阵:
=13⎡⎣⎢⎢⎢∑3j=1(x1,j−x¯1)(x1,j−x¯1)∑3j=1(x2,j−x¯2)(x1,j−x¯1)∑3j=1(x3,j−x¯3)(x1,j−x¯1)∑3j=1(x1,j−x¯1)(x2,j−x¯2)∑3j=1(x2,j−x¯2)(x2,j−x¯2)∑3j=1(x3,j−x¯3)(x2,j−x¯2)∑3j=1(x1,j−x¯1)(x3,j−x¯3)∑3j=1(x2,j−x¯2)(x3,j−x¯3)∑3j=1(x3,j−x¯3)(x3,j−x¯3)⎤⎦⎥⎥⎥ = 1 3 [ ∑ j = 1 3 ( x 1 , j − x ¯ 1 ) ( x 1 , j − x ¯ 1 ) ∑ j = 1 3 ( x 1 , j − x ¯ 1 ) ( x 2 , j − x ¯ 2 ) ∑ j = 1 3 ( x 1 , j − x ¯ 1 ) ( x 3 , j − x ¯ 3 ) ∑ j = 1 3 ( x 2 , j − x ¯ 2 ) ( x 1 , j − x ¯ 1 ) ∑ j = 1 3 ( x 2 , j − x ¯ 2 ) ( x 2 , j − x ¯ 2 ) ∑ j = 1 3 ( x 2 , j − x ¯ 2 ) ( x 3 , j − x ¯ 3 ) ∑ j = 1 3 ( x 3 , j − x ¯ 3 ) ( x 1 , j − x ¯ 1 ) ∑ j = 1 3 ( x 3 , j − x ¯ 3 ) ( x 2 , j − x ¯ 2 ) ∑ j = 1 3 ( x 3 , j − x ¯ 3 ) ( x 3 , j − x ¯ 3 ) ]
就如PCA分解所讲,协方差是为了描述两个变量间的线性相关情况(线性相关性的分子部分是协方差)。我们更关注的是特征间的关系,在同层内feature-map是特征,所以对channel做相互间的协方差。
注意,有的地方计算协方差不是除以3,而是除以(3-1),这样是无偏估计,但是在这里并不影响计算结果。
发现,Gram-Mat和Correlation-Mat之间的区别是,去中心 −x¯ − x ¯ 的动作,可以认为Gram-Mat是协方差的简略版,作用一致。