深度学习之风格迁移

最近一年,各种P图应用出现了众多新的玩法,其中很重要的一种就是风格迁移(Style Transfer),例如可以将下面左图转换为后面两幅风格不同的图片

其背后的原理是什么呢?

这是一种基于卷积神经网络(CNN)的迁移学习方法:

输入为一张原始图片(例如用户的一张照片),以及一张想要模仿其风格的图片(例如梵高的《星空》,或者蒙克的《呐喊》等)。

目标是生成这样一张图片:内容上与用户照片相近,而风格上与艺术画作相近。

问题是,如何保留照片的内容,又如何衡量风格是否相近呢?

这与卷积神经网络的特点有关。CNN中,靠近输入的网络层,学到的是一些纹理、边缘方面的特征,越到后面,学到的越接近于内容,到了最后一层,基本就剩下照片的类别了,如猫、狗等。因此,可以使用后面某一层的输出作为照片内容的衡量,而使用前面的层作为风格的衡量。

此外,对风格的衡量比较具有主观性,有不同的衡量方法来保留不同的风格,通常的做法就是从每一层中抽取一定的信息,作为风格的代表。

快速迁移算法

简单的风格迁移,可以使用类似于Deep Dream的方法,将CNN冻结,将图片作为待学习的参数,使用梯度下降进行学习。只不过,这里的目标不再是最大化某个神经元的激活,而是最小化与用户照片内容的距离,同时最小化与艺术绘画风格之间的距离

然而这种方法是比较缓慢的,这是因为它把生成图片的过程当做一个“训练”的过程。每生成一张图片,都相当于要训练一次模型,这中间可能会迭代几百几千次。

可以通过下面所示的流程图来加速迁移过程

左半部分是一个残差网络,用来将输入图片

x

映射为一张新的图片y,此网络是需要进行训练的。

右半部分是一个误差网络,此网络是在ImageNet数据集上预先训练好的,此处展示的是VGG-16网络。此处将三张图片(残差网络的输出图片、艺术绘画图片、用户照片)依次输入进去,然后:

如蓝色线和黑色线所示,计算内容相似度

如红色线和黑色线所示,计算风格相似度

然后将两个相似度相加,得到最终的目标函数。接下来就可以反向传播回y,进一步的传播回左半部分,最终更新输入图片

x

,完成一轮迭代。

这样,一旦左半部分的残差网络训练完毕,实际使用的时候就不再需要迭代了,只需要将图片

x

输入网络,取得输出的图片y即可。

下面是一些实际迁移的图片

原始图片

迁移了《呐喊》的风格

迁移了《星空》的风格

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180124A0203L00?refer=cp_1026

扫码关注云+社区