重磅干货,第一时间送达
前言
风格迁移三部曲将绍以下三种风格迁移方式以及对应的代码实现
固定风格固定内容的普通风格迁移(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加了鸡腿!
领取专属 10元无门槛券
私享最新 技术干货