神经网络风格转移

什么是风格转移

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

代价函数

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

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

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

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

\[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}^H\Sigma_{j=1}^W\Sigma_{t=1}^Tx_{c,ijt} \]

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

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

\[z_c=\gamma\frac{x_c-\mu_c}{\sigma_c}+\beta \]

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

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

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

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

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

一个模型,多种style

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

\[z=\gamma\frac{x-\mu}{\sigma}+\beta \]

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

\[z_n=\gamma_n\frac{x-\mu}{\sigma}+\beta_n \]

最后的效果还是不错的:

posted @ 2018-08-14 23:28  Jiax  阅读(1608)  评论(0编辑  收藏  举报