转载自 http://blog.csdn.net/yujianmin1990/article/details/79269479
好久之前就想研究下风格迁移了,很酷炫的玩法~现在主要整理下风格迁移的基本方法,高分辨率的处理,以及计算效率问题。
风格迁移
既要保留原本图片的基本内容,又想将其他喜欢的绘画风格叠加上来,就像下面的例子:
what is texture of a image?
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(详见补充),定义如下:
Gatys发现,Gram-Mat能够递进地表达Texture-Character,下图为例:
如果有两张图 x x 是原始图像,是生成图像, 如何表示texture上的距离呢?现定义如下的平方差距离如下:
El E l 对 Fl^i,j F l ^ i , j 计算梯度如下:
注意:风格上的差异需要多层来共同定义。
注意:梯度那里 if F<0, ∂=0 i f F < 0 , ∂ = 0 是由于ReLU做激活函数。
注意:Image论文里的Style/Content-Reconstruction是分别对feature-map和Gram-Mat正向估计出来的。
如何描述一张图的图片内容
新生成的图还要保留原本的内容大体不变,那就需要图片内容表示方法,并且定义图像间内容上的差距。
feature-map本身就表示了图像在不同层上的内容,虽然它描述了图像许多维特性,但是不妨碍我们将其作为内容的主要描述方式。
对两张图片上内容的差距定义为平方差的形式如下:
注意:在Image论文里的Fig. 1,图中下侧的”Content Reconstructions”不是反卷积(转置卷积)反向计算得到的,而是用 正向估计的方法估计出来的。为什么要这么搞呢,当时反卷积已经面世了,还要这么蛋疼地正向估计,猜测是跟作者想要说明的一个小结论有关系,在图Fig.1下的注释里,有句话说“层越深,像素细节越被丢掉,但是更高维的内容信息留下了”,用反向卷积对这个小结论可能不利吧,也可能再写个反卷积麻烦,猜的。
怎么做风格的调优优化
这个就是怎么权衡内容和风格了,整体优化目标如下:
Image论文里 仅用一个网络结构VGG-19(稍微调整结构),描述内容和风格距离的网络是用分类任务训练好的网络(参数固定), 生成网络用来不断调整输入,以便生成图像 x̂ :=x̂ −lr∗∂Ltotal∂x̂ x ^ := x ^ − l r ∗ ∂ L t o t a l ∂ x ^ 在内容上接近原图,在风格上接近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,如下:
单个输入在单个隐层上的texture的差距: Esl=∑i,j(Ĝ si,j−Gsi,j)2 E l s = ∑ i , j ( G ^ i , j s − G i , j s ) 2
多个输入在多个隐层上的texture的差距: Lstyle(x̂ ,x)=∑Ss=0vs∑L−1l=0wlEsl L s t y l e ( x ^ , x ) = ∑ s = 0 S v s ∑ l = 0 L − 1 w l E l s
在训练的时候,将Gatys训练方法的 Lstyle L s t y l e 替换为pyramid-texture-representation形式的,其中 vs v s 和 wl w l 都是选择性权重(内部值非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]
[
512
×
512
]
的,速度简直尴尬。国外已经有Prisma, Vinci, Artisto的商业产品了,说明速度问题被解决了,只是没公开其技术。
2)优化可能改进。
直接随机初始化,或者用风格图初始化,或者用待渲染图来初始化,都无法避开Gatys所讲方法中迭代更新这一步,感觉效率问题应该是在迭代渲染方法或初始化上做了巨大的改进。现有的合成逼近方法或者结构并不是唯一的估计方法,肯定还有其他方法更适合现在的场景。
3)网络可能改进。
另外关于网络结构,VGG都是比较庞大冗余的网络,也极有可能在网络上做了精简和适应性大调整。
Real-Time Style Transfer
果然有更快的合成方法,Johnson简直是神助攻,提出feed-forward方法来加快优化合成的速度(参考7)。
基本思路:用一个已经用训练好的分类任务的CNN模型作为图像style和content-loss计算的网络,再单独设计个网络来作为生成网络,对这个生成网络单独训练;在使用时,做次数有限地迭代(一次前向计算)来生成所需图像。
网络结构
整个模型结构与生成网络参数如下:
可以看到生成图像的时间大大缩减了,将评估和生成的网络分开是重要一步,另外用Adam单独训练生成最优的估计网络是关键步骤,与我们上面对效率如何提高的思考第2点和第3点是相验证的。一句话解释: 用前向网络来快速估计最优解。
how do it
训练生成网络如下:
生成图像: ŷ =argminy[αLstyle(y,ys)+βLcontent(y,yc)+Lother] y ^ = a r g m i n y [ α L s t y l e ( y , y s ) + β L c o n t e n t ( y , y c ) + L o t h e r ]
不同于gatys的迭代生成 ŷ =y∗ y ^ = y ∗ 方法,这里是一次前向计算得到 ŷ =y∗ y ^ = y ∗ ,速度提高的根本所在,一次计算即估计最优解。
补充知识
inner-porduct 与 Gram-Mat 与 Correlation-Mat
举个例子,有向量
x
x
组成矩阵,其中
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
的间的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
的间的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是协方差的简略版,作用一致。
Pyramid-Method的图像处理应用举例
参考
- 《2015-A Neural Algorithm of Artistic Style》
- 《2016-Image Style Transfer Using Convolutional Neural Networks》
- 《2015-Texture Synthesis Using Convolutional Neural Networks》
- 《2017-High-Resolution Multi-Scale Neural Texture Synthesis》
- 《1984-Pyramid Methods in Image Process》
- 《2006-Pyramid Methods in GPU-Based Image Processing》
- 《2016-Perceptual Losses for Real-Time Style Transfer and Super-Resolution》
- 《2016-Perceptual Losses for Real-Time Style Transfer and Super-Resolution:Supplementary Material》
- 《2014-Very deep convolutional networks for large-scale image recognition》