【风格迁移系列二】Fast Patch-based Style Transfer of Arbitrary Style 论文解读
很久没有写博客了,最近遇到一篇论文 Fast Patch-based Style Transfer of Arbitrary Style 刚开始很难理解它的算法细节,结合代码渐渐理解了。由于自己学习时没有找到很好的博客参考,所以想将自己对算法的理解记录下来,以供大家参考。如果有理解不恰当的地方,还望批评指正。
1 Style-Swap & Parallelizable Implementation
论文首先简单介绍了Style-Swap,重点是下面这个求最近邻匹配的公式:
然后讲了他们的并行实现过程:
- 第一步:简化公式。注意到 对于 运算是常数,因此删除这一项并不影响最后的结果,最近邻匹配公式可以重新写为如下形式:
(公式应该很容易理解,不解释) - 第二步:卷积操作。可以看出公式 (2) 是点积运算,很容易想到利用卷积得到 ,把内容**块 当做输入,标准化的风格**块 当做卷积核,经过卷积操作即可得到 。不是很明白的可以看下面放出的图的左边来理解,其中最大的 “方块” 是通过 vgg 后得到的内容**块,然后将风格**块分成了四份,每一份是 3*3 大小,并且都经过了标准化。取卷积时的步长为1,每个标准化的风格**块对内容**块卷积后都可以得到 3*3 的结果,也就是图中左边最大的“方块”后面跟着的四个小 “方块”。
- 第三步:one-hot 编码。这个操作很容易理解,就是第二步中四个小 “方块” 最大的值令为1,其他的为0。(可能会有几个相同的最大值,就是有多个1的意思。可以理解为图中的黑色块为1,白色块为0)
- 第四步:转置卷积(反卷积)。这块不是很懂的先补补知识 一文搞懂反卷积,转置卷积 这步把公式(3)得到的结果当做输入,未标准化的风格**块当做反卷积核,那么只有最近邻匹配的风格块(值为1)会输出,其余的与0相乘不会输出。最后转置卷积会导致生成图像中出现棋盘效应 (在这里叫做overlap),棋盘效应不懂的可以看看这篇文章《Deconvolution and Checkerboard Artifacts》,因此最后还需要将转置卷积结果除以overlap的块数来平滑结果。
2 Optimization Formulation & Inverse Network
首先放上整个模型的图。很容易看出整个模型的一个风格迁移流程
- 卷积神经网络(vgg)计算特征图;
- 上述介绍的 style-swap;
- 将 style-swap 后的结果 feed 进 inv 网络(其实就是反卷积构成的decoder)。
inv 网络的目标函数是 :
其中 是经过上述风格迁移流程后得到的风格迁移结果, 是将得到的结果再通过 vgg 进行一次 encoder ,将得到的特征图与 style-swap 的结果计算特征重构损失。 后面的 如下式定义:
从式子的下标可以理解:就是 相邻上下的像素点之间的均方差和相邻左右的像素点之间的均方差之和。最小化这个损失,可以使得图片像素过渡得自然,更接近自然图像。
最后为了让 inv 网络可以对任意的目标图像直接转换,需要训练 inv 网络,目标函数如下:
公式(6)和(4)其实是一样的意思,将 理解为 style-swap 后的结果, 理解为 inv 网络。论文采用了COCO 作为内容数据集和 Wikiart 作为风格数据集来训练该网络,一旦训练完成,就可以实现快速的风格迁移。
3 Code
官方实现(torch):https://github.com/rtqichen/style-swap
非官方实现(pytorch):https://github.com/irasin/Pytorch_Style_Swap