4

深度学习(十六)——Style Transfer(2)

 2 years ago
source link: http://antkillerfarm.github.io/dl/2017/09/09/Deep_Learning_16.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Style Transfer

DL方法(续)

在第一篇论文中,Gatys使用Gramian matrix从各层CNN中提取纹理信息,于是就有了一个不用手工建模就能生成纹理的方法。

Gramian matrix(由Jørgen Pedersen Gram提出)中的元素定义如下:

Gij=⟨vi,vj⟩

这里的vi表示向量,Gij是向量的内积。可以看出Gramian matrix是一个半正定的对称矩阵。

在第二篇论文中,Gatys更进一步指出:纹理能够描述一个图像的风格。

既然第一篇论文解决了从图片B中提取纹理的任务,那么还有一个关键点就是:如何只提取图片内容而不包括图片风格?

Cost Function

神经风格迁移生成图片G的cost function由两部分组成:C与G的相似程度和S与G的相似程度。

J(G)=α⋅Jcontent(C,G)+β⋅Jstyle(S,G)

其中,α,β是超参数,用来调整Jcontent(C,G)与Jstyle(S,G)的相对比重。

神经风格迁移的基本算法流程是:首先令G为随机像素点,然后使用梯度下降算法,不断修正G的所有像素点,使得J(G)不断减小,从而使G逐渐有C的内容和S的风格,如下图所示:

换句话来说就是:每次迭代只更新图片G,而不更新网络的参数。

我们先来看J(G)的第一部分Jcontent(C,G),它表示内容图片C与生成图片G之间的相似度。

使用的CNN网络是之前预训练好的模型,例如Alex-Net。C,S,G共用相同模型和参数。

首先,需要选择合适的层数l来计算Jcontent(C,G)。

如前所述,CNN的每个隐藏层分别提取原始图片的不同深度特征,由简单到复杂。如果l太小,则G与C在像素上会非常接近,没有迁移效果;如果l太深,则G上某个区域将直接会出现C中的物体。因此,l既不能太浅也不能太深,一般选择网络中间层。

若C和G在l层的激活函数输出a[l](C)与a[l](G),则相应的Jcontent(C,G)的表达式为:

Jcontent(C,G)=12||a[l](C)−a[l](G)||2

接下来,我们定义图片的风格矩阵(style matrix)为:

Gkk′[l]=∑i=1nH[l]∑j=1nW[l]aijk[l]aijk′[l]

风格矩阵Gkk′[l]计算第l层隐藏层不同通道对应的所有激活函数输出和。若两个通道之间相似性高,则对应的Gkk′[l]较大。从数学的角度来说,这里的风格矩阵实际上就是两个tensor的互相关矩阵,也就是上面提到的Gram矩阵。

Gram矩阵描述的是全局特征的自相关,如果输出图与风格图的这种自相关相近,那么差不多是我们所理解的”风格”。当然,其实也可以用很多其他的统计信息进行描绘风格。比如有用直方图的, 甚至还可以直接简化成”均值+方差”的。

风格矩阵Gkk′[l][S]表征了风格图片S第l层隐藏层的“风格”。相应地,生成图片G也有Gkk′[l][G]。那么,Gkk′[l][S]与Gkk′[l][G]越相近,则表示G的风格越接近S。这样,我们就可以定义出Jstyle[l](S,G)的表达式:

Jstyle[l](S,G)=1(2nH[l]nW[l]nC[l])∑k=1nC[l]∑k′=1nC[l]||Gkk′[l][S]−Gkk′[l][G]||2

为了提取的“风格”更多,也可以使用多层隐藏层,然后相加,表达式为:

Jstyle(S,G)=∑lλ[l]⋅Jstyle[l](S,G)

这是原始论文的插图,其符号表示和本文有所差异。其中的A、F、P各层的output,都是使用预训练好的Alex-Net生成的。

可以看出A和P,在整个迭代过程中,只需要进行一次Alex-Net的前向计算,因此可以事先计算好。

为了在迭代过程中,不修改Alex-Net的权重,而只修改F,我们可以使用tf.constant来创建Alex-Net的各个参数,进而建立Alex-Net。这样在backward的时候,梯度就只会修正到tf.Variable,也就是F上。

Gatys的方法虽然是里程碑式的进步,但仍然有如下缺点:

1.渲染速度缓慢。渲染一张图片需要从随机噪声开始,反复迭代若干次,才能得到最终的结果。

2.需要根据风格的不同,调整不同的超参数。换句话说,就是一个Style Transfer的模型就只能用于转换一种Style,通用型不强。

因此,之后的研究主要集中在对这两方面的改进上。针对前者的改进可称作fast style transfer,而后者可称作Universal Style Transfer

此外,不是所有的style transfer都是DL方法,很多新特效往往还是用传统的滤镜实现的。比如最近比较火的“新海诚风格”。

https://blog.csdn.net/Trent1985

一个滤镜/美颜方面的blog

https://www.zhihu.com/question/29594460

新海诚风格的画面是手绘的还是Photoshop就可以达到的?后期过程是怎样的?

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

这篇论文属于fast style transfer类的改进。它是Skolkovo Institute of Science and Technology & Yandex的Dmitry Ulyanov的作品。

Dmitry Ulyanov的个人主页:

https://dmitryulyanov.github.io

