总说
最近更新:17-5-9 增加Neural style使用Gram矩阵的前提工作
其实这个方向火起来是从2015年Gatys发表的一篇文章 A Neural Algorithm of Artistic Style, 当然了,当时新闻报道还是很标题党的,看的我热血沸腾。。言归正传,虽然只过了短短一年多,但是相关的论文已经有二三十篇了,这些论文在原有的基础上进行了极大的扩展。从最初的Neural Style,到Ulyanov的Texture Networks: Feed-forward Synthesis of Textures and Stylized Images以及李飞飞老师的Perceptual Losses for Real-Time Style Transfer and Super-Resolution。 一般来说主要就是这3篇,后面两篇是差不多的,都是将原来的求解全局最优解问题转换成用前向网络逼近最优解,原版的方法每次要将一幅内容图进行风格转换,就要进行不断的迭代,而后两篇的方法是先将其进行训练,训练得到前向生成网络,以后再来一张内容图,直接输入到生成网络中,即可得到具有预先训练的风格的内容图。 除了这3篇主要的,还有就是将style transfer应用到视频中的,以及一些在改变Gram矩阵的,还有其他很多。这里只写其中某几篇。
下面是最初版本的效果图
Prisma上的一些图片,用的应该是改进版本的方法
额,别跟我提新海诚滤镜,能把人变成二次元?我直接呵呵。你用多了就知道,它的天空就是直接从原著漫画中截取的,就几种,根本不管你现实中有没有云彩。试用“新海诚风”滤镜后 我忍不住戳穿了它。 原理的话,自己百度一下“新海诚滤镜特效的实现解密”就可以了。在此不做评论。
说一下Neural style的工作用Gram的前些工作
在neural style出来之前,Gatys还做了这个工作Texture Synthesis Using Convolutional Neural
Networks,他们发现如果让隐藏层的特征用协方差来进行进行约束,可以得到较好的纹理生成。
他们发现如果用协方差(也就是Gram矩阵)来进行约束隐藏层特征的话,重建出来的特征虽然有些会保持,但是有些可能位置会打散。比如最右侧的一张图,人还是人,但是重建出来相当于“拼图”效果了。这是因为协方差本身就是去除了位置信息。 那么既然协方差可以用于纹理生成,那么如果我们加上 “让生成图的隐藏层特征与原图尽量一样,另一方面让生成图的打散特征与画的打散特征尽量相似”,这就是用神经网络做风格转换的最初想法。这也比较符合“风格”的定义,毕竟风格不应该具有位置信息,一种风格应该是与位置无关的。
注意:Gatys的几篇论文没有解释为什么用Gram矩阵, 其实可以这样认为, 协方差就是一种二阶统计信息, 我们要求输出图的什么信息与风格图相近, 肯定不是feature map上单纯的逐点的相近, Gram矩阵描述的就是全局特征的自相关, 如果输出图与风格图的这种自相关相近, 那么差不多是我们所理解的”风格”. 当然, 其实也可以用很多其他的统计信息进行描绘风格. 这也就是后面有用直方图的, 甚至直接简化成”均值+方差”进行描绘风格的.
A Neural Algorithm of Artistic Style
下面约定 p p 为风格图,
为待转换的图,即内容图。比如 p p 为某张梵高的画,
为某个场景,生成为 f f ,即具有梵高的画的风格的场景图。首先定义两个损失,
和 lcontent l c o n t e n t ,前者希望 f f 和
在“风格”上尽量一致,后者则希望 f f 与
在内容上尽量一致。
上式子的 α α 和 β β 为两个损失的平衡参数。我们希望 l l 尽量小,采用梯度下降即可优化。所用的CNN网络是VGG-19。开始训练时,随机生成 同等大小的随机噪声图 x x ,通过指定不同的层作为content损失的提取层 以及style损失的提取层 Ls L s ,使得 x x 在 层得到的内容损失 lcontent(Lc,x) l c o n t e n t ( L c , x ) 与 lcontent(Lc,a) l c o n t e n t ( L c , a ) 尽量一样。同时,使得 x x 在 层得到的风格损失 lstyle(Ls,x) l s t y l e ( L s , x ) 与 lstyle(Ls,p) l s t y l e ( L s , p ) 也尽量一样。其中