神经风格迁移(Neural Style Transfer)简介

这是对一个Neural Style Transfer project的总结,GitHub链接是:戳我

神经风格迁移是将一幅图片的内容和另一幅艺术图片的风格结合,生成一张艺术化的图片的过程。输入是一张内容图和一张风格图,输出是风格化的结果。

神经风格迁移的两大关键分别是风格表征和图像重建。

风格表征,顾名思义,就是用什么方法来提取风格、表示风格,如何建立模型(也叫纹理建模)。根据Yongcheng Jing et al. [1]总结,大体分两类:基于统计的参数化纹理建模和基于MRF(Markov Random Fields)的非参数化纹理建模。

图像重建则是用特定的特征来重建出一张图像,也可以主要依据重建速度分为两大类:基于在线图像优化的慢速图像重建方法和基于离线模型优化的快速图像重建方法。

根据风格表征和图像重建的方法不同,风格迁移大体可分为四类,具体我不对每一类进行介绍了,大家有兴趣可以移步这篇论文[1],或者阅读这篇文章的中文精简版

我们这个project实现的方法属于Gatys et al.也就是风格迁移鼻祖的基于统计的参数化纹理建模以及在线图像优化的慢速方法,在这个基础上又增添了多种风格迁移、保留颜色迁移、以及引入拉普拉斯算子来提升风格化图像质量等方法。

这个算法的核心思想是建立在此之上的:先将图像经过预训练的VGG网络,提取feature map。对于输入的内容图片提取的特征P和对于输出的结果图片提取的特征F来说,我们用上标l表示第l层,用下标j表示位置,下标i表示第i个filter的activation,则可以用F^l_{ij}P^l_{ij}的距离来衡量他们的相似程度(内容相似),这样得到内容损失L_{content}

而对于风格的表示我们也是先用VGG提取特征F,然后在这上面计算Gram矩阵,这个其实就是feature的二阶统计量,得到的结果可以看作纹理的表示。对于第l层的feature F^l来说,我们用F^l_{ij}来表示第lj位置上第i个filter的activation,而其Gram矩阵可以这样计算:

G^l_{ij} = \sum_{k}{F^l_{ik}F^l_{jk}}

然后对于输入的风格图片和输出的结果图片,我们分别求他们的Gram矩阵,用他们的距离来衡量风格上的相似,这样得到风格损失L_{style}

我们把总损失定义为内容损失与风格损失,在实际应用中在加入变分TV项对结果平滑,就可以依据此损失来不断更新生成的输出图片,以让总损失减小,即图片和内容图片和风格图片更接近,最终即可重建风格化图像。

我们的project还加入了几个功能。

一、多重风格迁移

这个很简单,如果有多重风格图片的话,我们把风格损失定义为每个风格的加权即可:

L_{multi} = \sum_{i=1}^{n}w_{i}L_{style}(x,p_i)

其中x是输出的风格化结果,p_i是第i张输入的风格图片。

二、保留颜色风格迁移

保留风格迁移是指,输出的风格化图片保留了内容图片的内容和颜色,但依然有风格图片的风格。实现方法也分Color Histogram Matching和Luminance-only Transfer两种,我们采用第二种,因为它能更好的保留内容图片的颜色。

我们首先把图片从RGB通道转化成YUV通道,其中Y通道代表luminance而U和V通道代表颜色信息。所以我们可以对风格图片的Y通道上求风格损失,对内容图片的U和V通道上求内容损失,这样得到的输出结果就保留了内容图片的颜色。

三、引入拉普拉斯算子的风格迁移

我们在计算内容损失的时候,用的是CNN网络提取的特征,然而其实这些特征是属于high-level representation,主要是捕捉了内容图片的语音信息,这样便不可避免的损失了一些low-level的细节信息,比如纹理、基本结构。因此得到的结果图片会有一些irregular的扭曲和形变。为了减少这些artifact并且更好的保留内容图片的细节,可以引入拉普拉斯损失项来解决这个问题。

拉普拉斯损失是这样计算的:对于输入的内容图片p和结果图片x,我们把他们对应的拉普拉斯filter responseD(p)D(x)求距离,用这个距离当作拉普拉斯损失,并把这一项加入到总损失里。注意到我们的拉普拉斯损失是在图片本身的像素空间得到的,这样就可以捕捉到图片的low-level information。由于拉普拉斯算子对噪声极其敏感,所以我们在对图片加上拉普拉斯filter之前先通过一层p\times p的pooling layer,这样既起到了平滑的作用,又节省了空间。p的大小不同的pooling layer,能够capture不同规模的结构信息,所以也可以将k个不同大小的pooling layer作用在图片上,得到k个拉普拉斯损失,然后加权在一起,就可以保留内容图片不同scale的细节信息。

参考:https://mp.weixin.qq.com/s/iV-OXiKF1jgAhSmX4QUIXw

           https://zhuanlan.zhihu.com/c_185430820

           https://arxiv.org/abs/1705.04058v4

猜你喜欢

转载自blog.csdn.net/qq_23141851/article/details/81155678