Skolkovo位于莫斯科郊外,相当于俄国的硅谷。

https://github.com/DmitryUlyanov/texture_nets

上图是该论文提出的网络结构,其中包括了两个部分:

1.descriptor network(以下简称D网络)。这部分的使用方法和Gatys方法基本一致:风格图片过一下预训练好的Alex-Net来生成纹理特征P。

2.论文的主要创新点在于generator network(以下简称G网络)。

1)假设有一批图片A,通过G网络得到了风格图片G(A)。

2)G(a)和a做比较得到content loss,G(A)和P做比较得到style loss。

3)迭代优化上述两个loss,得到训练好的G网络。

4)Inference时,直接将图片a输入G网络,就得到了风格变换后的图片G(a)。

Perceptual Losses for Real-Time Style Transfer and Super-Resolution

这篇论文是李飞飞组的Justin Johnson的作品。

Justin Johnson的个人主页:

https://cs.stanford.edu/people/jcjohns/

https://github.com/OlavHN/fast-neural-style

https://github.com/lengstrom/fast-style-transfer/

可以看出该论文的方法和Texture Networks基本一致,差别仅在于generator network和descriptor network的结构,略有不同而已。这里不再赘述。

https://blog.csdn.net/Hungryof/article/details/61195783

超越fast style transfer—任意风格图和内容图0.1秒出结果

https://zhuanlan.zhihu.com/p/35798776

快速风格迁移(fast-style-transfer)

原版的neural style是用Gram矩阵来进行匹配风格,但是也有用其他的。例如:

MRF loss(ombining markov random fields and convolutional neural networks for image synthesis.)

Adversarial loss(C. Li and M. Wand. Precomputed real-time texture synthesis with markovian generative adversarial networks. In ECCV,2016)

梯度直方图(P. Wilmot, E. Risser, and C. Barnes. Stable and controllable neural texture synthesis and style transfer using histogram losses. arXiv preprint arXiv:1701.08893 , 2017)

ResNet + Style transfer

Style transfer的CNN bone也是有讲究的,除了AlexNet之外,还可以使用VGG,但是它在ResNet上效果不佳。直到最近的论文才对这一现象有所解释。

https://mp.weixin.qq.com/s/Pub83W6nMM02lEIrsBe49Q

谁说只有VGG才能做风格迁移,ResNet也可以!

Style transfer的其他用法

使用VGG抽取的所谓纹理信息,也可以用于图像增强领域。具体的做法是将纹理信息作为Loss的一部分。(注意不是Loss的全部,否则就只是Style transfer了)。

文本风格迁移

不光图像、语音有风格迁移,文本也有。

下面是一个金庸风格的例子

Input:谢谢
Output(金庸):多谢之至

Input:再见
Output(金庸):别过!

Input:请问您贵性?
Output(金庸):请教阁下尊姓大名?

https://mp.weixin.qq.com/s/7nvqifY_J34mWEUM5IUsLQ

NLP文本风格迁移

https://zhuanlan.zhihu.com/p/26746283

图像风格迁移(Neural Style)简史

https://mp.weixin.qq.com/s/64H2dDcaTcKdKaOnwdsoEg

基于深度学习的艺术风格化研究

https://blog.csdn.net/red_stone1/article/details/79055467

人脸识别与神经风格迁移

https://blog.csdn.net/cicibabe/article/details/70885715

卷积神经网络图像风格转移

https://blog.csdn.net/stdcoutzyx/article/details/53771471

图像风格转换(Image style transfer)

https://blog.csdn.net/u011534057/article/details/78935202

风格迁移学习笔记(1):Multimodal Transfer: A Hierarchical Deep Convolutional Neural Network for Fast

https://blog.csdn.net/u011534057/article/details/78935230

风格迁移学习笔记(2):Universal Style Transfer via Feature Transforms

https://mp.weixin.qq.com/s/l3hQCQWh5NgihzTs2A049w

风格迁移原理及tensorflow实现

https://mp.weixin.qq.com/s/5Omfj-fYRDt9j2VZH1XXkQ

如何用Keras打造出“风格迁移”的AI艺术作品

https://mp.weixin.qq.com/s/4q-9QsXD04mD-f2ke7ql8A

tensorflow风格迁移网络训练与使用

https://blog.csdn.net/hungryof/article/details/53981959

谈谈图像的Style Transfer(一)

https://blog.csdn.net/Hungryof/article/details/71512406

谈谈图像的style transfer(二)

https://mp.weixin.qq.com/s/8Fz6Q-6VgJsAko0K7HDsow

一个模型搞定所有风格转换,直接在浏览器实现(demo+代码)

https://github.com/cysmith/neural-style-tf

TensorFlow (Python API) implementation of Neural Style.这个项目实现了两张图片的画风融合,非常牛。

https://github.com/jinfagang/pytorch_style_transfer

这个和上面的一样,不过是用pytorch实现的。

https://mp.weixin.qq.com/s/g1hpuzH36j_rbYR23Mwx0w

开源图像风格迁移,快看看大画家的潜力股

https://mp.weixin.qq.com/s/OzancX-44Si13ZtZiONnpQ

基于感知损失的实时风格迁移与超分辨率重建

https://mp.weixin.qq.com/s/yr9fNyzpOBt7dLsnh2T2xg

使用TFLite在移动设备上优化与部署风格转化模型


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK