首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

风格迁移三部曲(二)之固定风格任意内容的快速风格迁移

重磅干货,第一时间送达

前言

风格迁移三部曲将绍以下三种风格迁移方式以及对应的代码实现

固定风格固定内容的普通风格迁移(A Neural Algorithm of Artistic Style)

固定风格任意内容的快速风格迁移(Perceptual Losses for Real-Time Style Transfer and Super-Resolution)

任意风格任意内容的极速风格迁移(Meta Networks for Neural Style Transfer)

上篇介绍了

风格迁移三部曲(一)之普通风格迁移

,本文将继续介绍第二种风格迁移方式:固定风格任意内容的快速风格迁移。

2 固定风格任意内容的快速风格迁移

有了上面文章风格迁移三部曲(一)之普通风格迁移的铺垫,理解固定风格任意内容的快速风格迁移就简单很多了。思路很简单,就是先搭建一个转换网络,然后通过优化转换网络的权值来实现快速风格迁移。由于这个转换网络可以接受任意图像,所以这是任意内容的风格迁移。

模型

模型结构很简单,分为三个部分:

降维,三层卷积层,逐渐提升通道数为128,并且通过 stride 把特征图的宽高缩小为原来的八分之一

5个 ResidualBlock 堆叠

升维,三层卷积层,逐渐降低通道数为3,并且通过 nn.Upsample 把特征图的宽高还原为原来的大小

先降维再升维是为了减少计算量,中间的 5 个 Residual 结构可以学习如何在原图上添加少量内容,改变原图的风格。下面让我们来看看代码。

ConvLayer

首先我们实现了一个函数,ConvLayer,它包含:

nn.Upsample(可选)

nn.ReflectionPad2d

nn.Conv2d

nn.InstanceNorm2d(可选)

nn.ReLU(可选)

因为每个卷积层前后都可能会用到这些层,为了简化代码,我们将它写成一个函数,返回这些层用于搭建模型。

ResidualBlock

这里写的就不是函数,而是一个类,因为它内部包含许多层,而且并不是简单的自上而下的结构(Sequential),而是有了跨层的连接(),所以我们需要继承 nn.Module,实现 forward 函数,才能实现跨层连接。

TransformNet

最后这个模型就很简单了,照着论文里给出的表格搭建即可。我们这里为了实验方便,添加了 base 参数,当时,卷积核的个数是按递增的,当时,卷积核个数是按递增的。有了这个参数,我们可以按需增加模型规模,base 越大,图像质量越好。

数据

训练的时候,我们使用了 COCO train 2014、val2014、test2014, 一共有 164k 图像,实际上原论文只用了训练集(80k)。图像宽高都是256。

We resize each of the 80k training images to 256 × 256 and train our networks with a batch size of 4 for 40,000 iterations, giving roughly two epochs over the training data.

返回:

其中的是为了使用 pytorch 自带的预训练模型,在官方文档中提到了要进行预处理

link:

https://pytorch.org/docs/master/torchvision/models.html

训练

超参数

虽然官方开源给出的是 5,但是我这里测试得并不理想,可能是不同的预训练权值、不同的预处理方式造成的差异,设置为 1e5 是比较理想的。

We use Adam [51] with a learning rate of 1 × 10−3.

优化器使用了论文中提到的 Adam 1e-3。

The output images are regularized with total variation regularization with a strength of between 1x10^-6 and 1x10^-4, chosen via cross-validation per style target.

感觉没有太大变化,所以按论文中给出的参考设置了 1e-6。

train our networks with a batch size of 4 for 40,000 iterations

按论文设置为了4。

由于我这里使用的图片变多了,所以为了保持和官方的训练 step 一致(40k),训练代数(epoch)设置为了1。

Total Variation

Total Variation Regularization. To encourage spatial smoothness in the output image , we follow prior work on feature inversion [6,20] and super- resolution [48,49] and make use of total variation regularizer .

论文中提到了一个 TV Loss,这是为了平滑图像。它的计算方法很简单:

图像水平和垂直平移一个像素,与原图相减,然后计算绝对值的和,就是 TotalVariation。

参考链接:

https://en.wikipedia.org/wiki/Total_variation_denoising

代码

由于代码太长,这里只贴一些关键代码:

通过对 loss 的优化,进而约束模型输出与内容图像的内容相似、与风格图像风格相似的图像,从而得到一个可以较快速度输出风格迁移图像的模型。

效果

最终效果如图所示:

S2

可以看到对于任意内容图片,转换网络都能转换为固定风格的图像。根据下面这段代码进行的测速,1080ti 可以在4.82秒内完成 1000 张图像的风格迁移,相当于207fps,可以说是具有了实时性:

但是整个模型的训练时间需要1小时54分钟,如果我们想做任意风格图像的风格迁移,这个时间几乎是不可接受的。

link: https://zhuanlan.zhihu.com/p/40322927

github: https://github.com/CortexFoundation/StyleTransferTrilogy

预告

下一篇风格迁移三部曲(三)会介绍任意风格任意内容的极速风格迁移方式以及对应的PyTorch0.4.0代码实现。敬请期待

欢迎给不接广告的Amusi

点文末广告和点赞么,比心

举手之劳

欢迎点击一下文末的广告和点赞,

这是相当于给Amusi加了鸡腿!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180801G01AT100?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券