风格迁移(二):快速风格迁移

上一篇博客详细介绍了风格迁移的基本思路,以及原始风格迁移的具体实现。从实现过程可以看出,原始风格迁移是一种固定风格固定内容的风格迁移方式,其速度效率比较慢。这里主要介绍李飞飞提出的一种固定风格任意内容的风格迁移方法,这种方法主要来自于她的这篇文章: Perceptual Losses for Real-Time Style Transfer and Super-Resolution,文章的地址在这里。这种方法的思路比较简单,就是在原始风格迁移的基础上,添加了一个转换网络,然后通过优化转换网络来实现快速风格迁移,生成风格迁移图片就是一个网络前向计算的过程,相比原始风格迁移,极大地提高了图像生成速度,而且由于这个转换网络可以接受任意内容图片,因此,这是一种任意内容的风格迁移。

网络结构

这里模型结构如上图所示,还是上一篇博客中使用的图片,上一篇博客只是为了形象说明,更好理解,将这篇论文中的图片放在上一篇博客中。好了,不说废话了。看模型结构图,整个网络结构分为两部分:转换网络(Image Transform Net)和损失网络(Loss Network)。损失网络是一个固定参数的pretrained VGG16。这里主要介绍转换网络(Image Transform Net)的网络结构。它的结构有点类似于Hourglass。转换网络结构如下图:

其网络结构的特点是

  • 先降维,使用三层卷积层,逐渐提升通道数,减小feature map大小;
  • 5个Residual Block 堆叠,期间不改变feature map的大小以及通道数;
  • 升维,使用反卷积,逐渐降低通道数为3,同时将feature map还原成输入大小;

熟悉了转换网络的结构,再来看一下整个网络结构的pipline。和原始风格迁移一样,同样需要设计Content loss和Style loss。根据最上面的那个网络结构图进行分析。

内容 Content loss

Content loss主要是用来约束$f_w$的语义信息以及空间结构。Content loss计算步骤如下:
(1)x表示输入图片,和原始风格迁移方法一样,将content image作为输入图片,x=content image。将content image输入到loss network中,提取relu3_3层的ContentFeatures。
(2)将转换网络的输出f(x)作为loss network的输入,同样提取relu3_3层的特征FeaturesX。
(3)计算两种特征之间的均方误差作为content loss。
使用不同层的重建效果如下:

风格 style loss

style loss主要是用来约束$f_w$的风格。style loss的计算步骤如下:
(1)将style image输入到loss network,提取relu1,relu2,relu3,relu4层的特征作为 StyleFeatures;
(2)将转换网络的输出f(x)作为loss network的输入,同样提取4层的特征作为FeaturesY;
(3)对上面提取的两个特征StyleFeatures和FeaturesY分别计算Gram矩阵,style loss即为两个gram矩阵的均方误差;
使用不同层的风格重建效果如下:

最终loss为Content loss和style loss的加权和,通过对 loss 的优化,不断更新Image Transform Net权值参数,进而约束模型输出与内容图像的内容相似、与风格图像风格相似的图像,从而得到一个可以较快速度输出风格迁移图像的模型。通过Image Transform Net的前向计算就可以生成一张风格迁移图片,由于只需要进行一次前向计算,因此速度特别快。

代码

这个代码,pytorch官网有提供,在这里,代码比较简单,如果理解了上一篇博客的具体实现,这个官网的理解就比较容易。下面是官网给出的使用四种风格的图片训练得到的四种模型最终风格迁移的效果图:

最后

在李飞飞那篇文章中,提到这个网络结构还可以用来生成高分辨率图片,对于超分辨来说,输入图像 x 是一个低分辨率的图像,the content target yc 是一个gt高分辨率的图像,style reconstruction loss 没有用到。对于一种超分辨的因子,我们就训练一种网络。