神经网络风格转移

什么是风格转移

就是输入两张图像,一张是内容图像C,一张是风格图像S,我们希望生成一张新的图像G,使得新图像G同时具备C的内容和S的风格。如下图,生成的图像内容还是建筑和河流,但是画风变成了梵高的油画。

代价函数

生成的图像G既要和C的内容相近,又要和S的风格相近,因此代价函数由两部分组成,即内容代价函数和风格代价函数,分别表征内容相近程度和风格相近程度,即

[J=alpha J_C(C, G) + eta J_S(S, G) ]

(alpha)(eta)是两个超参数,表示两个代价函数的比重。实际上一个超参数就足够了,可以把其中一个固定,调节另一个即可。

内容代价函数是生成图像和内容图像特征图的差值,定义如下:

[J_{C, l}=frac{1}{HWC}Sigma_{i=1}^{H}Sigma_{j=1}^{W}Sigma_{c=1}^{C}(FC_{i,j,c,l}-FG_{i,j,c,l})^2 ]

公式中,l表示第l层卷积层,H, W, C分别表示该卷积层特征图的高、宽、通道数。

风格代价函数也是通过特征图得到的,但是它计算不是特征图的直接差值,而是gram matrix的差值。对于一个卷积层,gram matrix (GM)的定义如下:

[GM_{i,j}^{l}=Sigma_{k=1}^{M*N}F_{i,k}F_{k,j} ]

(GM_{i,j}^{l})表示第l层特征图的第i个通道和第j个通道之间的相关性。由于不同通道代表的是不同的文理或者颜色,因此不同通道之间的相关性矩阵,即gram matrix可以用来表示图像的风格。两张图像的gram matrix之差,即表示二者的风格之差。因此,风格代价函数的定义如下:

[J_{S,l}=frac{1}{4N^2M^2}(GM_S^l-GM_G^l)^2 ]

公式中,N, M表示gram matrix的尺寸,实际上N, M等于该层特征图的数量。

Gatys的风格转移方法

Gatys第一次通过神经网络的方法实现了风格转移,并且给出了风格的数学定义(即如上所述)。他的方法是先随机生成一张噪声图片,然后通过不断训练来调整噪声图片上的像素值,得到最后的生成图像G。训练过程中,固定神经网络的权值不变(采用预训练模型),通过梯度下降法来更新噪声图像的像素值。由于这种方法每次都需要对噪声图像进行训练,计算量大,因此速度很慢,不能做到实时。

快速神经风格转移

这项工作由Dmitry Ulyanov和Justin Johnson分别独立完成,整个网络架构和GAN有颇多相似之处,如下图。

该架构由两个网络构成,前面为风格转移网络,用于将输入图像生成为固定风格的图像,后面为损失网络,用于评估生成图像的损失函数值。损失函数的定义任然是内容损失函数和风格损失函数的加权求和。不同于Gatys的方法,该架构输入的是内容图像,由风格转移网络直接输出生成图像,从而不用每次都做反向传播,只需要做一次feedforward就行了,因此速度很快,可以做到实时。在用于生成某种风格的图像之前,需要先进行训练。训练时,损失网络保持固定,只训练风格转移网络。

从BN到Instance Normalization

在提出了新的架构之后,Dmitry Ulyanov任然对结果不满意,于是找到了一个简单有效的改进方法。在风格转移网络中有BN(Batch Normalization)层,它的作用是用来对batch内的图像的特征图做特征归一化的。要做归一化,就要计算batch内特征图的平均值和方差,计算公式如下:

[mu_c=frac{1}{HWT}Sigma_{i=1}^HSigma_{j=1}^WSigma_{t=1}^Tx_{c,ijt} ]

[sigma_c^2=frac{1}{HWT}Sigma_{i=1}^HSigma_{j=1}^WSigma_{t=1}^T(x_{c,ijt}-mu_c)^2 ]

c表示第c个通道,t表示batch里的第t个样本。其实计算的就是这个batch里所有特征图在通道c的平均值和方差。其值是常数,而不是矩阵。之后BN层对每个特征图做一个scale+shift的操作:

[z_c=gammafrac{x_c-mu_c}{sigma_c}+eta ]

缩放和平移因子(gamma)(beta)通过训练获得。以上是BN的处理过程,Instance Normalization唯一不同的地方是平均值和方差的计算,公式如下:

[mu_{c,t}=frac{1}{HW}Sigma_{i=1}^HSigma_{j=1}^Wx_{c,ij} ]

[sigma_{c,t}^2=frac{1}{HW}Sigma_{i=1}^HSigma_{j=1}^W(x_{c,ij}-mu_{c,t})^2 ]

可以看到,上面的平均值和方差都是针对单个特征图的,而不是整个batch内所有的特征图。也就是说,我在对图片A做风格转移时,我只考虑A本身的特征,避免受到batch内其他图像特征的影响。

对于该方法为什么有效,解释如下:风格转移的过程,就是要把风格图像的对比度转移到内容图像上,因此需要先去除内容图像本身的对比度。归一化操作其实就是在去除这种对比度,scale+shift则是将风格图像的对比度附加给内容图像。但是如果采用BN的操作,计算出来的平均值和方差是整个batch内所有图像的均值和方差,而对于单张图像而言,其本身的均值和方差才是最能反映它的对比度的,因此BN会导致对比度去除得不彻底。因此Instance Normalization更加有效。

一个模型,多种style

在以上几篇文章的基础上,谷歌又做了“一点微小的贡献”,使得一个模型可以产生多种风格的图像。再看一下归一化的处理:

[z=gammafrac{x-mu}{sigma}+eta ]

作者认为,不同风格之间的差异不在于卷积层上,而在于归一化过程的scale和shift上,也就是(gamma)(eta)这两个参数上。因此,不同风格可以共享同样的卷积层参数,只需要在(gamma)(eta)上扩展一个维度,让(gamma_n)(eta_n)对应第n((nin[0, N]))中风格即可,即:

[z_n=gamma_nfrac{x-mu}{sigma}+eta_n ]

最后的效果还是不错的:

原文地址:https://www.cnblogs.com/jiaxblog/p/9478769.html